bways-report 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -464
- package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
- package/esm2022/lib/core/index.mjs +2 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
- package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
- package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
- package/esm2022/lib/data-access/adapters/index.mjs +8 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
- package/esm2022/lib/features/designer/designer.component.mjs +43 -2
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
- package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
- package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
- package/esm2022/lib/features/embed/index.mjs +5 -0
- package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
- package/esm2022/lib/features/index.mjs +2 -1
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
- package/esm2022/lib/features/routing/index.mjs +2 -2
- package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
- package/esm2022/lib/features/routing/report-routes.mjs +42 -1
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
- package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
- package/esm2022/lib/provide-reporting.mjs +137 -7
- package/fesm2022/bways-report.mjs +4053 -840
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +161 -0
- package/lib/core/index.d.ts +1 -0
- package/lib/core/models/report-definition.model.d.ts +16 -0
- package/lib/core/services/report-session-context.service.d.ts +1 -0
- package/lib/core/tokens/reporting-config.token.d.ts +16 -0
- package/lib/core/utils/data-normalization.util.d.ts +10 -0
- package/lib/core/utils/report-parameter.util.d.ts +18 -1
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
- package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
- package/lib/data-access/adapters/index.d.ts +7 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
- package/lib/features/designer/designer.component.d.ts +4 -0
- package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
- package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
- package/lib/features/embed/bways-report-page.component.d.ts +61 -0
- package/lib/features/embed/index.d.ts +4 -0
- package/lib/features/embed/inject-report-menu.d.ts +44 -0
- package/lib/features/index.d.ts +1 -0
- package/lib/features/persistence/services/report-store.service.d.ts +5 -0
- package/lib/features/routing/index.d.ts +1 -1
- package/lib/features/routing/models/report-route.models.d.ts +3 -0
- package/lib/features/routing/report-routes.d.ts +40 -0
- package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
- package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
- package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
- package/lib/provide-reporting.d.ts +22 -6
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { ReportSchemaDiscoveryAdapter, } from '../../../../data-access/contracts/schema-discovery.contract';
|
|
@@ -7,6 +7,7 @@ import { toFieldKey } from '../../../../core/utils/report-parameter.util';
|
|
|
7
7
|
import { ReportSessionContextService } from '../../../../core/services/report-session-context.service';
|
|
8
8
|
import { DesignerStateService } from '../../services/designer-state.service';
|
|
9
9
|
import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
|
|
10
|
+
import { RptSearchableSelectComponent, } from '../../../../primitives/components';
|
|
10
11
|
import { ParameterBindingEditorComponent } from './parameter-binding-editor.component';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
import * as i1 from "@angular/forms";
|
|
@@ -14,11 +15,14 @@ export class PropertyEditorDatasourceComponent {
|
|
|
14
15
|
discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });
|
|
15
16
|
sessionService = inject(ReportSessionContextService, { optional: true });
|
|
16
17
|
designerState = inject(DesignerStateService, { optional: true });
|
|
18
|
+
lastLoadedKey = '';
|
|
19
|
+
columnsSub;
|
|
20
|
+
paramsSub;
|
|
17
21
|
comp = input.required();
|
|
18
22
|
allComponents = input([]);
|
|
19
23
|
updateDataSource = output();
|
|
20
24
|
updateProperty = output();
|
|
21
|
-
isAdvancedMode = signal(
|
|
25
|
+
isAdvancedMode = signal(true);
|
|
22
26
|
isLoadingEntities = signal(false);
|
|
23
27
|
allEntities = signal([]);
|
|
24
28
|
entityColumns = signal([]);
|
|
@@ -70,18 +74,75 @@ export class PropertyEditorDatasourceComponent {
|
|
|
70
74
|
{ key: '2', label: 'Option 2' },
|
|
71
75
|
];
|
|
72
76
|
});
|
|
77
|
+
procedureSelectOptions = computed(() => {
|
|
78
|
+
const isAdv = this.isAdvancedMode();
|
|
79
|
+
return this.availableProcedures().map((sp) => ({
|
|
80
|
+
value: sp.name,
|
|
81
|
+
label: isAdv ? `${sp.schema || 'dbo'}.${sp.name}` : sp.displayName,
|
|
82
|
+
sublabel: isAdv ? (sp.displayName !== sp.name ? sp.displayName : undefined) : `${sp.schema || 'dbo'}.${sp.name}`,
|
|
83
|
+
badge: sp.category || 'SP',
|
|
84
|
+
}));
|
|
85
|
+
});
|
|
86
|
+
tableSelectOptions = computed(() => {
|
|
87
|
+
const isAdv = this.isAdvancedMode();
|
|
88
|
+
return this.availableTables().map((tbl) => ({
|
|
89
|
+
value: tbl.name,
|
|
90
|
+
label: isAdv ? `${tbl.schema || 'dbo'}.${tbl.name}` : tbl.displayName,
|
|
91
|
+
sublabel: isAdv ? (tbl.displayName !== tbl.name ? tbl.displayName : undefined) : `${tbl.schema || 'dbo'}.${tbl.name}`,
|
|
92
|
+
badge: tbl.type || 'Table',
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
displayFieldSelectOptions = computed(() => {
|
|
96
|
+
return this.entityColumns().map((col) => ({
|
|
97
|
+
value: col.field,
|
|
98
|
+
label: col.label || col.field,
|
|
99
|
+
sublabel: col.field !== col.label ? col.field : undefined,
|
|
100
|
+
badge: col.dataType || undefined,
|
|
101
|
+
}));
|
|
102
|
+
});
|
|
103
|
+
valueFieldSelectOptions = computed(() => {
|
|
104
|
+
return this.entityColumns().map((col) => ({
|
|
105
|
+
value: col.field,
|
|
106
|
+
label: col.label || col.field,
|
|
107
|
+
sublabel: col.field !== col.label ? col.field : undefined,
|
|
108
|
+
badge: col.dataType || undefined,
|
|
109
|
+
}));
|
|
110
|
+
});
|
|
111
|
+
parentFieldSelectOptions = computed(() => {
|
|
112
|
+
return this.availableParentFields().map((c) => ({
|
|
113
|
+
value: c.key || c.id,
|
|
114
|
+
label: c.label || c.key || c.id,
|
|
115
|
+
sublabel: c.key || c.id,
|
|
116
|
+
badge: c.type,
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
73
119
|
constructor() {
|
|
74
120
|
effect(() => {
|
|
75
121
|
const entity = this.selectedEntity();
|
|
76
122
|
const type = this.currentSourceType();
|
|
123
|
+
const key = `${type}:${entity}`;
|
|
77
124
|
if (entity && (type === 'table' || type === 'procedure')) {
|
|
78
|
-
this.
|
|
125
|
+
if (this.lastLoadedKey !== key) {
|
|
126
|
+
this.lastLoadedKey = key;
|
|
127
|
+
untracked(() => this.loadEntityDetails(entity, type));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.lastLoadedKey = '';
|
|
132
|
+
this.columnsSub?.unsubscribe();
|
|
133
|
+
this.paramsSub?.unsubscribe();
|
|
134
|
+
this.entityColumns.set([]);
|
|
135
|
+
this.procedureParameters.set([]);
|
|
79
136
|
}
|
|
80
137
|
}, { allowSignalWrites: true });
|
|
81
138
|
}
|
|
82
139
|
ngOnInit() {
|
|
83
140
|
this.loadEntities();
|
|
84
141
|
}
|
|
142
|
+
ngOnDestroy() {
|
|
143
|
+
this.columnsSub?.unsubscribe();
|
|
144
|
+
this.paramsSub?.unsubscribe();
|
|
145
|
+
}
|
|
85
146
|
loadEntities() {
|
|
86
147
|
if (!this.discoveryAdapter)
|
|
87
148
|
return;
|
|
@@ -100,34 +161,41 @@ export class PropertyEditorDatasourceComponent {
|
|
|
100
161
|
loadEntityDetails(entityName, type) {
|
|
101
162
|
if (!this.discoveryAdapter)
|
|
102
163
|
return;
|
|
164
|
+
this.columnsSub?.unsubscribe();
|
|
165
|
+
this.paramsSub?.unsubscribe();
|
|
103
166
|
const dbType = type === 'procedure' ? 'stored_procedure' : 'table';
|
|
104
|
-
this.discoveryAdapter.getColumns(entityName, 'dbo', dbType).subscribe({
|
|
167
|
+
this.columnsSub = this.discoveryAdapter.getColumns(entityName, 'dbo', dbType).subscribe({
|
|
105
168
|
next: (cols) => {
|
|
106
|
-
|
|
169
|
+
const safeCols = cols || [];
|
|
170
|
+
this.entityColumns.set(safeCols);
|
|
107
171
|
// Auto-detect default valueField and displayField if not yet set
|
|
108
172
|
const currentVal = this.selectedValueField();
|
|
109
173
|
const currentDisp = this.selectedDisplayField();
|
|
110
|
-
const suggestedVal = detectDefaultValueField(
|
|
111
|
-
const suggestedDisp = detectDefaultDisplayField(
|
|
112
|
-
|
|
174
|
+
const suggestedVal = detectDefaultValueField(safeCols);
|
|
175
|
+
const suggestedDisp = detectDefaultDisplayField(safeCols);
|
|
176
|
+
const nextVal = currentVal || suggestedVal || safeCols[0]?.field || '';
|
|
177
|
+
const nextDisp = currentDisp || suggestedDisp || safeCols[1]?.field || safeCols[0]?.field || '';
|
|
178
|
+
// Only emit if we actually detected a non-empty field that differs from current state
|
|
179
|
+
if ((nextVal !== currentVal || nextDisp !== currentDisp) && (nextVal || nextDisp)) {
|
|
113
180
|
this.updateDataSource.emit({
|
|
114
181
|
...(this.comp().dataSource ?? { displayField: '', valueField: '' }),
|
|
115
182
|
sourceType: type,
|
|
116
183
|
entityName,
|
|
117
|
-
valueField:
|
|
118
|
-
displayField:
|
|
184
|
+
valueField: nextVal,
|
|
185
|
+
displayField: nextDisp,
|
|
119
186
|
});
|
|
120
187
|
}
|
|
121
188
|
},
|
|
122
189
|
error: (err) => console.error(`[PropertyEditorDatasource] Failed to load columns for ${entityName}:`, err),
|
|
123
190
|
});
|
|
124
191
|
if (type === 'procedure') {
|
|
125
|
-
this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({
|
|
192
|
+
this.paramsSub = this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({
|
|
126
193
|
next: (params) => {
|
|
127
|
-
|
|
194
|
+
const safeParams = params || [];
|
|
195
|
+
this.procedureParameters.set(safeParams);
|
|
128
196
|
// Only auto-link to existing session or existing canvas fields.
|
|
129
197
|
// NEVER mutate canvas or create new components automatically!
|
|
130
|
-
this.autoLinkExistingParameters(
|
|
198
|
+
this.autoLinkExistingParameters(safeParams);
|
|
131
199
|
},
|
|
132
200
|
error: (err) => console.error(`[PropertyEditorDatasource] Failed to load params for ${entityName}:`, err),
|
|
133
201
|
});
|
|
@@ -187,10 +255,17 @@ export class PropertyEditorDatasourceComponent {
|
|
|
187
255
|
}
|
|
188
256
|
}
|
|
189
257
|
if (changed) {
|
|
190
|
-
this.
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
258
|
+
const existingMappings = this.comp().dataSource?.parameterMappings ?? {};
|
|
259
|
+
const keysA = Object.keys(currentMappings);
|
|
260
|
+
const keysB = Object.keys(existingMappings);
|
|
261
|
+
const isDifferent = keysA.length !== keysB.length ||
|
|
262
|
+
keysA.some((k) => currentMappings[k] !== existingMappings[k]);
|
|
263
|
+
if (isDifferent) {
|
|
264
|
+
this.updateDataSource.emit({
|
|
265
|
+
...(this.comp().dataSource ?? { displayField: '', valueField: '' }),
|
|
266
|
+
parameterMappings: currentMappings,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
194
269
|
}
|
|
195
270
|
}
|
|
196
271
|
/**
|
|
@@ -290,6 +365,11 @@ export class PropertyEditorDatasourceComponent {
|
|
|
290
365
|
}
|
|
291
366
|
setSourceType(type) {
|
|
292
367
|
if (type === 'static') {
|
|
368
|
+
this.lastLoadedKey = '';
|
|
369
|
+
this.columnsSub?.unsubscribe();
|
|
370
|
+
this.paramsSub?.unsubscribe();
|
|
371
|
+
this.entityColumns.set([]);
|
|
372
|
+
this.procedureParameters.set([]);
|
|
293
373
|
this.updateDataSource.emit({
|
|
294
374
|
sourceType: 'static',
|
|
295
375
|
displayField: '',
|
|
@@ -305,6 +385,7 @@ export class PropertyEditorDatasourceComponent {
|
|
|
305
385
|
const isValidForType = type === 'table'
|
|
306
386
|
? this.availableTables().some((t) => t.name === currentEntity)
|
|
307
387
|
: this.availableProcedures().some((p) => p.name === currentEntity);
|
|
388
|
+
this.lastLoadedKey = '';
|
|
308
389
|
this.updateDataSource.emit({
|
|
309
390
|
sourceType: type,
|
|
310
391
|
entityName: isValidForType ? (currentEntity || '') : '',
|
|
@@ -316,6 +397,9 @@ export class PropertyEditorDatasourceComponent {
|
|
|
316
397
|
}
|
|
317
398
|
onEntitySelected(entityName) {
|
|
318
399
|
const isDifferent = entityName !== this.comp().dataSource?.entityName;
|
|
400
|
+
if (isDifferent) {
|
|
401
|
+
this.lastLoadedKey = '';
|
|
402
|
+
}
|
|
319
403
|
this.updateDataSource.emit({
|
|
320
404
|
...(this.comp().dataSource ?? { displayField: '', valueField: '' }),
|
|
321
405
|
sourceType: this.currentSourceType(),
|
|
@@ -392,10 +476,16 @@ export class PropertyEditorDatasourceComponent {
|
|
|
392
476
|
this.updateProperty.emit({ key: 'options', value: current });
|
|
393
477
|
}
|
|
394
478
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorDatasourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
395
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorDatasourceComponent, isStandalone: true, selector: "rpt-property-editor-datasource", inputs: { comp: { classPropertyName: "comp", publicName: "comp", isSignal: true, isRequired: true, transformFunction: null }, allComponents: { classPropertyName: "allComponents", publicName: "allComponents", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updateDataSource: "updateDataSource", updateProperty: "updateProperty" }, ngImport: i0, template: " <div class=\"property-group\">\n <!-- 1. Header with Simple / Advanced Mode Toggle -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n <div class=\"mode-toggle-pill\">\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"!isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(false)\"\n title=\"Simplified view for business users with friendly names\"\n >\n Simple\n </button>\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(true)\"\n title=\"Technical view with SQL types and expressions\"\n >\n Advanced\n </button>\n </div>\n </div>\n\n <div class=\"datasource-guidance-card\">\n <rpt-icon name=\"info\" [size]=\"12\" />\n <span>Populates selectable choices in this dropdown filter. For the report's main data and result grid, use the <strong>Grid</strong> tab.</span>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Table / View' : 'Database Table' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Stored Proc' : 'Data Query' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Database Table / View' : 'Select Data Source' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading tables from database...</option>\n } @else if (availableTables().length === 0) {\n <option value=\"\">-- No tables found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Table --</option>\n }\n @for (tbl of availableTables(); track tbl.name) {\n <option [value]=\"tbl.name\">\n @if (isAdvancedMode()) {\n {{ tbl.schema }}.{{ tbl.name }} ({{ tbl.type }})\n } @else {\n {{ tbl.displayName }}{{ tbl.category ? ' \u2022 ' + tbl.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (Visible Text)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for text label\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (Stored Key)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for primary ID\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Dependent On (Cascading Parent Field)' : 'Filter by Another Field' }}\n </label>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n >\n <option value=\"\">-- None (Independent) --</option>\n @for (other of availableParentFields(); track other.key || other.id) {\n <option [value]=\"other.key || other.id\">{{ other.label || other.key }}</option>\n }\n </select>\n <span class=\"field-hint\">\n {{ isAdvancedMode() ? 'Automatically re-queries options when parent field changes.' : 'Only loads options when the selected field changes.' }}\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Stored Procedure' : 'Select Data Procedure' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading stored procedures from database...</option>\n } @else if (availableProcedures().length === 0) {\n <option value=\"\">-- No stored procedures found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Query / SP --</option>\n }\n @for (sp of availableProcedures(); track sp.name) {\n <option [value]=\"sp.name\">\n @if (isAdvancedMode()) {\n {{ sp.schema }}.{{ sp.name }}\n } @else {\n {{ sp.displayName }}{{ sp.category ? ' \u2022 ' + sp.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Procedure Input Parameters' : 'Filter Inputs & Parameters' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-auto-params\"\n (click)=\"autoWireAllParameters()\"\n title=\"Auto-detect session parameters and add missing filter controls to the canvas\"\n >\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Auto-Wire Canvas Inputs</span>\n </button>\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"isAdvancedMode()\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (from SP result)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n @if (entityColumns().length > 0) {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n />\n }\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (from SP result)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n @if (entityColumns().length > 0) {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n />\n }\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".datasource-header-bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mode-toggle-pill{display:inline-flex;background:#e2e8f0;border-radius:12px;padding:2px;gap:2px}.pill-btn{border:none;background:transparent;padding:2px 8px;font-size:.65rem;font-weight:500;color:#64748b;border-radius:10px;cursor:pointer;transition:all .12s ease}.pill-btn:hover{color:#0f172a}.pill-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;box-shadow:0 1px 2px #00000014}.datasource-guidance-card{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;color:#1e40af;font-size:.675rem;padding:6px 8px;border-radius:6px;margin-bottom:8px;line-height:1.35}.source-type-switcher{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:2px;gap:2px;margin-bottom:6px}.source-tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:6px 4px;font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease}.source-tab-btn:hover{color:var(--rpt-color-text, #0f172a)}.source-tab-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0000000d}.btn-refresh-entities{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--rpt-color-primary, #2563eb);font-size:.65rem;font-weight:600;cursor:pointer;padding:0}.btn-refresh-entities:hover{text-decoration:underline}.btn-auto-params{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-auto-params:hover{background:#2563eb;color:#fff}.auto-badge{font-size:.62rem;font-weight:600;background:#dcfce7;color:#166534;padding:1px 5px;border-radius:4px}.field-hint{font-size:.65rem;color:var(--rpt-color-text-muted, #94a3b8);margin-top:2px}.sp-params-group{display:flex;flex-direction:column;gap:6px;background:#f8fafc;padding:8px;border-radius:6px;border:1px solid #e2e8f0;margin-bottom:6px}.params-header-row{display:flex;align-items:center;justify-content:space-between}.params-hint{font-size:.64rem;color:#64748b;font-style:italic}.static-options-wrapper{display:flex;flex-direction:column;gap:8px}.static-options-header{display:flex;align-items:center;justify-content:space-between}.btn-add-option{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;border-radius:4px;padding:3px 8px;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .12s ease}.btn-add-option:hover{background:#eff6ff}.static-options-list{display:flex;flex-direction:column;gap:6px}.static-option-row{display:flex;align-items:center;gap:6px}.opt-key{flex:1}.opt-label{flex:1.5}.btn-remove-option{width:24px;height:24px;border:none;background:transparent;color:#94a3b8;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .12s ease}.btn-remove-option:hover{background:#fee2e2;color:#ef4444}.field-input{width:100%;padding:6px 8px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);box-sizing:border-box;outline:none;transition:border-color .12s ease}.field-input:focus{border-color:var(--rpt-color-primary, #2563eb)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: ParameterBindingEditorComponent, selector: "rpt-parameter-binding-editor", inputs: ["param", "currentValue", "allComponents", "currentComponentId", "isAdvancedMode"], outputs: ["valueChange", "linkedFieldChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
479
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorDatasourceComponent, isStandalone: true, selector: "rpt-property-editor-datasource", inputs: { comp: { classPropertyName: "comp", publicName: "comp", isSignal: true, isRequired: true, transformFunction: null }, allComponents: { classPropertyName: "allComponents", publicName: "allComponents", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updateDataSource: "updateDataSource", updateProperty: "updateProperty" }, ngImport: i0, template: " <div class=\"property-group\">\n <!-- 1. Header -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>Table / View</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>Stored Proc</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Database Table / View</label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <rpt-searchable-select\n [options]=\"tableSelectOptions()\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n [loading]=\"isLoadingEntities()\"\n [loadingText]=\"'Loading tables from database...'\"\n [placeholder]=\"availableTables().length === 0 ? '-- No tables found (Click Refresh) --' : '-- Choose Data Table --'\"\n searchPlaceholder=\"Search tables & views...\"\n />\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Display Field (Visible Text)</label>\n </div>\n <rpt-searchable-select\n [options]=\"displayFieldSelectOptions()\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n placeholder=\"-- Select Display Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Value Field (Stored Key)</label>\n </div>\n <rpt-searchable-select\n [options]=\"valueFieldSelectOptions()\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n placeholder=\"-- Select Key Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">Dependent On (Cascading Parent Field)</label>\n <rpt-searchable-select\n [options]=\"parentFieldSelectOptions()\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n placeholder=\"-- None (Independent) --\"\n searchPlaceholder=\"Search canvas fields...\"\n />\n <span class=\"field-hint\">\n Automatically re-queries options when parent field changes.\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Stored Procedure</label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <rpt-searchable-select\n [options]=\"procedureSelectOptions()\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n [loading]=\"isLoadingEntities()\"\n [loadingText]=\"'Loading stored procedures from database...'\"\n [placeholder]=\"availableProcedures().length === 0 ? '-- No stored procedures found (Click Refresh) --' : '-- Choose Data Query / SP --'\"\n searchPlaceholder=\"Search stored procedures...\"\n />\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">Procedure Input Parameters</label>\n <button\n type=\"button\"\n class=\"btn-auto-params\"\n (click)=\"autoWireAllParameters()\"\n title=\"Auto-detect session parameters and add missing filter controls to the canvas\"\n >\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Auto-Wire Canvas Inputs</span>\n </button>\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"true\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Display Field (from SP result)</label>\n </div>\n @if (entityColumns().length > 0) {\n <rpt-searchable-select\n [options]=\"displayFieldSelectOptions()\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n placeholder=\"-- Select Display Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n />\n }\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Value Field (from SP result)</label>\n </div>\n @if (entityColumns().length > 0) {\n <rpt-searchable-select\n [options]=\"valueFieldSelectOptions()\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n placeholder=\"-- Select Key Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n />\n }\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button,.field-input[type=number]::-webkit-inner-spin-button,.field-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number],.field-input[type=number]{-moz-appearance:textfield;appearance:textfield}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".datasource-header-bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mode-toggle-pill{display:inline-flex;background:#e2e8f0;border-radius:12px;padding:2px;gap:2px}.pill-btn{border:none;background:transparent;padding:2px 8px;font-size:.65rem;font-weight:500;color:#64748b;border-radius:10px;cursor:pointer;transition:all .12s ease}.pill-btn:hover{color:#0f172a}.pill-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;box-shadow:0 1px 2px #00000014}.datasource-guidance-card{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;color:#1e40af;font-size:.675rem;padding:6px 8px;border-radius:6px;margin-bottom:8px;line-height:1.35}.source-type-switcher{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:2px;gap:2px;margin-bottom:6px}.source-tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:6px 4px;font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease}.source-tab-btn:hover{color:var(--rpt-color-text, #0f172a)}.source-tab-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0000000d}.btn-refresh-entities{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--rpt-color-primary, #2563eb);font-size:.65rem;font-weight:600;cursor:pointer;padding:0}.btn-refresh-entities:hover{text-decoration:underline}.btn-auto-params{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-auto-params:hover{background:#2563eb;color:#fff}.auto-badge{font-size:.62rem;font-weight:600;background:#dcfce7;color:#166534;padding:1px 5px;border-radius:4px}.field-hint{font-size:.65rem;color:var(--rpt-color-text-muted, #94a3b8);margin-top:2px}.sp-params-group{display:flex;flex-direction:column;gap:8px;background:transparent;padding:0;border:none;margin-bottom:12px}.params-header-row{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px;border-bottom:1px solid #e2e8f0;margin-bottom:2px}.params-hint{font-size:.64rem;color:#64748b;font-style:italic}.static-options-wrapper{display:flex;flex-direction:column;gap:8px}.static-options-header{display:flex;align-items:center;justify-content:space-between}.btn-add-option{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;border-radius:4px;padding:3px 8px;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .12s ease}.btn-add-option:hover{background:#eff6ff}.static-options-list{display:flex;flex-direction:column;gap:6px}.static-option-row{display:flex;align-items:center;gap:6px}.opt-key{flex:1}.opt-label{flex:1.5}.btn-remove-option{width:24px;height:24px;border:none;background:transparent;color:#94a3b8;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .12s ease}.btn-remove-option:hover{background:#fee2e2;color:#ef4444}.field-input{width:100%;padding:6px 8px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);box-sizing:border-box;outline:none;transition:border-color .12s ease}.field-input:focus{border-color:var(--rpt-color-primary, #2563eb)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: ParameterBindingEditorComponent, selector: "rpt-parameter-binding-editor", inputs: ["param", "currentValue", "allComponents", "currentComponentId", "isAdvancedMode"], outputs: ["valueChange", "linkedFieldChange"] }, { kind: "component", type: RptSearchableSelectComponent, selector: "rpt-searchable-select", inputs: ["options", "value", "placeholder", "searchPlaceholder", "disabled", "loading", "loadingText", "emptyText", "clearable", "searchable", "size", "id", "ariaLabel", "valueKey", "labelKey", "sublabelKey", "badgeKey", "panelMaxHeight", "openAbove"], outputs: ["valueChange", "selectionChange", "opened", "closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
396
480
|
}
|
|
397
481
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorDatasourceComponent, decorators: [{
|
|
398
482
|
type: Component,
|
|
399
|
-
args: [{ selector: 'rpt-property-editor-datasource', standalone: true, imports: [CommonModule, FormsModule, RptIconComponent, ParameterBindingEditorComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"property-group\">\n <!-- 1. Header with Simple / Advanced Mode Toggle -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n <div class=\"mode-toggle-pill\">\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"!isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(false)\"\n title=\"Simplified view for business users with friendly names\"\n >\n Simple\n </button>\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(true)\"\n title=\"Technical view with SQL types and expressions\"\n >\n Advanced\n </button>\n </div>\n </div>\n\n <div class=\"datasource-guidance-card\">\n <rpt-icon name=\"info\" [size]=\"12\" />\n <span>Populates selectable choices in this dropdown filter. For the report's main data and result grid, use the <strong>Grid</strong> tab.</span>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Table / View' : 'Database Table' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Stored Proc' : 'Data Query' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Database Table / View' : 'Select Data Source' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading tables from database...</option>\n } @else if (availableTables().length === 0) {\n <option value=\"\">-- No tables found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Table --</option>\n }\n @for (tbl of availableTables(); track tbl.name) {\n <option [value]=\"tbl.name\">\n @if (isAdvancedMode()) {\n {{ tbl.schema }}.{{ tbl.name }} ({{ tbl.type }})\n } @else {\n {{ tbl.displayName }}{{ tbl.category ? ' \u2022 ' + tbl.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (Visible Text)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for text label\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (Stored Key)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for primary ID\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Dependent On (Cascading Parent Field)' : 'Filter by Another Field' }}\n </label>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n >\n <option value=\"\">-- None (Independent) --</option>\n @for (other of availableParentFields(); track other.key || other.id) {\n <option [value]=\"other.key || other.id\">{{ other.label || other.key }}</option>\n }\n </select>\n <span class=\"field-hint\">\n {{ isAdvancedMode() ? 'Automatically re-queries options when parent field changes.' : 'Only loads options when the selected field changes.' }}\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Stored Procedure' : 'Select Data Procedure' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading stored procedures from database...</option>\n } @else if (availableProcedures().length === 0) {\n <option value=\"\">-- No stored procedures found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Query / SP --</option>\n }\n @for (sp of availableProcedures(); track sp.name) {\n <option [value]=\"sp.name\">\n @if (isAdvancedMode()) {\n {{ sp.schema }}.{{ sp.name }}\n } @else {\n {{ sp.displayName }}{{ sp.category ? ' \u2022 ' + sp.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Procedure Input Parameters' : 'Filter Inputs & Parameters' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-auto-params\"\n (click)=\"autoWireAllParameters()\"\n title=\"Auto-detect session parameters and add missing filter controls to the canvas\"\n >\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Auto-Wire Canvas Inputs</span>\n </button>\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"isAdvancedMode()\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (from SP result)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n @if (entityColumns().length > 0) {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n />\n }\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (from SP result)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n @if (entityColumns().length > 0) {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n />\n }\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".datasource-header-bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mode-toggle-pill{display:inline-flex;background:#e2e8f0;border-radius:12px;padding:2px;gap:2px}.pill-btn{border:none;background:transparent;padding:2px 8px;font-size:.65rem;font-weight:500;color:#64748b;border-radius:10px;cursor:pointer;transition:all .12s ease}.pill-btn:hover{color:#0f172a}.pill-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;box-shadow:0 1px 2px #00000014}.datasource-guidance-card{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;color:#1e40af;font-size:.675rem;padding:6px 8px;border-radius:6px;margin-bottom:8px;line-height:1.35}.source-type-switcher{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:2px;gap:2px;margin-bottom:6px}.source-tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:6px 4px;font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease}.source-tab-btn:hover{color:var(--rpt-color-text, #0f172a)}.source-tab-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0000000d}.btn-refresh-entities{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--rpt-color-primary, #2563eb);font-size:.65rem;font-weight:600;cursor:pointer;padding:0}.btn-refresh-entities:hover{text-decoration:underline}.btn-auto-params{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-auto-params:hover{background:#2563eb;color:#fff}.auto-badge{font-size:.62rem;font-weight:600;background:#dcfce7;color:#166534;padding:1px 5px;border-radius:4px}.field-hint{font-size:.65rem;color:var(--rpt-color-text-muted, #94a3b8);margin-top:2px}.sp-params-group{display:flex;flex-direction:column;gap:6px;background:#f8fafc;padding:8px;border-radius:6px;border:1px solid #e2e8f0;margin-bottom:6px}.params-header-row{display:flex;align-items:center;justify-content:space-between}.params-hint{font-size:.64rem;color:#64748b;font-style:italic}.static-options-wrapper{display:flex;flex-direction:column;gap:8px}.static-options-header{display:flex;align-items:center;justify-content:space-between}.btn-add-option{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;border-radius:4px;padding:3px 8px;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .12s ease}.btn-add-option:hover{background:#eff6ff}.static-options-list{display:flex;flex-direction:column;gap:6px}.static-option-row{display:flex;align-items:center;gap:6px}.opt-key{flex:1}.opt-label{flex:1.5}.btn-remove-option{width:24px;height:24px;border:none;background:transparent;color:#94a3b8;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .12s ease}.btn-remove-option:hover{background:#fee2e2;color:#ef4444}.field-input{width:100%;padding:6px 8px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);box-sizing:border-box;outline:none;transition:border-color .12s ease}.field-input:focus{border-color:var(--rpt-color-primary, #2563eb)}\n"] }]
|
|
483
|
+
args: [{ selector: 'rpt-property-editor-datasource', standalone: true, imports: [
|
|
484
|
+
CommonModule,
|
|
485
|
+
FormsModule,
|
|
486
|
+
RptIconComponent,
|
|
487
|
+
ParameterBindingEditorComponent,
|
|
488
|
+
RptSearchableSelectComponent,
|
|
489
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"property-group\">\n <!-- 1. Header -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>Table / View</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>Stored Proc</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Database Table / View</label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <rpt-searchable-select\n [options]=\"tableSelectOptions()\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n [loading]=\"isLoadingEntities()\"\n [loadingText]=\"'Loading tables from database...'\"\n [placeholder]=\"availableTables().length === 0 ? '-- No tables found (Click Refresh) --' : '-- Choose Data Table --'\"\n searchPlaceholder=\"Search tables & views...\"\n />\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Display Field (Visible Text)</label>\n </div>\n <rpt-searchable-select\n [options]=\"displayFieldSelectOptions()\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n placeholder=\"-- Select Display Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Value Field (Stored Key)</label>\n </div>\n <rpt-searchable-select\n [options]=\"valueFieldSelectOptions()\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n placeholder=\"-- Select Key Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">Dependent On (Cascading Parent Field)</label>\n <rpt-searchable-select\n [options]=\"parentFieldSelectOptions()\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n placeholder=\"-- None (Independent) --\"\n searchPlaceholder=\"Search canvas fields...\"\n />\n <span class=\"field-hint\">\n Automatically re-queries options when parent field changes.\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Stored Procedure</label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <rpt-searchable-select\n [options]=\"procedureSelectOptions()\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n [loading]=\"isLoadingEntities()\"\n [loadingText]=\"'Loading stored procedures from database...'\"\n [placeholder]=\"availableProcedures().length === 0 ? '-- No stored procedures found (Click Refresh) --' : '-- Choose Data Query / SP --'\"\n searchPlaceholder=\"Search stored procedures...\"\n />\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">Procedure Input Parameters</label>\n <button\n type=\"button\"\n class=\"btn-auto-params\"\n (click)=\"autoWireAllParameters()\"\n title=\"Auto-detect session parameters and add missing filter controls to the canvas\"\n >\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Auto-Wire Canvas Inputs</span>\n </button>\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"true\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Display Field (from SP result)</label>\n </div>\n @if (entityColumns().length > 0) {\n <rpt-searchable-select\n [options]=\"displayFieldSelectOptions()\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n placeholder=\"-- Select Display Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n />\n }\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Value Field (from SP result)</label>\n </div>\n @if (entityColumns().length > 0) {\n <rpt-searchable-select\n [options]=\"valueFieldSelectOptions()\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n placeholder=\"-- Select Key Column --\"\n searchPlaceholder=\"Search columns...\"\n />\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Column name (leave blank for auto)\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n />\n }\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button,.field-input[type=number]::-webkit-inner-spin-button,.field-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number],.field-input[type=number]{-moz-appearance:textfield;appearance:textfield}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".datasource-header-bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mode-toggle-pill{display:inline-flex;background:#e2e8f0;border-radius:12px;padding:2px;gap:2px}.pill-btn{border:none;background:transparent;padding:2px 8px;font-size:.65rem;font-weight:500;color:#64748b;border-radius:10px;cursor:pointer;transition:all .12s ease}.pill-btn:hover{color:#0f172a}.pill-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;box-shadow:0 1px 2px #00000014}.datasource-guidance-card{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;color:#1e40af;font-size:.675rem;padding:6px 8px;border-radius:6px;margin-bottom:8px;line-height:1.35}.source-type-switcher{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:2px;gap:2px;margin-bottom:6px}.source-tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:6px 4px;font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease}.source-tab-btn:hover{color:var(--rpt-color-text, #0f172a)}.source-tab-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0000000d}.btn-refresh-entities{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--rpt-color-primary, #2563eb);font-size:.65rem;font-weight:600;cursor:pointer;padding:0}.btn-refresh-entities:hover{text-decoration:underline}.btn-auto-params{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-auto-params:hover{background:#2563eb;color:#fff}.auto-badge{font-size:.62rem;font-weight:600;background:#dcfce7;color:#166534;padding:1px 5px;border-radius:4px}.field-hint{font-size:.65rem;color:var(--rpt-color-text-muted, #94a3b8);margin-top:2px}.sp-params-group{display:flex;flex-direction:column;gap:8px;background:transparent;padding:0;border:none;margin-bottom:12px}.params-header-row{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px;border-bottom:1px solid #e2e8f0;margin-bottom:2px}.params-hint{font-size:.64rem;color:#64748b;font-style:italic}.static-options-wrapper{display:flex;flex-direction:column;gap:8px}.static-options-header{display:flex;align-items:center;justify-content:space-between}.btn-add-option{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;border-radius:4px;padding:3px 8px;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .12s ease}.btn-add-option:hover{background:#eff6ff}.static-options-list{display:flex;flex-direction:column;gap:6px}.static-option-row{display:flex;align-items:center;gap:6px}.opt-key{flex:1}.opt-label{flex:1.5}.btn-remove-option{width:24px;height:24px;border:none;background:transparent;color:#94a3b8;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .12s ease}.btn-remove-option:hover{background:#fee2e2;color:#ef4444}.field-input{width:100%;padding:6px 8px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);box-sizing:border-box;outline:none;transition:border-color .12s ease}.field-input:focus{border-color:var(--rpt-color-primary, #2563eb)}\n"] }]
|
|
400
490
|
}], ctorParameters: () => [] });
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU03QyxPQUFPLEVBSUwsNEJBQTRCLEdBQzdCLE1BQU0sNkRBQTZELENBQUM7QUFDckUsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsa0JBQWtCLEdBQ25CLE1BQU0sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9B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QUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYTtRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO3dHQWhiVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQywrYkNoRDlDLHUyY0F5V1UsNmdNRDlURSxZQUFZLDhCQUFFLFdBQVcsMGdDQUFFLGdCQUFnQix1R0FBRSwrQkFBK0I7OzRGQUszRSxpQ0FBaUM7a0JBUjdDLFNBQVM7K0JBQ0UsZ0NBQWdDLGNBQzlCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsK0JBQStCLENBQUMsbUJBQ3RFLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkluaXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGFTb3VyY2VEZWZpbml0aW9uLFxuICBEcm9wZG93blNvdXJjZVR5cGUsXG4gIFJlcG9ydENvbXBvbmVudERlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHtcbiAgRGF0YWJhc2VFbnRpdHlNZXRhZGF0YSxcbiAgRW50aXR5Q29sdW1uTWV0YWRhdGEsXG4gIFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhLFxuICBSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyLFxufSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvc2NoZW1hLWRpc2NvdmVyeS5jb250cmFjdCc7XG5pbXBvcnQge1xuICBkZXRlY3REZWZhdWx0RGlzcGxheUZpZWxkLFxuICBkZXRlY3REZWZhdWx0VmFsdWVGaWVsZCxcbiAgaHVtYW5pemVJZGVudGlmaWVyLFxufSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyJztcbmltcG9ydCB7IHRvRmllbGRLZXkgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL3JlcG9ydC1wYXJhbWV0ZXIudXRpbCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBEZXNpZ25lclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJCaW5kaW5nRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9wYXJhbWV0ZXItYmluZGluZy1lZGl0b3IuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNPcHRpb25JdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBScHRJY29uQ29tcG9uZW50LCBQYXJhbWV0ZXJCaW5kaW5nRWRpdG9yQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb3BlcnR5LWVkaXRvci5jb21tb24uY3NzJywgJy4vcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2NvdmVyeUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJTdGF0ZSA9IGluamVjdChEZXNpZ25lclN0YXRlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBjb21wID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4oKTtcbiAgcmVhZG9ubHkgYWxsQ29tcG9uZW50cyA9IGlucHV0PFJlcG9ydENvbXBvbmVudERlZmluaXRpb25bXT4oW10pO1xuXG4gIHJlYWRvbmx5IHVwZGF0ZURhdGFTb3VyY2UgPSBvdXRwdXQ8Q29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IHVwZGF0ZVByb3BlcnR5ID0gb3V0cHV0PHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgcmVhZG9ubHkgaXNBZHZhbmNlZE1vZGUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBpc0xvYWRpbmdFbnRpdGllcyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGFsbEVudGl0aWVzID0gc2lnbmFsPERhdGFiYXNlRW50aXR5TWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBlbnRpdHlDb2x1bW5zID0gc2lnbmFsPEVudGl0eUNvbHVtbk1ldGFkYXRhW10+KFtdKTtcbiAgcmVhZG9ubHkgcHJvY2VkdXJlUGFyYW1ldGVycyA9IHNpZ25hbDxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdPihbXSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNvdXJjZVR5cGUgPSBjb21wdXRlZDxEcm9wZG93blNvdXJjZVR5cGU+KCgpID0+IHtcbiAgICBjb25zdCBkcyA9IHRoaXMuY29tcCgpLmRhdGFTb3VyY2U7XG4gICAgaWYgKGRzPy5zb3VyY2VUeXBlKSByZXR1cm4gZHMuc291cmNlVHlwZTtcbiAgICBpZiAoZHM/LmVudGl0eU5hbWUpIHJldHVybiAndGFibGUnO1xuICAgIHJldHVybiAnc3RhdGljJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRFbnRpdHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5lbnRpdHlOYW1lIHx8ICcnKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRWYWx1ZUZpZWxkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wKCkuZGF0YVNvdXJjZT8udmFsdWVGaWVsZCB8fCAnJyk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkRGlzcGxheUZpZWxkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wKCkuZGF0YVNvdXJjZT8uZGlzcGxheUZpZWxkIHx8ICcnKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWREZXBlbmRzT24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5kZXBlbmRzT24/LlswXSB8fCAnJyk7XG5cbiAgcmVhZG9ubHkgYXZhaWxhYmxlVGFibGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmFsbEVudGl0aWVzKClcbiAgICAgIC5maWx0ZXIoKGUpID0+IHtcbiAgICAgICAgY29uc3QgdCA9IChlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiB0ID09PSAndGFibGUnIHx8IHQgPT09ICd2aWV3JztcbiAgICAgIH0pXG4gICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAuLi5lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZS5mcmllbmRseU5hbWUgfHwgaHVtYW5pemVJZGVudGlmaWVyKGUubmFtZSksXG4gICAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YWlsYWJsZVByb2NlZHVyZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRW50aXRpZXMoKVxuICAgICAgLmZpbHRlcigoZSkgPT4ge1xuICAgICAgICBjb25zdCB0ID0gKGUudHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIHQgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyB8fCB0ID09PSAncHJvY2VkdXJlJyB8fCB0LmluY2x1ZGVzKCdwcm9jZWR1cmUnKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAuLi5lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZS5mcmllbmRseU5hbWUgfHwgaHVtYW5pemVJZGVudGlmaWVyKGUubmFtZSksXG4gICAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YWlsYWJsZVBhcmVudEZpZWxkcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxDb21wb25lbnRzKCkuZmlsdGVyKChjKSA9PiBjLmlkICE9PSB0aGlzLmNvbXAoKS5pZCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0YXRpY09wdGlvbnMgPSBjb21wdXRlZDxTdGF0aWNPcHRpb25JdGVtW10+KCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5jb21wKCkucHJvcGVydGllcz8uWydvcHRpb25zJ107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICAgIHJldHVybiBvcHRzLm1hcCgobykgPT4gKHsga2V5OiBTdHJpbmcoby5rZXkgPz8gby52YWx1ZSA/PyAnJyksIGxhYmVsOiBTdHJpbmcoby5sYWJlbCA/PyAnJykgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgeyBrZXk6ICcxJywgbGFiZWw6ICdPcHRpb24gMScgfSxcbiAgICAgIHsga2V5OiAnMicsIGxhYmVsOiAnT3B0aW9uIDInIH0sXG4gICAgXTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnNlbGVjdGVkRW50aXR5KCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1cnJlbnRTb3VyY2VUeXBlKCk7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgKHR5cGUgPT09ICd0YWJsZScgfHwgdHlwZSA9PT0gJ3Byb2NlZHVyZScpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkRW50aXR5RGV0YWlscyhlbnRpdHksIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEVudGl0aWVzKCk7XG4gIH1cblxuICBsb2FkRW50aXRpZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHJldHVybjtcbiAgICB0aGlzLmlzTG9hZGluZ0VudGl0aWVzLnNldCh0cnVlKTtcbiAgICB0aGlzLmRpc2NvdmVyeUFkYXB0ZXIuZ2V0RW50aXRpZXMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGVudGl0aWVzKSA9PiB7XG4gICAgICAgIHRoaXMuYWxsRW50aXRpZXMuc2V0KGVudGl0aWVzKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdFbnRpdGllcy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VdIEZhaWxlZCB0byBsb2FkIGVudGl0aWVzOicsIGVycik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nRW50aXRpZXMuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBsb2FkRW50aXR5RGV0YWlscyhlbnRpdHlOYW1lOiBzdHJpbmcsIHR5cGU6IERyb3Bkb3duU291cmNlVHlwZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNjb3ZlcnlBZGFwdGVyKSByZXR1cm47XG5cbiAgICBjb25zdCBkYlR5cGUgPSB0eXBlID09PSAncHJvY2VkdXJlJyA/ICdzdG9yZWRfcHJvY2VkdXJlJyA6ICd0YWJsZSc7XG4gICAgdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldENvbHVtbnMoZW50aXR5TmFtZSwgJ2RibycsIGRiVHlwZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChjb2xzKSA9PiB7XG4gICAgICAgIHRoaXMuZW50aXR5Q29sdW1ucy5zZXQoY29scyk7XG5cbiAgICAgICAgLy8gQXV0by1kZXRlY3QgZGVmYXVsdCB2YWx1ZUZpZWxkIGFuZCBkaXNwbGF5RmllbGQgaWYgbm90IHlldCBzZXRcbiAgICAgICAgY29uc3QgY3VycmVudFZhbCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZUZpZWxkKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXNwID0gdGhpcy5zZWxlY3RlZERpc3BsYXlGaWVsZCgpO1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRWYWwgPSBkZXRlY3REZWZhdWx0VmFsdWVGaWVsZChjb2xzKTtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGVkRGlzcCA9IGRldGVjdERlZmF1bHREaXNwbGF5RmllbGQoY29scyk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50VmFsIHx8ICFjdXJyZW50RGlzcCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgICAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICAgICAgICBzb3VyY2VUeXBlOiB0eXBlLFxuICAgICAgICAgICAgZW50aXR5TmFtZSxcbiAgICAgICAgICAgIHZhbHVlRmllbGQ6IGN1cnJlbnRWYWwgfHwgc3VnZ2VzdGVkVmFsIHx8IGNvbHNbMF0/LmZpZWxkIHx8ICcnLFxuICAgICAgICAgICAgZGlzcGxheUZpZWxkOiBjdXJyZW50RGlzcCB8fCBzdWdnZXN0ZWREaXNwIHx8IGNvbHNbMV0/LmZpZWxkIHx8IGNvbHNbMF0/LmZpZWxkIHx8ICcnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoYFtQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VdIEZhaWxlZCB0byBsb2FkIGNvbHVtbnMgZm9yICR7ZW50aXR5TmFtZX06YCwgZXJyKSxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlID09PSAncHJvY2VkdXJlJykge1xuICAgICAgdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldFBhcmFtZXRlcnMoZW50aXR5TmFtZSwgJ2RibycpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2NlZHVyZVBhcmFtZXRlcnMuc2V0KHBhcmFtcyk7XG4gICAgICAgICAgLy8gT25seSBhdXRvLWxpbmsgdG8gZXhpc3Rpbmcgc2Vzc2lvbiBvciBleGlzdGluZyBjYW52YXMgZmllbGRzLlxuICAgICAgICAgIC8vIE5FVkVSIG11dGF0ZSBjYW52YXMgb3IgY3JlYXRlIG5ldyBjb21wb25lbnRzIGF1dG9tYXRpY2FsbHkhXG4gICAgICAgICAgdGhpcy5hdXRvTGlua0V4aXN0aW5nUGFyYW1ldGVycyhwYXJhbXMpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihgW1Byb3BlcnR5RWRpdG9yRGF0YXNvdXJjZV0gRmFpbGVkIHRvIGxvYWQgcGFyYW1zIGZvciAke2VudGl0eU5hbWV9OmAsIGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9uLWRlc3RydWN0aXZlIGxpbmtpbmc6IGJpbmRzIHBhcmFtZXRlcnMgdG8gc2Vzc2lvbiBvciBhbHJlYWR5LWV4aXN0aW5nIGNhbnZhcyBmaWVsZHMuXG4gICAqIE5ldmVyIG11dGF0ZXMgb3IgYWRkcyBuZXcgY29tcG9uZW50cyB0byB0aGUgY2FudmFzLlxuICAgKi9cbiAgYXV0b0xpbmtFeGlzdGluZ1BhcmFtZXRlcnMocGFyYW1zTGlzdD86IFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXMgPSBwYXJhbXNMaXN0IHx8IHRoaXMucHJvY2VkdXJlUGFyYW1ldGVycygpO1xuICAgIGlmICghcGFyYW1zIHx8IHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29uc3QgY2xlYW4gPSBwYXJhbS5uYW1lLnJlcGxhY2UoL15ALywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBhbGxvd2VkLmFkZChjbGVhbik7XG4gICAgICBhbGxvd2VkLmFkZChgQCR7Y2xlYW59YCk7XG4gICAgICBhbGxvd2VkLmFkZChwYXJhbS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRNYXBwaW5ncyA9IHsgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LnBhcmFtZXRlck1hcHBpbmdzID8/IHt9KSB9O1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAvLyBQcnVuZSBvcnBoYW5lZCBrZXlzIHRoYXQgZG8gbm90IGJlbG9uZyB0byB0aGlzIHN0b3JlZCBwcm9jZWR1cmVcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXJyZW50TWFwcGluZ3MpKSB7XG4gICAgICBpZiAoIWFsbG93ZWQuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICBkZWxldGUgY3VycmVudE1hcHBpbmdzW2tleV07XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb25zdCBjbGVhbiA9IHBhcmFtLm5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGN1cnJlbnRNYXBwaW5nc1twYXJhbS5uYW1lXSA/PyBjdXJyZW50TWFwcGluZ3NbY2xlYW5dO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09ICcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAxLiBTZXNzaW9uIG1hdGNoIChlLmcuIGNvbXBhbnlJZCwgYnJhbmNoSWQsIHVzZXJJZClcbiAgICAgIGNvbnN0IHNlc3Npb25NYXRjaCA9XG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2U/Lm1hdGNoUGFyYW1ldGVyKGNsZWFuKSA/PyB0aGlzLnNlc3Npb25TZXJ2aWNlPy5tYXRjaFBhcmFtZXRlcihwYXJhbS5uYW1lKTtcbiAgICAgIGlmIChzZXNzaW9uTWF0Y2gpIHtcbiAgICAgICAgY3VycmVudE1hcHBpbmdzW3BhcmFtLm5hbWVdID0gYHt7c2Vzc2lvbi4ke3Nlc3Npb25NYXRjaC5zZXNzaW9uS2V5fX19YDtcbiAgICAgICAgY3VycmVudE1hcHBpbmdzW2NsZWFuXSA9IGB7e3Nlc3Npb24uJHtzZXNzaW9uTWF0Y2guc2Vzc2lvbktleX19fWA7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gRXhpc3RpbmcgY2FudmFzIGZpZWxkIG1hdGNoXG4gICAgICBjb25zdCBtYXRjaGVkQ29tcCA9IHRoaXMuYWxsQ29tcG9uZW50cygpLmZpbmQoKGMpID0+IHtcbiAgICAgICAgaWYgKGMuaWQgPT09IHRoaXMuY29tcCgpLmlkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNrID0gKGMua2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBjbCA9IGNsZWFuLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjayA9PT0gY2wgfHwgY2sgPT09IHRvRmllbGRLZXkoY2wpO1xuICAgICAgfSk7XG4gICAgICBpZiAobWF0Y2hlZENvbXApIHtcbiAgICAgICAgY3VycmVudE1hcHBpbmdzW3BhcmFtLm5hbWVdID0gYHt7JHttYXRjaGVkQ29tcC5rZXl9fX1gO1xuICAgICAgICBjdXJyZW50TWFwcGluZ3NbY2xlYW5dID0gYHt7JHttYXRjaGVkQ29tcC5rZXl9fX1gO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGN1cnJlbnRNYXBwaW5ncyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCB1c2VyLWluaXRpYXRlZCBhY3Rpb246IGxpbmtzIGV4aXN0aW5nIGZpZWxkcywgYW5kIGNyZWF0ZXMgbWlzc2luZyBmaWx0ZXIgaW5wdXRzIG9uIGNhbnZhcy5cbiAgICogUmVzdG9yZXMgc2VsZWN0aW9uIHRvIHRoZSBjdXJyZW50IGRyb3Bkb3duIGNvbXBvbmVudCBzbyB0aGUgdXNlciBzdGF5cyBpbiB0aGlzIHByb3BlcnR5IGVkaXRvci5cbiAgICovXG4gIGF1dG9XaXJlQWxsUGFyYW1ldGVycyhwYXJhbXNMaXN0PzogUHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc0xpc3QgfHwgdGhpcy5wcm9jZWR1cmVQYXJhbWV0ZXJzKCk7XG4gICAgaWYgKCFwYXJhbXMgfHwgcGFyYW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb25zdCBjbGVhbiA9IHBhcmFtLm5hbWUucmVwbGFjZSgvXkAvLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGFsbG93ZWQuYWRkKGNsZWFuKTtcbiAgICAgIGFsbG93ZWQuYWRkKGBAJHtjbGVhbn1gKTtcbiAgICAgIGFsbG93ZWQuYWRkKHBhcmFtLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudE1hcHBpbmdzID0geyAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZT8ucGFyYW1ldGVyTWFwcGluZ3MgPz8ge30pIH07XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcblxuICAgIC8vIFBydW5lIG9ycGhhbmVkIGtleXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoaXMgc3RvcmVkIHByb2NlZHVyZVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnRNYXBwaW5ncykpIHtcbiAgICAgIGlmICghYWxsb3dlZC5oYXMoa2V5LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50TWFwcGluZ3Nba2V5XTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGNsZWFuID0gcGFyYW0ubmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gY3VycmVudE1hcHBpbmdzW3BhcmFtLm5hbWVdID8/IGN1cnJlbnRNYXBwaW5nc1tjbGVhbl07XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0gJycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDEuIFNlc3Npb24gbWF0Y2ggKGUuZy4gY29tcGFueUlkLCBicmFuY2hJZCwgdXNlcklkKVxuICAgICAgY29uc3Qgc2Vzc2lvbk1hdGNoID1cbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZT8ubWF0Y2hQYXJhbWV0ZXIoY2xlYW4pID8/IHRoaXMuc2Vzc2lvblNlcnZpY2U/Lm1hdGNoUGFyYW1ldGVyKHBhcmFtLm5hbWUpO1xuICAgICAgaWYgKHNlc3Npb25NYXRjaCkge1xuICAgICAgICBjdXJyZW50TWFwcGluZ3NbcGFyYW0ubmFtZV0gPSBge3tzZXNzaW9uLiR7c2Vzc2lvbk1hdGNoLnNlc3Npb25LZXl9fX1gO1xuICAgICAgICBjdXJyZW50TWFwcGluZ3NbY2xlYW5dID0gYHt7c2Vzc2lvbi4ke3Nlc3Npb25NYXRjaC5zZXNzaW9uS2V5fX19YDtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBFeGlzdGluZyBjYW52YXMgZmllbGQgbWF0Y2hcbiAgICAgIGNvbnN0IG1hdGNoZWRDb21wID0gdGhpcy5hbGxDb21wb25lbnRzKCkuZmluZCgoYykgPT4ge1xuICAgICAgICBpZiAoYy5pZCA9PT0gdGhpcy5jb21wKCkuaWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgY2sgPSAoYy5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNsID0gY2xlYW4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGNrID09PSBjbCB8fCBjayA9PT0gdG9GaWVsZEtleShjbCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGVkQ29tcCkge1xuICAgICAgICBjdXJyZW50TWFwcGluZ3NbcGFyYW0ubmFtZV0gPSBge3ske21hdGNoZWRDb21wLmtleX19fWA7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1tjbGVhbl0gPSBge3ske21hdGNoZWRDb21wLmtleX19fWA7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gQXV0by1jcmVhdGUgbWlzc2luZyBjYW52YXMgZmllbGQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB1c2VyXG4gICAgICBpZiAodGhpcy5kZXNpZ25lclN0YXRlKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyID0gY2xlYW4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNvbXBUeXBlID0gJ2lucHV0JztcbiAgICAgICAgaWYgKGxvd2VyLmluY2x1ZGVzKCdkYXRlJykgfHwgbG93ZXIuaW5jbHVkZXMoJ3RpbWUnKSB8fCBwYXJhbS5kYXRhVHlwZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZGF0ZScpKSB7XG4gICAgICAgICAgY29tcFR5cGUgPSAnZGF0ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgcGFyYW0uZGF0YVR5cGU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludCcpIHx8XG4gICAgICAgICAgcGFyYW0uZGF0YVR5cGU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RlY2ltYWwnKSB8fFxuICAgICAgICAgIHBhcmFtLmRhdGFUeXBlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdudW1lcmljJykgfHxcbiAgICAgICAgICBwYXJhbS5kYXRhVHlwZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmxvYXQnKSB8fFxuICAgICAgICAgIGxvd2VyLmluY2x1ZGVzKCdubycpIHx8XG4gICAgICAgICAgbG93ZXIuaW5jbHVkZXMoJ2lkJykgfHxcbiAgICAgICAgICBsb3dlci5pbmNsdWRlcygnYW1vdW50JykgfHxcbiAgICAgICAgICBsb3dlci5pbmNsdWRlcygncmF0ZScpIHx8XG4gICAgICAgICAgbG93ZXIuaW5jbHVkZXMoJ3F0eScpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbXBUeXBlID0gJ251bWJlcic7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdLZXkgPSB0b0ZpZWxkS2V5KGNsZWFuKTtcbiAgICAgICAgY29uc3QgbmV3TGFiZWwgPSBodW1hbml6ZUlkZW50aWZpZXIoY2xlYW4pO1xuICAgICAgICBjb25zdCBjcmVhdGVkID0gdGhpcy5kZXNpZ25lclN0YXRlLmFkZENvbXBvbmVudChjb21wVHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAga2V5OiBuZXdLZXksXG4gICAgICAgICAgbGFiZWw6IG5ld0xhYmVsLFxuICAgICAgICAgIHByb3BlcnRpZXM6IGNvbXBUeXBlID09PSAnZGF0ZScgPyB7IHBsYWNlaG9sZGVyOiAnU2VsZWN0ICcgKyBuZXdMYWJlbCB9IDoge30sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICAgICAgY3VycmVudE1hcHBpbmdzW3BhcmFtLm5hbWVdID0gYHt7JHtjcmVhdGVkLmtleX19fWA7XG4gICAgICAgICAgY3VycmVudE1hcHBpbmdzW2NsZWFuXSA9IGB7eyR7Y3JlYXRlZC5rZXl9fX1gO1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gdG8gY3VycmVudCBkcm9wZG93biBzbyB1c2VyIGlzIG5vdCBuYXZpZ2F0ZWQgYXdheVxuICAgIGlmICh0aGlzLmRlc2lnbmVyU3RhdGUpIHtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQodGhpcy5jb21wKCkuaWQpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBjdXJyZW50TWFwcGluZ3MsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VUeXBlKHR5cGU6IERyb3Bkb3duU291cmNlVHlwZSk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnc3RhdGljJykge1xuICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgICBzb3VyY2VUeXBlOiAnc3RhdGljJyxcbiAgICAgICAgZGlzcGxheUZpZWxkOiAnJyxcbiAgICAgICAgdmFsdWVGaWVsZDogJycsXG4gICAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiB7fSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbEVudGl0aWVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvYWRFbnRpdGllcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRFbnRpdHkgPSB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5lbnRpdHlOYW1lO1xuICAgIGNvbnN0IGlzVmFsaWRGb3JUeXBlID1cbiAgICAgIHR5cGUgPT09ICd0YWJsZSdcbiAgICAgICAgPyB0aGlzLmF2YWlsYWJsZVRhYmxlcygpLnNvbWUoKHQpID0+IHQubmFtZSA9PT0gY3VycmVudEVudGl0eSlcbiAgICAgICAgOiB0aGlzLmF2YWlsYWJsZVByb2NlZHVyZXMoKS5zb21lKChwKSA9PiBwLm5hbWUgPT09IGN1cnJlbnRFbnRpdHkpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgc291cmNlVHlwZTogdHlwZSxcbiAgICAgIGVudGl0eU5hbWU6IGlzVmFsaWRGb3JUeXBlID8gKGN1cnJlbnRFbnRpdHkgfHwgJycpIDogJycsXG4gICAgICBzY2hlbWE6ICdkYm8nLFxuICAgICAgZGlzcGxheUZpZWxkOiAnJyxcbiAgICAgIHZhbHVlRmllbGQ6ICcnLFxuICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGlzVmFsaWRGb3JUeXBlID8gKHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LnBhcmFtZXRlck1hcHBpbmdzID8/IHt9KSA6IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgb25FbnRpdHlTZWxlY3RlZChlbnRpdHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0RpZmZlcmVudCA9IGVudGl0eU5hbWUgIT09IHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LmVudGl0eU5hbWU7XG4gICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgIHNvdXJjZVR5cGU6IHRoaXMuY3VycmVudFNvdXJjZVR5cGUoKSxcbiAgICAgIGVudGl0eU5hbWUsXG4gICAgICBzY2hlbWE6ICdkYm8nLFxuICAgICAgdmFsdWVGaWVsZDogJycsXG4gICAgICBkaXNwbGF5RmllbGQ6ICcnLFxuICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGlzRGlmZmVyZW50ID8ge30gOiAodGhpcy5jb21wKCkuZGF0YVNvdXJjZT8ucGFyYW1ldGVyTWFwcGluZ3MgPz8ge30pLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYWx1ZUZpZWxkQ2hhbmdlZCh2YWx1ZUZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZSA/PyB7IGRpc3BsYXlGaWVsZDogJycsIHZhbHVlRmllbGQ6ICcnIH0pLFxuICAgICAgdmFsdWVGaWVsZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGlzcGxheUZpZWxkQ2hhbmdlZChkaXNwbGF5RmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICBkaXNwbGF5RmllbGQsXG4gICAgfSk7XG4gIH1cblxuICBvbkRlcGVuZHNPbkNoYW5nZWQocGFyZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZSA/PyB7IGRpc3BsYXlGaWVsZDogJycsIHZhbHVlRmllbGQ6ICcnIH0pLFxuICAgICAgZGVwZW5kc09uOiBwYXJlbnRLZXkgPyBbcGFyZW50S2V5XSA6IFtdLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFyYW1WYWx1ZShwYXJhbU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNsZWFuID0gcGFyYW1OYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICAgIGNvbnN0IG1hcHBpbmdzID0gdGhpcy5jb21wKCkuZGF0YVNvdXJjZT8ucGFyYW1ldGVyTWFwcGluZ3MgPz8ge307XG4gICAgcmV0dXJuIChcbiAgICAgIG1hcHBpbmdzW3BhcmFtTmFtZV0gPz9cbiAgICAgIG1hcHBpbmdzW2NsZWFuXSA/P1xuICAgICAgbWFwcGluZ3NbYEAke2NsZWFufWBdID8/XG4gICAgICAnJ1xuICAgICk7XG4gIH1cblxuICBzZXRQYXJhbVZhbHVlKHBhcmFtTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNsZWFuID0gcGFyYW1OYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0geyAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZT8ucGFyYW1ldGVyTWFwcGluZ3MgPz8ge30pIH07XG4gICAgZXhpc3RpbmdbcGFyYW1OYW1lXSA9IHZhbHVlO1xuICAgIGV4aXN0aW5nW2NsZWFuXSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICBwYXJhbWV0ZXJNYXBwaW5nczogZXhpc3RpbmcsXG4gICAgfSk7XG4gIH1cblxuICBvblBhcmFtTGlua2VkRmllbGRDaGFuZ2UoZXZ0OiB7IHBhcmFtTmFtZTogc3RyaW5nOyBmaWVsZEtleTogc3RyaW5nOyBpc0xpbmtlZDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudERlcGVuZHNPbiA9IFsuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZT8uZGVwZW5kc09uID8/IFtdKV07XG4gICAgaWYgKGV2dC5pc0xpbmtlZCAmJiBldnQuZmllbGRLZXkpIHtcbiAgICAgIGlmICghY3VycmVudERlcGVuZHNPbi5pbmNsdWRlcyhldnQuZmllbGRLZXkpKSB7XG4gICAgICAgIGN1cnJlbnREZXBlbmRzT24ucHVzaChldnQuZmllbGRLZXkpO1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgICAgICBkZXBlbmRzT246IGN1cnJlbnREZXBlbmRzT24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0YXRpY09wdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gWy4uLnRoaXMuc3RhdGljT3B0aW9ucygpXTtcbiAgICBjb25zdCBuZXh0SWR4ID0gY3VycmVudC5sZW5ndGggKyAxO1xuICAgIGN1cnJlbnQucHVzaCh7IGtleTogU3RyaW5nKG5leHRJZHgpLCBsYWJlbDogYE9wdGlvbiAke25leHRJZHh9YCB9KTtcbiAgICB0aGlzLnVwZGF0ZVByb3BlcnR5LmVtaXQoeyBrZXk6ICdvcHRpb25zJywgdmFsdWU6IGN1cnJlbnQgfSk7XG4gIH1cblxuICB1cGRhdGVTdGF0aWNPcHRpb24oaW5kZXg6IG51bWJlciwgZmllbGQ6ICdrZXknIHwgJ2xhYmVsJywgdmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gWy4uLnRoaXMuc3RhdGljT3B0aW9ucygpXTtcbiAgICBpZiAoY3VycmVudFtpbmRleF0pIHtcbiAgICAgIGN1cnJlbnRbaW5kZXhdID0geyAuLi5jdXJyZW50W2luZGV4XSwgW2ZpZWxkXTogdmFsIH07XG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5LmVtaXQoeyBrZXk6ICdvcHRpb25zJywgdmFsdWU6IGN1cnJlbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU3RhdGljT3B0aW9uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGF0aWNPcHRpb25zKCkuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy51cGRhdGVQcm9wZXJ0eS5lbWl0KHsga2V5OiAnb3B0aW9ucycsIHZhbHVlOiBjdXJyZW50IH0pO1xuICB9XG59XG5cbiIsIiAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXBcIj5cbiAgICAgIDwhLS0gMS4gSGVhZGVyIHdpdGggU2ltcGxlIC8gQWR2YW5jZWQgTW9kZSBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0YXNvdXJjZS1oZWFkZXItYmFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPk9wdGlvbnMgRGF0YSBTb3VyY2U8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGUtdG9nZ2xlLXBpbGxcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCIhaXNBZHZhbmNlZE1vZGUoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaXNBZHZhbmNlZE1vZGUuc2V0KGZhbHNlKVwiXG4gICAgICAgICAgICB0aXRsZT1cIlNpbXBsaWZpZWQgdmlldyBmb3IgYnVzaW5lc3MgdXNlcnMgd2l0aCBmcmllbmRseSBuYW1lc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2ltcGxlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBpbGwtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNBZHZhbmNlZE1vZGUoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaXNBZHZhbmNlZE1vZGUuc2V0KHRydWUpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVGVjaG5pY2FsIHZpZXcgd2l0aCBTUUwgdHlwZXMgYW5kIGV4cHJlc3Npb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBBZHZhbmNlZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0YXNvdXJjZS1ndWlkYW5jZS1jYXJkXCI+XG4gICAgICAgIDxycHQtaWNvbiBuYW1lPVwiaW5mb1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgPHNwYW4+UG9wdWxhdGVzIHNlbGVjdGFibGUgY2hvaWNlcyBpbiB0aGlzIGRyb3Bkb3duIGZpbHRlci4gRm9yIHRoZSByZXBvcnQncyBtYWluIGRhdGEgYW5kIHJlc3VsdCBncmlkLCB1c2UgdGhlIDxzdHJvbmc+R3JpZDwvc3Ryb25nPiB0YWIuPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gMi4gU291cmNlIFR5cGUgU2VnbWVudGVkIFN3aXRjaGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS10eXBlLXN3aXRjaGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInNvdXJjZS10YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICd0YWJsZSdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTb3VyY2VUeXBlKCd0YWJsZScpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidGFibGVcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgPHNwYW4+e3sgaXNBZHZhbmNlZE1vZGUoKSA/ICdUYWJsZSAvIFZpZXcnIDogJ0RhdGFiYXNlIFRhYmxlJyB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInNvdXJjZS10YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdwcm9jZWR1cmUnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U291cmNlVHlwZSgncHJvY2VkdXJlJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgIDxzcGFuPnt7IGlzQWR2YW5jZWRNb2RlKCkgPyAnU3RvcmVkIFByb2MnIDogJ0RhdGEgUXVlcnknIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic291cmNlLXRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0YXRpYydcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTb3VyY2VUeXBlKCdzdGF0aWMnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgPHNwYW4+U3RhdGljIExpc3Q8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gM0EuIERBVEFCQVNFIFRBQkxFIC8gVklFVyBDT05GSUdVUkFUSU9OIC0tPlxuICAgICAgQGlmIChjdXJyZW50U291cmNlVHlwZSgpID09PSAndGFibGUnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJ0RhdGFiYXNlIFRhYmxlIC8gVmlldycgOiAnU2VsZWN0IERhdGEgU291cmNlJyB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXJlZnJlc2gtZW50aXRpZXNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEVudGl0aWVzKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIlJlZnJlc2ggYXZhaWxhYmxlIHRhYmxlcyBmcm9tIGJhY2tlbmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlJlZnJlc2g8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEVudGl0eSgpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRW50aXR5U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nRW50aXRpZXMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpc0xvYWRpbmdFbnRpdGllcygpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIHRhYmxlcyBmcm9tIGRhdGFiYXNlLi4uPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChhdmFpbGFibGVUYWJsZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHRhYmxlcyBmb3VuZCAoQ2xpY2sgUmVmcmVzaCkgLS08L29wdGlvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gQ2hvb3NlIERhdGEgVGFibGUgLS08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKHRibCBvZiBhdmFpbGFibGVUYWJsZXMoKTsgdHJhY2sgdGJsLm5hbWUpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidGJsLm5hbWVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzQWR2YW5jZWRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgIHt7IHRibC5zY2hlbWEgfX0ue3sgdGJsLm5hbWUgfX0gKHt7IHRibC50eXBlIH19KVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAge3sgdGJsLmRpc3BsYXlOYW1lIH19e3sgdGJsLmNhdGVnb3J5ID8gJyDigKIgJyArIHRibC5jYXRlZ29yeSA6ICcnIH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChzZWxlY3RlZEVudGl0eSgpKSB7XG4gICAgICAgICAgPCEtLSBEaXNwbGF5IEZpZWxkIChWaXNpYmxlIHRleHQpIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJ0Rpc3BsYXkgRmllbGQgKFZpc2libGUgVGV4dCknIDogJ1RleHQgU2hvd24gaW4gRHJvcGRvd24nIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAoIWlzQWR2YW5jZWRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF1dG8tYmFkZ2VcIiB0aXRsZT1cIkF1dG8tZGV0ZWN0ZWQgY29sdW1uIGZvciB0ZXh0IGxhYmVsXCI+QXV0by1kZXRlY3RlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREaXNwbGF5RmllbGQoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlzcGxheUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBEaXNwbGF5IENvbHVtbiAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgZW50aXR5Q29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQpIHtcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJjb2wuZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fSB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJygnICsgY29sLmRhdGFUeXBlICsgJyknIDogJycgfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFZhbHVlIEZpZWxkIChTdG9yZWQga2V5KSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAge3sgaXNBZHZhbmNlZE1vZGUoKSA/ICdWYWx1ZSBGaWVsZCAoU3RvcmVkIEtleSknIDogJ0ludGVybmFsIFZhbHVlIC8gS2V5JyB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICBAaWYgKCFpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvLWJhZGdlXCIgdGl0bGU9XCJBdXRvLWRldGVjdGVkIGNvbHVtbiBmb3IgcHJpbWFyeSBJRFwiPkF1dG8tZGV0ZWN0ZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkVmFsdWVGaWVsZCgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBLZXkgQ29sdW1uIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBlbnRpdHlDb2x1bW5zKCk7IHRyYWNrIGNvbC5maWVsZCkge1xuICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImNvbC5maWVsZFwiPlxuICAgICAgICAgICAgICAgICAge3sgY29sLmxhYmVsIH19IHt7IGlzQWR2YW5jZWRNb2RlKCkgPyAnKCcgKyBjb2wuZGF0YVR5cGUgKyAnKScgOiAnJyB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ2FzY2FkaW5nIERyb3Bkb3duIERlcGVuZGVuY3kgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5cbiAgICAgICAgICAgICAge3sgaXNBZHZhbmNlZE1vZGUoKSA/ICdEZXBlbmRlbnQgT24gKENhc2NhZGluZyBQYXJlbnQgRmllbGQpJyA6ICdGaWx0ZXIgYnkgQW5vdGhlciBGaWVsZCcgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREZXBlbmRzT24oKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGVwZW5kc09uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vbmUgKEluZGVwZW5kZW50KSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICBAZm9yIChvdGhlciBvZiBhdmFpbGFibGVQYXJlbnRGaWVsZHMoKTsgdHJhY2sgb3RoZXIua2V5IHx8IG90aGVyLmlkKSB7XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3RoZXIua2V5IHx8IG90aGVyLmlkXCI+e3sgb3RoZXIubGFiZWwgfHwgb3RoZXIua2V5IH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1oaW50XCI+XG4gICAgICAgICAgICAgIHt7IGlzQWR2YW5jZWRNb2RlKCkgPyAnQXV0b21hdGljYWxseSByZS1xdWVyaWVzIG9wdGlvbnMgd2hlbiBwYXJlbnQgZmllbGQgY2hhbmdlcy4nIDogJ09ubHkgbG9hZHMgb3B0aW9ucyB3aGVuIHRoZSBzZWxlY3RlZCBmaWVsZCBjaGFuZ2VzLicgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIDNCLiBTVE9SRUQgUFJPQ0VEVVJFIENPTkZJR1VSQVRJT04gLS0+XG4gICAgICBAaWYgKGN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdwcm9jZWR1cmUnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJ1N0b3JlZCBQcm9jZWR1cmUnIDogJ1NlbGVjdCBEYXRhIFByb2NlZHVyZScgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1yZWZyZXNoLWVudGl0aWVzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImxvYWRFbnRpdGllcygpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJSZWZyZXNoIGF2YWlsYWJsZSBwcm9jZWR1cmVzIGZyb20gYmFja2VuZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVmcmVzaFwiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+UmVmcmVzaDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRW50aXR5KClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25FbnRpdHlTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdFbnRpdGllcygpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGlzTG9hZGluZ0VudGl0aWVzKCkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcgc3RvcmVkIHByb2NlZHVyZXMgZnJvbSBkYXRhYmFzZS4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoYXZhaWxhYmxlUHJvY2VkdXJlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gc3RvcmVkIHByb2NlZHVyZXMgZm91bmQgKENsaWNrIFJlZnJlc2gpIC0tPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIENob29zZSBEYXRhIFF1ZXJ5IC8gU1AgLS08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKHNwIG9mIGF2YWlsYWJsZVByb2NlZHVyZXMoKTsgdHJhY2sgc3AubmFtZSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJzcC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgQGlmIChpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICB7eyBzcC5zY2hlbWEgfX0ue3sgc3AubmFtZSB9fVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAge3sgc3AuZGlzcGxheU5hbWUgfX17eyBzcC5jYXRlZ29yeSA/ICcg4oCiICcgKyBzcC5jYXRlZ29yeSA6ICcnIH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChzZWxlY3RlZEVudGl0eSgpKSB7XG4gICAgICAgICAgPCEtLSBWaXN1YWwgUGFyYW1ldGVyIExpbmtlcnMgLS0+XG4gICAgICAgICAgQGlmIChwcm9jZWR1cmVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwLXBhcmFtcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW1zLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAge3sgaXNBZHZhbmNlZE1vZGUoKSA/ICdQcm9jZWR1cmUgSW5wdXQgUGFyYW1ldGVycycgOiAnRmlsdGVyIElucHV0cyAmIFBhcmFtZXRlcnMnIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWF1dG8tcGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhdXRvV2lyZUFsbFBhcmFtZXRlcnMoKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkF1dG8tZGV0ZWN0IHNlc3Npb24gcGFyYW1ldGVycyBhbmQgYWRkIG1pc3NpbmcgZmlsdGVyIGNvbnRyb2xzIHRvIHRoZSBjYW52YXNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5BdXRvLVdpcmUgQ2FudmFzIElucHV0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgQGZvciAocGFyYW0gb2YgcHJvY2VkdXJlUGFyYW1ldGVycygpOyB0cmFjayBwYXJhbS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgPHJwdC1wYXJhbWV0ZXItYmluZGluZy1lZGl0b3JcbiAgICAgICAgICAgICAgICAgIFtwYXJhbV09XCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICBbY3VycmVudFZhbHVlXT1cImdldFBhcmFtVmFsdWUocGFyYW0ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgW2FsbENvbXBvbmVudHNdPVwiYWxsQ29tcG9uZW50cygpXCJcbiAgICAgICAgICAgICAgICAgIFtjdXJyZW50Q29tcG9uZW50SWRdPVwiY29tcCgpLmlkXCJcbiAgICAgICAgICAgICAgICAgIFtpc0FkdmFuY2VkTW9kZV09XCJpc0FkdmFuY2VkTW9kZSgpXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZXRQYXJhbVZhbHVlKHBhcmFtLm5hbWUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGxpbmtlZEZpZWxkQ2hhbmdlKT1cIm9uUGFyYW1MaW5rZWRGaWVsZENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIERpc3BsYXkgRmllbGQgKFZpc2libGUgdGV4dCkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IGlzQWR2YW5jZWRNb2RlKCkgPyAnRGlzcGxheSBGaWVsZCAoZnJvbSBTUCByZXN1bHQpJyA6ICdUZXh0IFNob3duIGluIERyb3Bkb3duJyB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICBAaWYgKCFpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvLWJhZGdlXCI+QXV0by1kZXRlY3RlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGVudGl0eUNvbHVtbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREaXNwbGF5RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EaXNwbGF5RmllbGRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBEaXNwbGF5IENvbHVtbiAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBlbnRpdHlDb2x1bW5zKCk7IHRyYWNrIGNvbC5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiY29sLmZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fSB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJygnICsgY29sLmRhdGFUeXBlICsgJyknIDogJycgfX1cbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIG5hbWUgKGxlYXZlIGJsYW5rIGZvciBhdXRvKVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREaXNwbGF5RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EaXNwbGF5RmllbGRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBWYWx1ZSBGaWVsZCAoU3RvcmVkIGtleSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IGlzQWR2YW5jZWRNb2RlKCkgPyAnVmFsdWUgRmllbGQgKGZyb20gU1AgcmVzdWx0KScgOiAnSW50ZXJuYWwgVmFsdWUgLyBLZXknIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAoIWlzQWR2YW5jZWRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF1dG8tYmFkZ2VcIj5BdXRvLWRldGVjdGVkPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoZW50aXR5Q29sdW1ucygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFZhbHVlRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgS2V5IENvbHVtbiAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBlbnRpdHlDb2x1bW5zKCk7IHRyYWNrIGNvbC5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiY29sLmZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fSB7eyBpc0FkdmFuY2VkTW9kZSgpID8gJygnICsgY29sLmRhdGFUeXBlICsgJyknIDogJycgfX1cbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIG5hbWUgKGxlYXZlIGJsYW5rIGZvciBhdXRvKVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRWYWx1ZUZpZWxkKClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmFsdWVGaWVsZENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSAzQy4gU1RBVElDIE9QVElPTlMgRURJVE9SIC0tPlxuICAgICAgQGlmIChjdXJyZW50U291cmNlVHlwZSgpID09PSAnc3RhdGljJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdGljLW9wdGlvbnMtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0aWMtb3B0aW9ucy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TdGF0aWMgT3B0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWFkZC1vcHRpb25cIiAoY2xpY2spPVwiYWRkU3RhdGljT3B0aW9uKClcIj5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5BZGQgT3B0aW9uPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdGljLW9wdGlvbnMtbGlzdFwiPlxuICAgICAgICAgICAgQGZvciAob3B0IG9mIHN0YXRpY09wdGlvbnMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0aWMtb3B0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dCBvcHQta2V5XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiS2V5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdC5rZXlcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlU3RhdGljT3B0aW9uKCRpbmRleCwgJ2tleScsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG9wdC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVTdGF0aWNPcHRpb24oJGluZGV4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tcmVtb3ZlLW9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU3RhdGljT3B0aW9uKCRpbmRleClcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgb3B0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+Il19
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPN0MsT0FBTyxFQUlMLDRCQUE0QixHQUM3QixNQUFNLDZEQUE2RCxDQUFDO0FBQ3JFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUNuQixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FB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b05BQy9CLDRCQUE0Qjs7NEZBTW5CLGlDQUFpQztrQkFkN0MsU0FBUzsrQkFDRSxnQ0FBZ0MsY0FDOUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxnQkFBZ0I7d0JBQ2hCLCtCQUErQjt3QkFDL0IsNEJBQTRCO3FCQUM3QixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24sXG4gIERyb3Bkb3duU291cmNlVHlwZSxcbiAgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBEYXRhYmFzZUVudGl0eU1ldGFkYXRhLFxuICBFbnRpdHlDb2x1bW5NZXRhZGF0YSxcbiAgUHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGEsXG4gIFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIsXG59IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9zY2hlbWEtZGlzY292ZXJ5LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIGRldGVjdERlZmF1bHREaXNwbGF5RmllbGQsXG4gIGRldGVjdERlZmF1bHRWYWx1ZUZpZWxkLFxuICBodW1hbml6ZUlkZW50aWZpZXIsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvaWRlbnRpZmllci1odW1hbml6ZXInO1xuaW1wb3J0IHsgdG9GaWVsZEtleSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IERlc2lnbmVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJwdFNlYXJjaGFibGVTZWxlY3RDb21wb25lbnQsXG4gIFNlYXJjaGFibGVTZWxlY3RPcHRpb24sXG59IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJCaW5kaW5nRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9wYXJhbWV0ZXItYmluZGluZy1lZGl0b3IuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNPcHRpb25JdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUnB0SWNvbkNvbXBvbmVudCxcbiAgICBQYXJhbWV0ZXJCaW5kaW5nRWRpdG9yQ29tcG9uZW50LFxuICAgIFJwdFNlYXJjaGFibGVTZWxlY3RDb21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcycsICcuL3Byb3BlcnR5LWVkaXRvci1kYXRhc291cmNlLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JEYXRhc291cmNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2NvdmVyeUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJTdGF0ZSA9IGluamVjdChEZXNpZ25lclN0YXRlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBwcml2YXRlIGxhc3RMb2FkZWRLZXkgPSAnJztcbiAgcHJpdmF0ZSBjb2x1bW5zU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHBhcmFtc1N1Yj86IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBjb21wID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4oKTtcbiAgcmVhZG9ubHkgYWxsQ29tcG9uZW50cyA9IGlucHV0PFJlcG9ydENvbXBvbmVudERlZmluaXRpb25bXT4oW10pO1xuXG4gIHJlYWRvbmx5IHVwZGF0ZURhdGFTb3VyY2UgPSBvdXRwdXQ8Q29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IHVwZGF0ZVByb3BlcnR5ID0gb3V0cHV0PHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgcmVhZG9ubHkgaXNBZHZhbmNlZE1vZGUgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZ0VudGl0aWVzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgYWxsRW50aXRpZXMgPSBzaWduYWw8RGF0YWJhc2VFbnRpdHlNZXRhZGF0YVtdPihbXSk7XG4gIHJlYWRvbmx5IGVudGl0eUNvbHVtbnMgPSBzaWduYWw8RW50aXR5Q29sdW1uTWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBwcm9jZWR1cmVQYXJhbWV0ZXJzID0gc2lnbmFsPFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhW10+KFtdKTtcblxuICByZWFkb25seSBjdXJyZW50U291cmNlVHlwZSA9IGNvbXB1dGVkPERyb3Bkb3duU291cmNlVHlwZT4oKCkgPT4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jb21wKCkuZGF0YVNvdXJjZTtcbiAgICBpZiAoZHM/LnNvdXJjZVR5cGUpIHJldHVybiBkcy5zb3VyY2VUeXBlO1xuICAgIGlmIChkcz8uZW50aXR5TmFtZSkgcmV0dXJuICd0YWJsZSc7XG4gICAgcmV0dXJuICdzdGF0aWMnO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZEVudGl0eSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LmVudGl0eU5hbWUgfHwgJycpO1xuICByZWFkb25seSBzZWxlY3RlZFZhbHVlRmllbGQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy52YWx1ZUZpZWxkIHx8ICcnKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWREaXNwbGF5RmllbGQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5kaXNwbGF5RmllbGQgfHwgJycpO1xuICByZWFkb25seSBzZWxlY3RlZERlcGVuZHNPbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LmRlcGVuZHNPbj8uWzBdIHx8ICcnKTtcblxuICByZWFkb25seSBhdmFpbGFibGVUYWJsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRW50aXRpZXMoKVxuICAgICAgLmZpbHRlcigoZSkgPT4ge1xuICAgICAgICBjb25zdCB0ID0gKGUudHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIHQgPT09ICd0YWJsZScgfHwgdCA9PT0gJ3ZpZXcnO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgIC4uLmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBlLmZyaWVuZGx5TmFtZSB8fCBodW1hbml6ZUlkZW50aWZpZXIoZS5uYW1lKSxcbiAgICAgIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXZhaWxhYmxlUHJvY2VkdXJlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxFbnRpdGllcygpXG4gICAgICAuZmlsdGVyKChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHQgPSAoZS50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gdCA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnIHx8IHQgPT09ICdwcm9jZWR1cmUnIHx8IHQuaW5jbHVkZXMoJ3Byb2NlZHVyZScpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgIC4uLmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBlLmZyaWVuZGx5TmFtZSB8fCBodW1hbml6ZUlkZW50aWZpZXIoZS5uYW1lKSxcbiAgICAgIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXZhaWxhYmxlUGFyZW50RmllbGRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmFsbENvbXBvbmVudHMoKS5maWx0ZXIoKGMpID0+IGMuaWQgIT09IHRoaXMuY29tcCgpLmlkKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdGljT3B0aW9ucyA9IGNvbXB1dGVkPFN0YXRpY09wdGlvbkl0ZW1bXT4oKCkgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbXAoKS5wcm9wZXJ0aWVzPy5bJ29wdGlvbnMnXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzKSkge1xuICAgICAgcmV0dXJuIG9wdHMubWFwKChvKSA9PiAoeyBrZXk6IFN0cmluZyhvLmtleSA/PyBvLnZhbHVlID8/ICcnKSwgbGFiZWw6IFN0cmluZyhvLmxhYmVsID8/ICcnKSB9KSk7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICB7IGtleTogJzEnLCBsYWJlbDogJ09wdGlvbiAxJyB9LFxuICAgICAgeyBrZXk6ICcyJywgbGFiZWw6ICdPcHRpb24gMicgfSxcbiAgICBdO1xuICB9KTtcblxuICByZWFkb25seSBwcm9jZWR1cmVTZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgaXNBZHYgPSB0aGlzLmlzQWR2YW5jZWRNb2RlKCk7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUHJvY2VkdXJlcygpLm1hcCgoc3ApID0+ICh7XG4gICAgICB2YWx1ZTogc3AubmFtZSxcbiAgICAgIGxhYmVsOiBpc0FkdiA/IGAke3NwLnNjaGVtYSB8fCAnZGJvJ30uJHtzcC5uYW1lfWAgOiBzcC5kaXNwbGF5TmFtZSxcbiAgICAgIHN1YmxhYmVsOiBpc0FkdiA/IChzcC5kaXNwbGF5TmFtZSAhPT0gc3AubmFtZSA/IHNwLmRpc3BsYXlOYW1lIDogdW5kZWZpbmVkKSA6IGAke3NwLnNjaGVtYSB8fCAnZGJvJ30uJHtzcC5uYW1lfWAsXG4gICAgICBiYWRnZTogc3AuY2F0ZWdvcnkgfHwgJ1NQJyxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRhYmxlU2VsZWN0T3B0aW9ucyA9IGNvbXB1dGVkPFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGlzQWR2ID0gdGhpcy5pc0FkdmFuY2VkTW9kZSgpO1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZVRhYmxlcygpLm1hcCgodGJsKSA9PiAoe1xuICAgICAgdmFsdWU6IHRibC5uYW1lLFxuICAgICAgbGFiZWw6IGlzQWR2ID8gYCR7dGJsLnNjaGVtYSB8fCAnZGJvJ30uJHt0YmwubmFtZX1gIDogdGJsLmRpc3BsYXlOYW1lLFxuICAgICAgc3VibGFiZWw6IGlzQWR2ID8gKHRibC5kaXNwbGF5TmFtZSAhPT0gdGJsLm5hbWUgPyB0YmwuZGlzcGxheU5hbWUgOiB1bmRlZmluZWQpIDogYCR7dGJsLnNjaGVtYSB8fCAnZGJvJ30uJHt0YmwubmFtZX1gLFxuICAgICAgYmFkZ2U6IHRibC50eXBlIHx8ICdUYWJsZScsXG4gICAgfSkpO1xuICB9KTtcblxuICByZWFkb25seSBkaXNwbGF5RmllbGRTZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZW50aXR5Q29sdW1ucygpLm1hcCgoY29sKSA9PiAoe1xuICAgICAgdmFsdWU6IGNvbC5maWVsZCxcbiAgICAgIGxhYmVsOiBjb2wubGFiZWwgfHwgY29sLmZpZWxkLFxuICAgICAgc3VibGFiZWw6IGNvbC5maWVsZCAhPT0gY29sLmxhYmVsID8gY29sLmZpZWxkIDogdW5kZWZpbmVkLFxuICAgICAgYmFkZ2U6IGNvbC5kYXRhVHlwZSB8fCB1bmRlZmluZWQsXG4gICAgfSkpO1xuICB9KTtcblxuICByZWFkb25seSB2YWx1ZUZpZWxkU2VsZWN0T3B0aW9ucyA9IGNvbXB1dGVkPFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXT4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmVudGl0eUNvbHVtbnMoKS5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIHZhbHVlOiBjb2wuZmllbGQsXG4gICAgICBsYWJlbDogY29sLmxhYmVsIHx8IGNvbC5maWVsZCxcbiAgICAgIHN1YmxhYmVsOiBjb2wuZmllbGQgIT09IGNvbC5sYWJlbCA/IGNvbC5maWVsZCA6IHVuZGVmaW5lZCxcbiAgICAgIGJhZGdlOiBjb2wuZGF0YVR5cGUgfHwgdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcGFyZW50RmllbGRTZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlUGFyZW50RmllbGRzKCkubWFwKChjKSA9PiAoe1xuICAgICAgdmFsdWU6IGMua2V5IHx8IGMuaWQsXG4gICAgICBsYWJlbDogYy5sYWJlbCB8fCBjLmtleSB8fCBjLmlkLFxuICAgICAgc3VibGFiZWw6IGMua2V5IHx8IGMuaWQsXG4gICAgICBiYWRnZTogYy50eXBlLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnNlbGVjdGVkRW50aXR5KCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1cnJlbnRTb3VyY2VUeXBlKCk7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke3R5cGV9OiR7ZW50aXR5fWA7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgKHR5cGUgPT09ICd0YWJsZScgfHwgdHlwZSA9PT0gJ3Byb2NlZHVyZScpKSB7XG4gICAgICAgICAgaWYgKHRoaXMubGFzdExvYWRlZEtleSAhPT0ga2V5KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RMb2FkZWRLZXkgPSBrZXk7XG4gICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5sb2FkRW50aXR5RGV0YWlscyhlbnRpdHksIHR5cGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sYXN0TG9hZGVkS2V5ID0gJyc7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMucGFyYW1zU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuZW50aXR5Q29sdW1ucy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMucHJvY2VkdXJlUGFyYW1ldGVycy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEVudGl0aWVzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wYXJhbXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBsb2FkRW50aXRpZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHJldHVybjtcbiAgICB0aGlzLmlzTG9hZGluZ0VudGl0aWVzLnNldCh0cnVlKTtcbiAgICB0aGlzLmRpc2NvdmVyeUFkYXB0ZXIuZ2V0RW50aXRpZXMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGVudGl0aWVzKSA9PiB7XG4gICAgICAgIHRoaXMuYWxsRW50aXRpZXMuc2V0KGVudGl0aWVzKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdFbnRpdGllcy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VdIEZhaWxlZCB0byBsb2FkIGVudGl0aWVzOicsIGVycik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nRW50aXRpZXMuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBsb2FkRW50aXR5RGV0YWlscyhlbnRpdHlOYW1lOiBzdHJpbmcsIHR5cGU6IERyb3Bkb3duU291cmNlVHlwZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNjb3ZlcnlBZGFwdGVyKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtbnNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wYXJhbXNTdWI/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBkYlR5cGUgPSB0eXBlID09PSAncHJvY2VkdXJlJyA/ICdzdG9yZWRfcHJvY2VkdXJlJyA6ICd0YWJsZSc7XG4gICAgdGhpcy5jb2x1bW5zU3ViID0gdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldENvbHVtbnMoZW50aXR5TmFtZSwgJ2RibycsIGRiVHlwZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChjb2xzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhZmVDb2xzID0gY29scyB8fCBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlDb2x1bW5zLnNldChzYWZlQ29scyk7XG5cbiAgICAgICAgLy8gQXV0by1kZXRlY3QgZGVmYXVsdCB2YWx1ZUZpZWxkIGFuZCBkaXNwbGF5RmllbGQgaWYgbm90IHlldCBzZXRcbiAgICAgICAgY29uc3QgY3VycmVudFZhbCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZUZpZWxkKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXNwID0gdGhpcy5zZWxlY3RlZERpc3BsYXlGaWVsZCgpO1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRWYWwgPSBkZXRlY3REZWZhdWx0VmFsdWVGaWVsZChzYWZlQ29scyk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZERpc3AgPSBkZXRlY3REZWZhdWx0RGlzcGxheUZpZWxkKHNhZmVDb2xzKTtcblxuICAgICAgICBjb25zdCBuZXh0VmFsID0gY3VycmVudFZhbCB8fCBzdWdnZXN0ZWRWYWwgfHwgc2FmZUNvbHNbMF0/LmZpZWxkIHx8ICcnO1xuICAgICAgICBjb25zdCBuZXh0RGlzcCA9IGN1cnJlbnREaXNwIHx8IHN1Z2dlc3RlZERpc3AgfHwgc2FmZUNvbHNbMV0/LmZpZWxkIHx8IHNhZmVDb2xzWzBdPy5maWVsZCB8fCAnJztcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgd2UgYWN0dWFsbHkgZGV0ZWN0ZWQgYSBub24tZW1wdHkgZmllbGQgdGhhdCBkaWZmZXJzIGZyb20gY3VycmVudCBzdGF0ZVxuICAgICAgICBpZiAoKG5leHRWYWwgIT09IGN1cnJlbnRWYWwgfHwgbmV4dERpc3AgIT09IGN1cnJlbnREaXNwKSAmJiAobmV4dFZhbCB8fCBuZXh0RGlzcCkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAgICAgICAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZSA/PyB7IGRpc3BsYXlGaWVsZDogJycsIHZhbHVlRmllbGQ6ICcnIH0pLFxuICAgICAgICAgICAgc291cmNlVHlwZTogdHlwZSxcbiAgICAgICAgICAgIGVudGl0eU5hbWUsXG4gICAgICAgICAgICB2YWx1ZUZpZWxkOiBuZXh0VmFsLFxuICAgICAgICAgICAgZGlzcGxheUZpZWxkOiBuZXh0RGlzcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKGBbUHJvcGVydHlFZGl0b3JEYXRhc291cmNlXSBGYWlsZWQgdG8gbG9hZCBjb2x1bW5zIGZvciAke2VudGl0eU5hbWV9OmAsIGVyciksXG4gICAgfSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3Byb2NlZHVyZScpIHtcbiAgICAgIHRoaXMucGFyYW1zU3ViID0gdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldFBhcmFtZXRlcnMoZW50aXR5TmFtZSwgJ2RibycpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCBzYWZlUGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgICAgICAgIHRoaXMucHJvY2VkdXJlUGFyYW1ldGVycy5zZXQoc2FmZVBhcmFtcyk7XG4gICAgICAgICAgLy8gT25seSBhdXRvLWxpbmsgdG8gZXhpc3Rpbmcgc2Vzc2lvbiBvciBleGlzdGluZyBjYW52YXMgZmllbGRzLlxuICAgICAgICAgIC8vIE5FVkVSIG11dGF0ZSBjYW52YXMgb3IgY3JlYXRlIG5ldyBjb21wb25lbnRzIGF1dG9tYXRpY2FsbHkhXG4gICAgICAgICAgdGhpcy5hdXRvTGlua0V4aXN0aW5nUGFyYW1ldGVycyhzYWZlUGFyYW1zKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoYFtQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VdIEZhaWxlZCB0byBsb2FkIHBhcmFtcyBmb3IgJHtlbnRpdHlOYW1lfTpgLCBlcnIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vbi1kZXN0cnVjdGl2ZSBsaW5raW5nOiBiaW5kcyBwYXJhbWV0ZXJzIHRvIHNlc3Npb24gb3IgYWxyZWFkeS1leGlzdGluZyBjYW52YXMgZmllbGRzLlxuICAgKiBOZXZlciBtdXRhdGVzIG9yIGFkZHMgbmV3IGNvbXBvbmVudHMgdG8gdGhlIGNhbnZhcy5cbiAgICovXG4gIGF1dG9MaW5rRXhpc3RpbmdQYXJhbWV0ZXJzKHBhcmFtc0xpc3Q/OiBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gcGFyYW1zTGlzdCB8fCB0aGlzLnByb2NlZHVyZVBhcmFtZXRlcnMoKTtcbiAgICBpZiAoIXBhcmFtcyB8fCBwYXJhbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGNsZWFuID0gcGFyYW0ubmFtZS5yZXBsYWNlKC9eQC8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYWxsb3dlZC5hZGQoY2xlYW4pO1xuICAgICAgYWxsb3dlZC5hZGQoYEAke2NsZWFufWApO1xuICAgICAgYWxsb3dlZC5hZGQocGFyYW0ubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TWFwcGluZ3MgPSB7IC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5wYXJhbWV0ZXJNYXBwaW5ncyA/PyB7fSkgfTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgLy8gUHJ1bmUgb3JwaGFuZWQga2V5cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gdGhpcyBzdG9yZWQgcHJvY2VkdXJlXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VycmVudE1hcHBpbmdzKSkge1xuICAgICAgaWYgKCFhbGxvd2VkLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRNYXBwaW5nc1trZXldO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29uc3QgY2xlYW4gPSBwYXJhbS5uYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBjdXJyZW50TWFwcGluZ3NbcGFyYW0ubmFtZV0gPz8gY3VycmVudE1hcHBpbmdzW2NsZWFuXTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nICE9PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMS4gU2Vzc2lvbiBtYXRjaCAoZS5nLiBjb21wYW55SWQsIGJyYW5jaElkLCB1c2VySWQpXG4gICAgICBjb25zdCBzZXNzaW9uTWF0Y2ggPVxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlPy5tYXRjaFBhcmFtZXRlcihjbGVhbikgPz8gdGhpcy5zZXNzaW9uU2VydmljZT8ubWF0Y2hQYXJhbWV0ZXIocGFyYW0ubmFtZSk7XG4gICAgICBpZiAoc2Vzc2lvbk1hdGNoKSB7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1twYXJhbS5uYW1lXSA9IGB7e3Nlc3Npb24uJHtzZXNzaW9uTWF0Y2guc2Vzc2lvbktleX19fWA7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1tjbGVhbl0gPSBge3tzZXNzaW9uLiR7c2Vzc2lvbk1hdGNoLnNlc3Npb25LZXl9fX1gO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEV4aXN0aW5nIGNhbnZhcyBmaWVsZCBtYXRjaFxuICAgICAgY29uc3QgbWF0Y2hlZENvbXAgPSB0aGlzLmFsbENvbXBvbmVudHMoKS5maW5kKChjKSA9PiB7XG4gICAgICAgIGlmIChjLmlkID09PSB0aGlzLmNvbXAoKS5pZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjayA9IChjLmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY2wgPSBjbGVhbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gY2sgPT09IGNsIHx8IGNrID09PSB0b0ZpZWxkS2V5KGNsKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoZWRDb21wKSB7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1twYXJhbS5uYW1lXSA9IGB7eyR7bWF0Y2hlZENvbXAua2V5fX19YDtcbiAgICAgICAgY3VycmVudE1hcHBpbmdzW2NsZWFuXSA9IGB7eyR7bWF0Y2hlZENvbXAua2V5fX19YDtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICBjb25zdCBleGlzdGluZ01hcHBpbmdzID0gdGhpcy5jb21wKCkuZGF0YVNvdXJjZT8ucGFyYW1ldGVyTWFwcGluZ3MgPz8ge307XG4gICAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGN1cnJlbnRNYXBwaW5ncyk7XG4gICAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGV4aXN0aW5nTWFwcGluZ3MpO1xuICAgICAgY29uc3QgaXNEaWZmZXJlbnQgPVxuICAgICAgICBrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCB8fFxuICAgICAgICBrZXlzQS5zb21lKChrKSA9PiBjdXJyZW50TWFwcGluZ3Nba10gIT09IGV4aXN0aW5nTWFwcGluZ3Nba10pO1xuXG4gICAgICBpZiAoaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGN1cnJlbnRNYXBwaW5ncyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IHVzZXItaW5pdGlhdGVkIGFjdGlvbjogbGlua3MgZXhpc3RpbmcgZmllbGRzLCBhbmQgY3JlYXRlcyBtaXNzaW5nIGZpbHRlciBpbnB1dHMgb24gY2FudmFzLlxuICAgKiBSZXN0b3JlcyBzZWxlY3Rpb24gdG8gdGhlIGN1cnJlbnQgZHJvcGRvd24gY29tcG9uZW50IHNvIHRoZSB1c2VyIHN0YXlzIGluIHRoaXMgcHJvcGVydHkgZWRpdG9yLlxuICAgKi9cbiAgYXV0b1dpcmVBbGxQYXJhbWV0ZXJzKHBhcmFtc0xpc3Q/OiBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gcGFyYW1zTGlzdCB8fCB0aGlzLnByb2NlZHVyZVBhcmFtZXRlcnMoKTtcbiAgICBpZiAoIXBhcmFtcyB8fCBwYXJhbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGNsZWFuID0gcGFyYW0ubmFtZS5yZXBsYWNlKC9eQC8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYWxsb3dlZC5hZGQoY2xlYW4pO1xuICAgICAgYWxsb3dlZC5hZGQoYEAke2NsZWFufWApO1xuICAgICAgYWxsb3dlZC5hZGQocGFyYW0ubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TWFwcGluZ3MgPSB7IC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5wYXJhbWV0ZXJNYXBwaW5ncyA/PyB7fSkgfTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgLy8gUHJ1bmUgb3JwaGFuZWQga2V5cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gdGhpcyBzdG9yZWQgcHJvY2VkdXJlXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VycmVudE1hcHBpbmdzKSkge1xuICAgICAgaWYgKCFhbGxvd2VkLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRNYXBwaW5nc1trZXldO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29uc3QgY2xlYW4gPSBwYXJhbS5uYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBjdXJyZW50TWFwcGluZ3NbcGFyYW0ubmFtZV0gPz8gY3VycmVudE1hcHBpbmdzW2NsZWFuXTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nICE9PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMS4gU2Vzc2lvbiBtYXRjaCAoZS5nLiBjb21wYW55SWQsIGJyYW5jaElkLCB1c2VySWQpXG4gICAgICBjb25zdCBzZXNzaW9uTWF0Y2ggPVxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlPy5tYXRjaFBhcmFtZXRlcihjbGVhbikgPz8gdGhpcy5zZXNzaW9uU2VydmljZT8ubWF0Y2hQYXJhbWV0ZXIocGFyYW0ubmFtZSk7XG4gICAgICBpZiAoc2Vzc2lvbk1hdGNoKSB7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1twYXJhbS5uYW1lXSA9IGB7e3Nlc3Npb24uJHtzZXNzaW9uTWF0Y2guc2Vzc2lvbktleX19fWA7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1tjbGVhbl0gPSBge3tzZXNzaW9uLiR7c2Vzc2lvbk1hdGNoLnNlc3Npb25LZXl9fX1gO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEV4aXN0aW5nIGNhbnZhcyBmaWVsZCBtYXRjaFxuICAgICAgY29uc3QgbWF0Y2hlZENvbXAgPSB0aGlzLmFsbENvbXBvbmVudHMoKS5maW5kKChjKSA9PiB7XG4gICAgICAgIGlmIChjLmlkID09PSB0aGlzLmNvbXAoKS5pZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjayA9IChjLmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY2wgPSBjbGVhbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gY2sgPT09IGNsIHx8IGNrID09PSB0b0ZpZWxkS2V5KGNsKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoZWRDb21wKSB7XG4gICAgICAgIGN1cnJlbnRNYXBwaW5nc1twYXJhbS5uYW1lXSA9IGB7eyR7bWF0Y2hlZENvbXAua2V5fX19YDtcbiAgICAgICAgY3VycmVudE1hcHBpbmdzW2NsZWFuXSA9IGB7eyR7bWF0Y2hlZENvbXAua2V5fX19YDtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBBdXRvLWNyZWF0ZSBtaXNzaW5nIGNhbnZhcyBmaWVsZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHVzZXJcbiAgICAgIGlmICh0aGlzLmRlc2lnbmVyU3RhdGUpIHtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBjbGVhbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgY29tcFR5cGUgPSAnaW5wdXQnO1xuICAgICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ2RhdGUnKSB8fCBsb3dlci5pbmNsdWRlcygndGltZScpIHx8IHBhcmFtLmRhdGFUeXBlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkYXRlJykpIHtcbiAgICAgICAgICBjb21wVHlwZSA9ICdkYXRlJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBwYXJhbS5kYXRhVHlwZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnaW50JykgfHxcbiAgICAgICAgICBwYXJhbS5kYXRhVHlwZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZGVjaW1hbCcpIHx8XG4gICAgICAgICAgcGFyYW0uZGF0YVR5cGU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ251bWVyaWMnKSB8fFxuICAgICAgICAgIHBhcmFtLmRhdGFUeXBlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmbG9hdCcpIHx8XG4gICAgICAgICAgbG93ZXIuaW5jbHVkZXMoJ25vJykgfHxcbiAgICAgICAgICBsb3dlci5pbmNsdWRlcygnaWQnKSB8fFxuICAgICAgICAgIGxvd2VyLmluY2x1ZGVzKCdhbW91bnQnKSB8fFxuICAgICAgICAgIGxvd2VyLmluY2x1ZGVzKCdyYXRlJykgfHxcbiAgICAgICAgICBsb3dlci5pbmNsdWRlcygncXR5JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcFR5cGUgPSAnbnVtYmVyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IHRvRmllbGRLZXkoY2xlYW4pO1xuICAgICAgICBjb25zdCBuZXdMYWJlbCA9IGh1bWFuaXplSWRlbnRpZmllcihjbGVhbik7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSB0aGlzLmRlc2lnbmVyU3RhdGUuYWRkQ29tcG9uZW50KGNvbXBUeXBlLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBrZXk6IG5ld0tleSxcbiAgICAgICAgICBsYWJlbDogbmV3TGFiZWwsXG4gICAgICAgICAgcHJvcGVydGllczogY29tcFR5cGUgPT09ICdkYXRlJyA/IHsgcGxhY2Vob2xkZXI6ICdTZWxlY3QgJyArIG5ld0xhYmVsIH0gOiB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgICAgICBjdXJyZW50TWFwcGluZ3NbcGFyYW0ubmFtZV0gPSBge3ske2NyZWF0ZWQua2V5fX19YDtcbiAgICAgICAgICBjdXJyZW50TWFwcGluZ3NbY2xlYW5dID0gYHt7JHtjcmVhdGVkLmtleX19fWA7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiB0byBjdXJyZW50IGRyb3Bkb3duIHNvIHVzZXIgaXMgbm90IG5hdmlnYXRlZCBhd2F5XG4gICAgaWYgKHRoaXMuZGVzaWduZXJTdGF0ZSkge1xuICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnNlbGVjdENvbXBvbmVudCh0aGlzLmNvbXAoKS5pZCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGN1cnJlbnRNYXBwaW5ncyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldFNvdXJjZVR5cGUodHlwZTogRHJvcGRvd25Tb3VyY2VUeXBlKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdzdGF0aWMnKSB7XG4gICAgICB0aGlzLmxhc3RMb2FkZWRLZXkgPSAnJztcbiAgICAgIHRoaXMuY29sdW1uc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMucGFyYW1zU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5lbnRpdHlDb2x1bW5zLnNldChbXSk7XG4gICAgICB0aGlzLnByb2NlZHVyZVBhcmFtZXRlcnMuc2V0KFtdKTtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgICAgc291cmNlVHlwZTogJ3N0YXRpYycsXG4gICAgICAgIGRpc3BsYXlGaWVsZDogJycsXG4gICAgICAgIHZhbHVlRmllbGQ6ICcnLFxuICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nczoge30sXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbGxFbnRpdGllcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2FkRW50aXRpZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RW50aXR5ID0gdGhpcy5jb21wKCkuZGF0YVNvdXJjZT8uZW50aXR5TmFtZTtcbiAgICBjb25zdCBpc1ZhbGlkRm9yVHlwZSA9XG4gICAgICB0eXBlID09PSAndGFibGUnXG4gICAgICAgID8gdGhpcy5hdmFpbGFibGVUYWJsZXMoKS5zb21lKCh0KSA9PiB0Lm5hbWUgPT09IGN1cnJlbnRFbnRpdHkpXG4gICAgICAgIDogdGhpcy5hdmFpbGFibGVQcm9jZWR1cmVzKCkuc29tZSgocCkgPT4gcC5uYW1lID09PSBjdXJyZW50RW50aXR5KTtcblxuICAgIHRoaXMubGFzdExvYWRlZEtleSA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgIHNvdXJjZVR5cGU6IHR5cGUsXG4gICAgICBlbnRpdHlOYW1lOiBpc1ZhbGlkRm9yVHlwZSA/IChjdXJyZW50RW50aXR5IHx8ICcnKSA6ICcnLFxuICAgICAgc2NoZW1hOiAnZGJvJyxcbiAgICAgIGRpc3BsYXlGaWVsZDogJycsXG4gICAgICB2YWx1ZUZpZWxkOiAnJyxcbiAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBpc1ZhbGlkRm9yVHlwZSA/ICh0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5wYXJhbWV0ZXJNYXBwaW5ncyA/PyB7fSkgOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRW50aXR5U2VsZWN0ZWQoZW50aXR5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaXNEaWZmZXJlbnQgPSBlbnRpdHlOYW1lICE9PSB0aGlzLmNvbXAoKS5kYXRhU291cmNlPy5lbnRpdHlOYW1lO1xuICAgIGlmIChpc0RpZmZlcmVudCkge1xuICAgICAgdGhpcy5sYXN0TG9hZGVkS2V5ID0gJyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZS5lbWl0KHtcbiAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICBzb3VyY2VUeXBlOiB0aGlzLmN1cnJlbnRTb3VyY2VUeXBlKCksXG4gICAgICBlbnRpdHlOYW1lLFxuICAgICAgc2NoZW1hOiAnZGJvJyxcbiAgICAgIHZhbHVlRmllbGQ6ICcnLFxuICAgICAgZGlzcGxheUZpZWxkOiAnJyxcbiAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBpc0RpZmZlcmVudCA/IHt9IDogKHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LnBhcmFtZXRlck1hcHBpbmdzID8/IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmFsdWVGaWVsZENoYW5nZWQodmFsdWVGaWVsZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgIHZhbHVlRmllbGQsXG4gICAgfSk7XG4gIH1cblxuICBvbkRpc3BsYXlGaWVsZENoYW5nZWQoZGlzcGxheUZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZSA/PyB7IGRpc3BsYXlGaWVsZDogJycsIHZhbHVlRmllbGQ6ICcnIH0pLFxuICAgICAgZGlzcGxheUZpZWxkLFxuICAgIH0pO1xuICB9XG5cbiAgb25EZXBlbmRzT25DaGFuZ2VkKHBhcmVudEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2UgPz8geyBkaXNwbGF5RmllbGQ6ICcnLCB2YWx1ZUZpZWxkOiAnJyB9KSxcbiAgICAgIGRlcGVuZHNPbjogcGFyZW50S2V5ID8gW3BhcmVudEtleV0gOiBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBhcmFtVmFsdWUocGFyYW1OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBjb25zdCBjbGVhbiA9IHBhcmFtTmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICBjb25zdCBtYXBwaW5ncyA9IHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LnBhcmFtZXRlck1hcHBpbmdzID8/IHt9O1xuICAgIHJldHVybiAoXG4gICAgICBtYXBwaW5nc1twYXJhbU5hbWVdID8/XG4gICAgICBtYXBwaW5nc1tjbGVhbl0gPz9cbiAgICAgIG1hcHBpbmdzW2BAJHtjbGVhbn1gXSA/P1xuICAgICAgJydcbiAgICApO1xuICB9XG5cbiAgc2V0UGFyYW1WYWx1ZShwYXJhbU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhbiA9IHBhcmFtTmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHsgLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LnBhcmFtZXRlck1hcHBpbmdzID8/IHt9KSB9O1xuICAgIGV4aXN0aW5nW3BhcmFtTmFtZV0gPSB2YWx1ZTtcbiAgICBleGlzdGluZ1tjbGVhbl0gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UuZW1pdCh7XG4gICAgICAuLi4odGhpcy5jb21wKCkuZGF0YVNvdXJjZSA/PyB7IGRpc3BsYXlGaWVsZDogJycsIHZhbHVlRmllbGQ6ICcnIH0pLFxuICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IGV4aXN0aW5nLFxuICAgIH0pO1xuICB9XG5cbiAgb25QYXJhbUxpbmtlZEZpZWxkQ2hhbmdlKGV2dDogeyBwYXJhbU5hbWU6IHN0cmluZzsgZmllbGRLZXk6IHN0cmluZzsgaXNMaW5rZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnREZXBlbmRzT24gPSBbLi4uKHRoaXMuY29tcCgpLmRhdGFTb3VyY2U/LmRlcGVuZHNPbiA/PyBbXSldO1xuICAgIGlmIChldnQuaXNMaW5rZWQgJiYgZXZ0LmZpZWxkS2V5KSB7XG4gICAgICBpZiAoIWN1cnJlbnREZXBlbmRzT24uaW5jbHVkZXMoZXZ0LmZpZWxkS2V5KSkge1xuICAgICAgICBjdXJyZW50RGVwZW5kc09uLnB1c2goZXZ0LmZpZWxkS2V5KTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlLmVtaXQoe1xuICAgICAgICAgIC4uLih0aGlzLmNvbXAoKS5kYXRhU291cmNlID8/IHsgZGlzcGxheUZpZWxkOiAnJywgdmFsdWVGaWVsZDogJycgfSksXG4gICAgICAgICAgZGVwZW5kc09uOiBjdXJyZW50RGVwZW5kc09uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTdGF0aWNPcHRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IFsuLi50aGlzLnN0YXRpY09wdGlvbnMoKV07XG4gICAgY29uc3QgbmV4dElkeCA9IGN1cnJlbnQubGVuZ3RoICsgMTtcbiAgICBjdXJyZW50LnB1c2goeyBrZXk6IFN0cmluZyhuZXh0SWR4KSwgbGFiZWw6IGBPcHRpb24gJHtuZXh0SWR4fWAgfSk7XG4gICAgdGhpcy51cGRhdGVQcm9wZXJ0eS5lbWl0KHsga2V5OiAnb3B0aW9ucycsIHZhbHVlOiBjdXJyZW50IH0pO1xuICB9XG5cbiAgdXBkYXRlU3RhdGljT3B0aW9uKGluZGV4OiBudW1iZXIsIGZpZWxkOiAna2V5JyB8ICdsYWJlbCcsIHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IFsuLi50aGlzLnN0YXRpY09wdGlvbnMoKV07XG4gICAgaWYgKGN1cnJlbnRbaW5kZXhdKSB7XG4gICAgICBjdXJyZW50W2luZGV4XSA9IHsgLi4uY3VycmVudFtpbmRleF0sIFtmaWVsZF06IHZhbCB9O1xuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eS5lbWl0KHsga2V5OiAnb3B0aW9ucycsIHZhbHVlOiBjdXJyZW50IH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0YXRpY09wdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGljT3B0aW9ucygpLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgIHRoaXMudXBkYXRlUHJvcGVydHkuZW1pdCh7IGtleTogJ29wdGlvbnMnLCB2YWx1ZTogY3VycmVudCB9KTtcbiAgfVxufVxuXG4iLCIgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICA8IS0tIDEuIEhlYWRlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRhc291cmNlLWhlYWRlci1iYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+T3B0aW9ucyBEYXRhIFNvdXJjZTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gMi4gU291cmNlIFR5cGUgU2VnbWVudGVkIFN3aXRjaGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS10eXBlLXN3aXRjaGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInNvdXJjZS10YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICd0YWJsZSdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTb3VyY2VUeXBlKCd0YWJsZScpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidGFibGVcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgPHNwYW4+VGFibGUgLyBWaWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic291cmNlLXRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3Byb2NlZHVyZSdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTb3VyY2VUeXBlKCdwcm9jZWR1cmUnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNvZGVcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgPHNwYW4+U3RvcmVkIFByb2M8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjdXJyZW50U291cmNlVHlwZSgpID09PSAnc3RhdGljJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFNvdXJjZVR5cGUoJ3N0YXRpYycpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZWRpdFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICA8c3Bhbj5TdGF0aWMgTGlzdDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSAzQS4gREFUQUJBU0UgVEFCTEUgLyBWSUVXIENPTkZJR1VSQVRJT04gLS0+XG4gICAgICBAaWYgKGN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICd0YWJsZScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RGF0YWJhc2UgVGFibGUgLyBWaWV3PC9sYWJlbD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXJlZnJlc2gtZW50aXRpZXNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEVudGl0aWVzKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIlJlZnJlc2ggYXZhaWxhYmxlIHRhYmxlcyBmcm9tIGJhY2tlbmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlJlZnJlc2g8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cnB0LXNlYXJjaGFibGUtc2VsZWN0XG4gICAgICAgICAgICBbb3B0aW9uc109XCJ0YWJsZVNlbGVjdE9wdGlvbnMoKVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEVudGl0eSgpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRW50aXR5U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nRW50aXRpZXMoKVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdFbnRpdGllcygpXCJcbiAgICAgICAgICAgIFtsb2FkaW5nVGV4dF09XCInTG9hZGluZyB0YWJsZXMgZnJvbSBkYXRhYmFzZS4uLidcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImF2YWlsYWJsZVRhYmxlcygpLmxlbmd0aCA9PT0gMCA/ICctLSBObyB0YWJsZXMgZm91bmQgKENsaWNrIFJlZnJlc2gpIC0tJyA6ICctLSBDaG9vc2UgRGF0YSBUYWJsZSAtLSdcIlxuICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2ggdGFibGVzICYgdmlld3MuLi5cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRFbnRpdHkoKSkge1xuICAgICAgICAgIDwhLS0gRGlzcGxheSBGaWVsZCAoVmlzaWJsZSB0ZXh0KSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RGlzcGxheSBGaWVsZCAoVmlzaWJsZSBUZXh0KTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxycHQtc2VhcmNoYWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZGlzcGxheUZpZWxkU2VsZWN0T3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREaXNwbGF5RmllbGQoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlzcGxheUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBTZWxlY3QgRGlzcGxheSBDb2x1bW4gLS1cIlxuICAgICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcj1cIlNlYXJjaCBjb2x1bW5zLi4uXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFZhbHVlIEZpZWxkIChTdG9yZWQga2V5KSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+VmFsdWUgRmllbGQgKFN0b3JlZCBLZXkpPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHJwdC1zZWFyY2hhYmxlLXNlbGVjdFxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJ2YWx1ZUZpZWxkU2VsZWN0T3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRWYWx1ZUZpZWxkKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblZhbHVlRmllbGRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIi0tIFNlbGVjdCBLZXkgQ29sdW1uIC0tXCJcbiAgICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2ggY29sdW1ucy4uLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBDYXNjYWRpbmcgRHJvcGRvd24gRGVwZW5kZW5jeSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRlcGVuZGVudCBPbiAoQ2FzY2FkaW5nIFBhcmVudCBGaWVsZCk8L2xhYmVsPlxuICAgICAgICAgICAgPHJwdC1zZWFyY2hhYmxlLXNlbGVjdFxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJwYXJlbnRGaWVsZFNlbGVjdE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRGVwZW5kc09uKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkRlcGVuZHNPbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiLS0gTm9uZSAoSW5kZXBlbmRlbnQpIC0tXCJcbiAgICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2ggY2FudmFzIGZpZWxkcy4uLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1oaW50XCI+XG4gICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgcmUtcXVlcmllcyBvcHRpb25zIHdoZW4gcGFyZW50IGZpZWxkIGNoYW5nZXMuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSAzQi4gU1RPUkVEIFBST0NFRFVSRSBDT05GSUdVUkFUSU9OIC0tPlxuICAgICAgQGlmIChjdXJyZW50U291cmNlVHlwZSgpID09PSAncHJvY2VkdXJlJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TdG9yZWQgUHJvY2VkdXJlPC9sYWJlbD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXJlZnJlc2gtZW50aXRpZXNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEVudGl0aWVzKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIlJlZnJlc2ggYXZhaWxhYmxlIHByb2NlZHVyZXMgZnJvbSBiYWNrZW5kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJyZWZyZXNoXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5SZWZyZXNoPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHJwdC1zZWFyY2hhYmxlLXNlbGVjdFxuICAgICAgICAgICAgW29wdGlvbnNdPVwicHJvY2VkdXJlU2VsZWN0T3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRW50aXR5KClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25FbnRpdHlTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdFbnRpdGllcygpXCJcbiAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ0VudGl0aWVzKClcIlxuICAgICAgICAgICAgW2xvYWRpbmdUZXh0XT1cIidMb2FkaW5nIHN0b3JlZCBwcm9jZWR1cmVzIGZyb20gZGF0YWJhc2UuLi4nXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJhdmFpbGFibGVQcm9jZWR1cmVzKCkubGVuZ3RoID09PSAwID8gJy0tIE5vIHN0b3JlZCBwcm9jZWR1cmVzIGZvdW5kIChDbGljayBSZWZyZXNoKSAtLScgOiAnLS0gQ2hvb3NlIERhdGEgUXVlcnkgLyBTUCAtLSdcIlxuICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmVkIHByb2NlZHVyZXMuLi5cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoc2VsZWN0ZWRFbnRpdHkoKSkge1xuICAgICAgICAgIDwhLS0gVmlzdWFsIFBhcmFtZXRlciBMaW5rZXJzIC0tPlxuICAgICAgICAgIEBpZiAocHJvY2VkdXJlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcC1wYXJhbXMtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcmFtcy1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Qcm9jZWR1cmUgSW5wdXQgUGFyYW1ldGVyczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hdXRvLXBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXV0b1dpcmVBbGxQYXJhbWV0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBdXRvLWRldGVjdCBzZXNzaW9uIHBhcmFtZXRlcnMgYW5kIGFkZCBtaXNzaW5nIGZpbHRlciBjb250cm9scyB0byB0aGUgY2FudmFzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+QXV0by1XaXJlIENhbnZhcyBJbnB1dHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIEBmb3IgKHBhcmFtIG9mIHByb2NlZHVyZVBhcmFtZXRlcnMoKTsgdHJhY2sgcGFyYW0ubmFtZSkge1xuICAgICAgICAgICAgICAgIDxycHQtcGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yXG4gICAgICAgICAgICAgICAgICBbcGFyYW1dPVwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZV09XCJnZXRQYXJhbVZhbHVlKHBhcmFtLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgIFthbGxDb21wb25lbnRzXT1cImFsbENvbXBvbmVudHMoKVwiXG4gICAgICAgICAgICAgICAgICBbY3VycmVudENvbXBvbmVudElkXT1cImNvbXAoKS5pZFwiXG4gICAgICAgICAgICAgICAgICBbaXNBZHZhbmNlZE1vZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwic2V0UGFyYW1WYWx1ZShwYXJhbS5uYW1lLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChsaW5rZWRGaWVsZENoYW5nZSk9XCJvblBhcmFtTGlua2VkRmllbGRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBEaXNwbGF5IEZpZWxkIChWaXNpYmxlIHRleHQpIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EaXNwbGF5IEZpZWxkIChmcm9tIFNQIHJlc3VsdCk8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGVudGl0eUNvbHVtbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxycHQtc2VhcmNoYWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJkaXNwbGF5RmllbGRTZWxlY3RPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRGlzcGxheUZpZWxkKClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlzcGxheUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIi0tIFNlbGVjdCBEaXNwbGF5IENvbHVtbiAtLVwiXG4gICAgICAgICAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2ggY29sdW1ucy4uLlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIG5hbWUgKGxlYXZlIGJsYW5rIGZvciBhdXRvKVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWREaXNwbGF5RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EaXNwbGF5RmllbGRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBWYWx1ZSBGaWVsZCAoU3RvcmVkIGtleSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlZhbHVlIEZpZWxkIChmcm9tIFNQIHJlc3VsdCk8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGVudGl0eUNvbHVtbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxycHQtc2VhcmNoYWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ2YWx1ZUZpZWxkU2VsZWN0T3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFZhbHVlRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIi0tIFNlbGVjdCBLZXkgQ29sdW1uIC0tXCJcbiAgICAgICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcj1cIlNlYXJjaCBjb2x1bW5zLi4uXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb2x1bW4gbmFtZSAobGVhdmUgYmxhbmsgZm9yIGF1dG8pXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFZhbHVlRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUZpZWxkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIDNDLiBTVEFUSUMgT1BUSU9OUyBFRElUT1IgLS0+XG4gICAgICBAaWYgKGN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0aWMtb3B0aW9ucy13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRpYy1vcHRpb25zLWhlYWRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlN0YXRpYyBPcHRpb25zPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tYWRkLW9wdGlvblwiIChjbGljayk9XCJhZGRTdGF0aWNPcHRpb24oKVwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkFkZCBPcHRpb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0aWMtb3B0aW9ucy1saXN0XCI+XG4gICAgICAgICAgICBAZm9yIChvcHQgb2Ygc3RhdGljT3B0aW9ucygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRpYy1vcHRpb24tcm93XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG9wdC1rZXlcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJLZXlcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0LmtleVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVTdGF0aWNPcHRpb24oJGluZGV4LCAna2V5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXQgb3B0LWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVN0YXRpY09wdGlvbigkaW5kZXgsICdsYWJlbCcsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1yZW1vdmUtb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTdGF0aWNPcHRpb24oJGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSBvcHRpb25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj4iXX0=
|