bways-report 0.2.1 → 0.2.2
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 +18 -0
- package/esm2022/lib/core/config/bways-report-config.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +1 -44
- package/esm2022/lib/core/utils/report-parameter.util.mjs +14 -2
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +55 -2
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +9 -7
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +7 -14
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +11 -11
- package/esm2022/lib/features/designer/designer.component.mjs +3 -3
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +5 -3
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +4 -4
- package/fesm2022/bways-report.mjs +94 -81
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +3 -0
- package/lib/core/services/report-session-context.service.d.ts +0 -5
- package/lib/core/utils/report-parameter.util.d.ts +2 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +7 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +1 -0
- package/package.json +1 -1
- package/styles/theme.css +9 -12
package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getFieldCaseInsensitive } from '../../../../core/utils/data-normalization.util';
|
|
1
2
|
import { DesignerEndpointsService } from '../../services/designer-endpoints.service';
|
|
2
3
|
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';
|
|
3
4
|
import { CommonModule } from '@angular/common';
|
|
@@ -7,7 +8,7 @@ import { BWAYS_REPORT_ENDPOINTS } from '../../../../data-access/adapters/endpoin
|
|
|
7
8
|
import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
|
|
8
9
|
import { RptSearchableSelectComponent, } from '../../../../primitives/components';
|
|
9
10
|
import { ParameterBindingEditorComponent } from './parameter-binding-editor.component';
|
|
10
|
-
import { parseSqlExecStatement } from '../../../../core/utils/report-parameter.util';
|
|
11
|
+
import { parseSqlExecStatement, setParameterMapping } from '../../../../core/utils/report-parameter.util';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
import * as i1 from "@angular/forms";
|
|
13
14
|
export class PropertyEditorGridComponent {
|
|
@@ -121,13 +122,10 @@ export class PropertyEditorGridComponent {
|
|
|
121
122
|
if (parsed.procedureName && parsed.procedureName.toLowerCase() !== this.activeEntityName().toLowerCase()) {
|
|
122
123
|
this.onSelectEntity(parsed.procedureName);
|
|
123
124
|
}
|
|
124
|
-
|
|
125
|
+
let currentMappings = { ...(this.dataSource()?.parameterMappings || {}) };
|
|
125
126
|
let count = 0;
|
|
126
127
|
for (const [key, val] of Object.entries(parsed.parameters)) {
|
|
127
|
-
|
|
128
|
-
currentMappings[key] = val;
|
|
129
|
-
currentMappings[cleanKey] = val;
|
|
130
|
-
currentMappings[`@${cleanKey}`] = val;
|
|
128
|
+
currentMappings = setParameterMapping(currentMappings, key, val);
|
|
131
129
|
count++;
|
|
132
130
|
}
|
|
133
131
|
this.updateDataSourceParameters.emit(currentMappings);
|
|
@@ -258,19 +256,14 @@ export class PropertyEditorGridComponent {
|
|
|
258
256
|
}
|
|
259
257
|
getParameterValue(paramName) {
|
|
260
258
|
const mappings = this.dataSource()?.parameterMappings || {};
|
|
261
|
-
const
|
|
262
|
-
const val = mappings[paramName] ?? mappings[`@${cleanName}`] ?? mappings[cleanName];
|
|
259
|
+
const val = getFieldCaseInsensitive(mappings, paramName);
|
|
263
260
|
if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {
|
|
264
261
|
return val;
|
|
265
262
|
}
|
|
266
263
|
return '';
|
|
267
264
|
}
|
|
268
265
|
onParameterChange(paramName, value) {
|
|
269
|
-
const current =
|
|
270
|
-
const cleanName = paramName.replace(/^@/, '');
|
|
271
|
-
current[paramName] = value;
|
|
272
|
-
current[`@${cleanName}`] = value;
|
|
273
|
-
current[cleanName] = value;
|
|
266
|
+
const current = setParameterMapping(this.dataSource()?.parameterMappings, paramName, value);
|
|
274
267
|
this.updateDataSourceParameters.emit(current);
|
|
275
268
|
}
|
|
276
269
|
onUpdateCol(index, field, value) {
|
|
@@ -357,4 +350,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
357
350
|
RptSearchableSelectComponent,
|
|
358
351
|
], changeDetection: ChangeDetectionStrategy.OnPush, template: " @if (!grid()) {\n <div class=\"empty-grid-card\">\n <div class=\"empty-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"28\" />\n </div>\n <h4 class=\"empty-grid-title\">No Result Grid Attached</h4>\n <p class=\"empty-grid-desc\">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>\n <button type=\"button\" class=\"btn-create-grid-action\" (click)=\"addGrid.emit()\">\n <rpt-icon name=\"plus\" [size]=\"14\" />\n <span>+ Add Result Grid</span>\n </button>\n </div>\n } @else {\n <div class=\"props-form\">\n <!-- 1. Report Data Source & Stored Procedure Configuration -->\n <div class=\"property-group\">\n <div class=\"group-header-row\">\n <div class=\"group-title-wrap\">\n <span class=\"group-title\">Report Data Source</span>\n @if (activeEntityName()) {\n <span class=\"group-badge active-ds-badge\">{{ activeEntityName() }}</span>\n }\n </div>\n </div>\n\n <!-- Source Type Switcher (Stored Procedure vs Table vs REST API) -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'stored_procedure'\"\n (click)=\"onSourceTypeChange('stored_procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>Stored Procedure</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"onSourceTypeChange('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() === 'api'\"\n (click)=\"onSourceTypeChange('api')\"\n >\n <rpt-icon name=\"globe\" [size]=\"12\" />\n <span>REST API</span>\n </button>\n </div>\n\n @if (currentSourceType() === 'api') {\n <!-- API Endpoint Selector / Input -->\n <div class=\"field-row\">\n <label class=\"field-label\">API Endpoint URL</label>\n @if (registeredApis().length > 0) {\n <div style=\"margin-bottom: 6px;\">\n <rpt-searchable-select\n [options]=\"registeredApis()\"\n [ngModel]=\"apiEndpoint()\"\n (ngModelChange)=\"onApiEndpointChange($event)\"\n placeholder=\"-- Select Registered Endpoint or type below --\"\n searchPlaceholder=\"Search registered APIs...\"\n />\n </div>\n }\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"e.g. /api/v1/orders or https://api.service.com/data\"\n [ngModel]=\"apiEndpoint()\"\n (ngModelChange)=\"onApiEndpointChange($event)\"\n />\n <span class=\"field-hint\" style=\"font-size: 11px; color: var(--rpt-color-text-muted, #64748b); margin-top: 4px; display: block;\">\n Direct HTTP call or backend proxy. Use <code>:param</code> for route tokens.\n </span>\n </div>\n\n <!-- HTTP Method & Data Path Grid -->\n <div class=\"field-grid-2\" style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 8px;\">\n <div class=\"field-row\">\n <label class=\"field-label\">HTTP Method</label>\n <select\n class=\"form-control\"\n [ngModel]=\"apiMethod()\"\n (ngModelChange)=\"onApiMethodChange($event)\"\n >\n <option value=\"GET\">GET (Query String)</option>\n <option value=\"POST\">POST (Body Payload)</option>\n </select>\n </div>\n <div class=\"field-row\">\n <label class=\"field-label\">Response Data Path</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"e.g. data.items, rows\"\n [ngModel]=\"apiDataPath()\"\n (ngModelChange)=\"onApiDataPathChange($event)\"\n />\n </div>\n </div>\n\n <!-- Use Proxy Toggle -->\n <div class=\"field-row checkbox-field-row\" style=\"margin-top: 4px;\">\n <label class=\"checkbox-label\" style=\"display: flex; align-items: center; gap: 6px; font-size: 12px; cursor: pointer;\">\n <input\n type=\"checkbox\"\n [checked]=\"apiUseProxy()\"\n (change)=\"onApiUseProxyChange($any($event.target).checked)\"\n />\n <span class=\"checkbox-text\">Route through backend proxy (bypasses CORS / hides credentials)</span>\n </label>\n </div>\n } @else {\n <!-- Entity Selector Dropdown -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ currentSourceType() === 'stored_procedure' ? 'Stored Procedure' : 'Table / View' }}\n </label>\n <rpt-searchable-select\n [options]=\"gridEntitySelectOptions()\"\n [ngModel]=\"activeEntityName()\"\n (ngModelChange)=\"onSelectEntity($event)\"\n placeholder=\"-- Choose Data Source --\"\n [searchPlaceholder]=\"currentSourceType() === 'stored_procedure' ? 'Search procedures...' : 'Search tables & views...'\"\n />\n </div>\n }\n\n <!-- Stored Procedure Parameter Mappings -->\n @if (currentSourceType() === 'stored_procedure' && activeEntityName()) {\n <div class=\"procedure-params-section\">\n <div class=\"params-section-header\">\n <div class=\"params-header-left\">\n <span class=\"params-title\">Procedure Parameters</span>\n <span class=\"params-count-badge\">{{ effectiveParameters().length }}</span>\n </div>\n <button\n type=\"button\"\n class=\"btn-paste-exec\"\n (click)=\"toggleExecSnippet()\"\n title=\"Paste full SSMS 'EXEC proc @param=val' snippet to fill parameters automatically\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isExecSnippetOpen() ? 'Close SQL' : 'Paste SQL Exec' }}</span>\n </button>\n </div>\n\n @if (isExecSnippetOpen()) {\n <div class=\"exec-snippet-panel\">\n <div class=\"exec-snippet-header\">\n <span class=\"snippet-hint\">Paste full <code>EXEC ProcedureName @param=val...</code> statement from SSMS:</span>\n </div>\n <textarea\n class=\"exec-snippet-textarea\"\n rows=\"3\"\n placeholder=\"e.g. exec Get_HelpList @chrCOMPANYID=N'101',@chrTableName=N'MSTACCTGLSUB'...\"\n [ngModel]=\"execSnippetText()\"\n (ngModelChange)=\"execSnippetText.set($event)\"\n ></textarea>\n <div class=\"exec-snippet-actions\">\n <button type=\"button\" class=\"btn-snippet-apply\" (click)=\"applyExecSnippet()\">\n <rpt-icon name=\"check\" [size]=\"12\" />\n <span>Apply Parameters</span>\n </button>\n <button type=\"button\" class=\"btn-snippet-cancel\" (click)=\"toggleExecSnippet()\">\n Cancel\n </button>\n </div>\n @if (execParseStatus()) {\n <div class=\"snippet-status\" [class.is-error]=\"execParseStatus()?.kind === 'error'\" [class.is-success]=\"execParseStatus()?.kind === 'success'\">\n {{ execParseStatus()?.message }}\n </div>\n }\n </div>\n }\n\n @if (effectiveParameters().length > 0) {\n <div class=\"param-cards-list\">\n @for (param of effectiveParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParameterValue(param.name)\"\n [allComponents]=\"allComponents()\"\n (valueChange)=\"onParameterChange(param.name, $event)\"\n />\n }\n </div>\n } @else {\n <div class=\"empty-params-hint\">\n <span>No required parameters for this procedure.</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- 2. Result Columns Configuration -->\n <div class=\"property-group\">\n <div class=\"group-header-row\">\n <div class=\"group-title-wrap\">\n <span class=\"group-title\">Columns</span>\n <span class=\"group-badge\">{{ columns().length }}</span>\n </div>\n </div>\n\n <!-- Dedicated Full-Width Action Buttons (No cramping) -->\n <div class=\"columns-action-bar\">\n <button\n type=\"button\"\n class=\"btn-col-action btn-auto-detect\"\n (click)=\"autoDetectColumns.emit()\"\n [disabled]=\"isDetecting()\"\n title=\"Auto-detect all columns from procedure or data table\"\n >\n <rpt-icon name=\"refresh\" [size]=\"12\" [class.rpt-spin]=\"isDetecting()\" />\n <span>{{ isDetecting() ? 'Detecting...' : 'Auto-Detect' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"btn-col-action btn-add-col\"\n (click)=\"addColumn.emit()\"\n title=\"Add a new column manually\"\n >\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>+ Add Column</span>\n </button>\n </div>\n\n @if (statusMessage()) {\n <div class=\"col-status-banner\" [class.is-error]=\"statusKind() === 'error'\" [class.is-success]=\"statusKind() === 'success'\">\n <rpt-icon [name]=\"statusKind() === 'error' ? 'close' : 'check'\" [size]=\"12\" />\n <span>{{ statusMessage() }}</span>\n </div>\n }\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">\u22EE\u22EE</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.checkboxSelection ?? false\"\n (ngModelChange)=\"onUpdateCol(idx, 'checkboxSelection', $event)\"\n />\n <span>Checkbox</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.sideBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'sideBar', value: $event })\"\n />\n <span>Enable Side Panel (Tool Panels)</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.globalSearch !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'globalSearch', value: $event })\"\n />\n <span>Global Search Box</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.statusBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'statusBar', value: $event })\"\n />\n <span>Status Bar</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n @if (grid()?.options?.selectable ?? true) {\n <div class=\"field-row\">\n <label class=\"field-label\">Selection Mode</label>\n <select\n class=\"field-input\"\n [ngModel]=\"grid()?.options?.selectionMode ?? grid()?.options?.rowSelection ?? 'multiple'\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectionMode', value: $event })\"\n >\n <option value=\"multiple\">Multiple Rows</option>\n <option value=\"single\">Single Row</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.checkboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'checkboxSelection', value: $event })\"\n />\n <span>Checkbox Selection</span>\n </label>\n </div>\n\n @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.headerCheckboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'headerCheckboxSelection', value: $event })\"\n />\n <span>Header Select All Checkbox</span>\n </label>\n </div>\n }\n }\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"1\"\n max=\"1000\"\n (wheel)=\"$any($event.target).blur()\"\n (keydown.arrowup)=\"$event.preventDefault()\"\n (keydown.arrowdown)=\"$event.preventDefault()\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n\n <!-- Row Click & Drill-Down Action Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Row Click & Drill-Down</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"hasRowClickAction()\"\n (ngModelChange)=\"toggleRowClickAction($event)\"\n />\n <span>Enable Row Click Action</span>\n </label>\n </div>\n\n @if (hasRowClickAction()) {\n <div class=\"field-row\">\n <label class=\"field-label\">Action Type</label>\n <select\n class=\"field-input field-select\"\n [ngModel]=\"rowClickAction()?.type || 'open-drawer'\"\n (ngModelChange)=\"updateRowActionField('type', $event)\"\n >\n <option value=\"open-drawer\">Slide-Over Detail Drawer</option>\n <option value=\"drilldown-report\">Drill-Down Report (Host Event)</option>\n <option value=\"navigate\">Navigate to URL</option>\n <option value=\"emit-custom\">Emit Custom Action</option>\n </select>\n </div>\n\n @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target Report ID</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. order-details\"\n [ngModel]=\"rowClickAction()?.targetReportId || ''\"\n (ngModelChange)=\"updateRowActionField('targetReportId', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Title</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Order Details\"\n [ngModel]=\"rowClickAction()?.drawerTitle || ''\"\n (ngModelChange)=\"updateRowActionField('drawerTitle', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 760px, 80%, 900px\"\n [ngModel]=\"rowClickAction()?.drawerWidth || '760px'\"\n (ngModelChange)=\"updateRowActionField('drawerWidth', $event)\"\n />\n </div>\n }\n\n @if (rowClickAction()?.type === 'navigate') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target URL</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"'/orders/{{row.orderId}} or https://...'\"\n [ngModel]=\"rowClickAction()?.targetUrl || ''\"\n (ngModelChange)=\"updateRowActionField('targetUrl', $event)\"\n />\n </div>\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"rowClickAction()?.openNewTab ?? false\"\n (ngModelChange)=\"updateRowActionField('openNewTab', $event)\"\n />\n <span>Open in New Tab</span>\n </label>\n </div>\n }\n\n @if (rowClickAction()?.type === 'emit-custom') {\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Action Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. view-audit-trail\"\n [ngModel]=\"rowClickAction()?.customActionName || ''\"\n (ngModelChange)=\"updateRowActionField('customActionName', $event)\"\n />\n </div>\n }\n\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Parameter Mapping</label>\n <button\n type=\"button\"\n class=\"btn-add-mapping\"\n (click)=\"addParameterMapping()\"\n >\n + Add Mapping\n </button>\n </div>\n\n @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {\n <div class=\"mapping-pair-row\">\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Target (e.g. customerId)\"\n [ngModel]=\"mapping.key\"\n (ngModelChange)=\"updateMappingKey(mIdx, $event)\"\n />\n <span style=\"font-size: 0.75rem; color: #94a3b8;\">\u2190</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Source (e.g. row.id)\"\n [ngModel]=\"mapping.value\"\n (ngModelChange)=\"updateMappingValue(mIdx, $event)\"\n />\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeMapping(mIdx)\"\n title=\"Remove mapping\"\n >\n <rpt-icon name=\"trash\" [size]=\"11\" />\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Remove Grid Action -->\n <div class=\"grid-danger-zone\">\n <button type=\"button\" class=\"btn-remove-grid-action\" (click)=\"removeGrid.emit()\">\n <rpt-icon name=\"trash\" [size]=\"13\" />\n <span>Remove Grid from Report</span>\n </button>\n </div>\n </div>\n }", 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;line-height:1.2}.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", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.group-title-wrap{display:flex;align-items:center;gap:6px}.group-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:10px;padding:1px 6px}.columns-action-bar{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px}.btn-col-action{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 8px;font-size:.725rem;font-weight:600;border-radius:6px;cursor:pointer;white-space:nowrap;transition:all .12s ease;box-sizing:border-box}.btn-col-action:disabled{opacity:.6;cursor:not-allowed}.btn-auto-detect{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb}.btn-auto-detect:hover:not(:disabled){background:#2563eb;color:#fff;border-color:#2563eb}.btn-add-col{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);color:#334155}.btn-add-col:hover{background:#f8fafc;border-color:#94a3b8;color:#0f172a}.col-status-banner{display:flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;font-size:.72rem;line-height:1.35;margin-bottom:10px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1}.col-status-banner.is-success{background:#f0fdf4;color:#166534;border-color:#bbf7d0}.col-status-banner.is-error{background:#fef2f2;color:#991b1b;border-color:#fecaca}@keyframes rpt-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rpt-spin{animation:rpt-spin 1s linear infinite}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-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.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 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}.active-ds-badge{background:#eff6ff;color:#2563eb;font-size:.65rem;font-weight:700;padding:1px 6px;border-radius:4px;border:1px solid #bfdbfe;max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-type-switcher{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:2px;gap:2px;margin-bottom:12px}.source-tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:6px 4px;font-size:.725rem;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 #0000000f}.procedure-params-section{margin-top:14px;padding:0;background:transparent;border:none}.params-section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.btn-paste-exec{display:inline-flex;align-items:center;gap:4px;font-size:.675rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:3px 8px;cursor:pointer;transition:all .12s ease}.btn-paste-exec:hover{background:#2563eb;color:#fff}.exec-snippet-panel{display:flex;flex-direction:column;gap:6px;background:#f8fafc;border:1px solid #cbd5e1;border-radius:6px;padding:8px 10px;margin-bottom:10px}.snippet-hint{font-size:.675rem;color:#475569}.snippet-hint code{background:#e2e8f0;padding:1px 4px;border-radius:3px;font-family:monospace}.exec-snippet-textarea{width:100%;box-sizing:border-box;font-family:monospace;font-size:.7rem;padding:6px 8px;border:1px solid #cbd5e1;border-radius:4px;background:#fff;resize:vertical;min-height:54px}.exec-snippet-actions{display:flex;align-items:center;gap:6px}.btn-snippet-apply{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;padding:4px 10px;background:#16a34a;color:#fff;border:none;border-radius:4px;cursor:pointer}.btn-snippet-apply:hover{background:#15803d}.btn-snippet-cancel{font-size:.7rem;padding:4px 8px;background:#f1f5f9;color:#475569;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer}.snippet-status{font-size:.675rem;padding:4px 6px;border-radius:4px}.snippet-status.is-success{background:#f0fdf4;color:#166534;border:1px solid #bbf7d0}.snippet-status.is-error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.param-cards-list{display:flex;flex-direction:column;gap:10px;width:100%;box-sizing:border-box}.empty-params-hint{font-size:.725rem;color:#64748b;font-style:italic;padding:12px;text-align:center;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:6px}\n"] }]
|
|
359
352
|
}], ctorParameters: () => [] });
|
|
360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFDTCw0QkFBNEIsR0FFN0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7O0FBZ0Jy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cnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZXNpZ25lci1lbmRwb2ludHMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRlZmluaXRpb24sIEdyaWRSb3dDbGlja0FjdGlvbiwgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kYXRhc291cmNlLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IERhdGFiYXNlRW50aXR5TWV0YWRhdGEsIFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1kYXRhLWRpc2NvdmVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEJXQVlTX1JFUE9SVF9FTkRQT0lOVFMgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhLWFjY2Vzcy9hZGFwdGVycy9lbmRwb2ludC10b2tlbnMnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBScHRTZWFyY2hhYmxlU2VsZWN0Q29tcG9uZW50LFxuICBTZWFyY2hhYmxlU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQmluZGluZ0VkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vcGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBwYXJzZVNxbEV4ZWNTdGF0ZW1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL3JlcG9ydC1wYXJhbWV0ZXIudXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3ItZ3JpZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUnB0SWNvbkNvbXBvbmVudCxcbiAgICBQYXJhbWV0ZXJCaW5kaW5nRWRpdG9yQ29tcG9uZW50LFxuICAgIFJwdFNlYXJjaGFibGVTZWxlY3RDb21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcycsICcuL3Byb3BlcnR5LWVkaXRvci1ncmlkLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludFNjb3BlID0gaW5qZWN0KERlc2lnbmVyRW5kcG9pbnRzU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhRGlzY292ZXJ5ID0gaW5qZWN0KFJlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50cyA9IGluamVjdChCV0FZU19SRVBPUlRfRU5EUE9JTlRTLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGdyaWQgPSBpbnB1dDxSZXBvcnRHcmlkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZGF0YVNvdXJjZSA9IGlucHV0PFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBhdmFpbGFibGVFbnRpdGllcyA9IGlucHV0PERhdGFiYXNlRW50aXR5TWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBwcm9jZWR1cmVQYXJhbWV0ZXJzID0gaW5wdXQ8UHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gaW5wdXQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGlzRGV0ZWN0aW5nID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzdGF0dXNNZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHN0YXR1c0tpbmQgPSBpbnB1dDwnaW5mbycgfCAnc3VjY2VzcycgfCAnZXJyb3InIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgYWRkR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZW1vdmVHcmlkID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGFkZENvbHVtbiA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhdXRvRGV0ZWN0Q29sdW1ucyA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZW1vdmVDb2x1bW4gPSBvdXRwdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB1cGRhdGVDb2x1bW4gPSBvdXRwdXQ8eyBpbmRleDogbnVtYmVyOyBmaWVsZDogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICByZWFkb25seSB1cGRhdGVPcHRpb24gPSBvdXRwdXQ8eyBmaWVsZDogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICByZWFkb25seSB1cGRhdGVSb3dDbGlja0FjdGlvbiA9IG91dHB1dDxHcmlkUm93Q2xpY2tBY3Rpb24gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHNldERhdGFTb3VyY2UgPSBvdXRwdXQ8UmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IHVwZGF0ZURhdGFTb3VyY2VQYXJhbWV0ZXJzID0gb3V0cHV0PFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICByZWFkb25seSBlbnRpdHlDaGFuZ2VkID0gb3V0cHV0PHsgbmFtZTogc3RyaW5nOyB0eXBlOiAnc3RvcmVkX3Byb2NlZHVyZScgfCAndGFibGUnIHwgJ2FwaScgfT4oKTtcblxuICByZWFkb25seSBpbnRlcm5hbFBhcmFtZXRlcnMgPSBzaWduYWw8UHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGFbXT4oW10pO1xuXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZVBhcmFtZXRlcnMgPSBjb21wdXRlZDxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdPigoKSA9PiB7XG4gICAgY29uc3QgZnJvbVBhcmVudCA9IHRoaXMucHJvY2VkdXJlUGFyYW1ldGVycygpO1xuICAgIGlmIChmcm9tUGFyZW50ICYmIGZyb21QYXJlbnQubGVuZ3RoID4gMCkgcmV0dXJuIGZyb21QYXJlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxQYXJhbWV0ZXJzKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGludGVybmFsRW50aXRpZXMgPSBzaWduYWw8RGF0YWJhc2VFbnRpdHlNZXRhZGF0YVtdPihbXSk7XG5cbiAgcmVhZG9ubHkgYWxsRW50aXRpZXMgPSBjb21wdXRlZDxEYXRhYmFzZUVudGl0eU1ldGFkYXRhW10+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tUGFyZW50ID0gdGhpcy5hdmFpbGFibGVFbnRpdGllcygpO1xuICAgIGlmIChmcm9tUGFyZW50ICYmIGZyb21QYXJlbnQubGVuZ3RoID4gMCkgcmV0dXJuIGZyb21QYXJlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFbnRpdGllcygpO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVTb3VyY2VUeXBlID0gc2lnbmFsPCdzdG9yZWRfcHJvY2VkdXJlJyB8ICd0YWJsZScgfCAnYXBpJz4oJ3N0b3JlZF9wcm9jZWR1cmUnKTtcbiAgcmVhZG9ubHkgY3VycmVudFNvdXJjZVR5cGUgPSBjb21wdXRlZDwnc3RvcmVkX3Byb2NlZHVyZScgfCAndGFibGUnIHwgJ2FwaSc+KCgpID0+IHRoaXMuYWN0aXZlU291cmNlVHlwZSgpKTtcblxuICByZWFkb25seSBhY3RpdmVFbnRpdHlOYW1lID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBpZiAoIWRzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZHNUeXBlID0gZHMudHlwZSA9PT0gJ3RhYmxlJyA/ICd0YWJsZScgOiAoZHMudHlwZSA9PT0gJ2FwaScgPyAnYXBpJyA6ICdzdG9yZWRfcHJvY2VkdXJlJyk7XG4gICAgaWYgKGRzVHlwZSA9PT0gdGhpcy5hY3RpdmVTb3VyY2VUeXBlKCkpIHtcbiAgICAgIHJldHVybiBkcy5uYW1lIHx8IGRzLmVuZHBvaW50IHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFwaUVuZHBvaW50ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICByZXR1cm4gZHM/LmVuZHBvaW50IHx8IGRzPy5uYW1lIHx8ICcnO1xuICB9KTtcblxuICByZWFkb25seSBhcGlNZXRob2QgPSBjb21wdXRlZDwnR0VUJyB8ICdQT1NUJz4oKCkgPT4ge1xuICAgIGNvbnN0IG0gPSAodGhpcy5kYXRhU291cmNlKCk/Lm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gbSA9PT0gJ1BPU1QnID8gJ1BPU1QnIDogJ0dFVCc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFwaURhdGFQYXRoID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFTb3VyY2UoKSBhcyBhbnkpPy5kYXRhUGF0aCB8fCAnJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXBpVXNlUHJveHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFTb3VyY2UoKSBhcyBhbnkpPy51c2VQcm94eSA9PT0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcmVnaXN0ZXJlZEFwaXMgPSBjb21wdXRlZDxTZWFyY2hhYmxlU2VsZWN0T3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBhcGlzID0gdGhpcy5lbmRwb2ludHM/LmFwaUVuZHBvaW50cyB8fCBbXTtcbiAgICByZXR1cm4gYXBpcy5tYXAoKGFwaSkgPT4ge1xuICAgICAgY29uc3QgZXAgPSBhcGkuZW5kcG9pbnQgfHwgYXBpLnVybCB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBlcCxcbiAgICAgICAgbGFiZWw6IGFwaS5uYW1lIHx8IGVwLFxuICAgICAgICBzdWJsYWJlbDogYCR7YXBpLm1ldGhvZCB8fCAnR0VUJ30gJHtlcH1gLFxuICAgICAgICBiYWRnZTogYXBpLmNhdGVnb3J5IHx8ICdBUEknLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXZhaWxhYmxlVGFibGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmFsbEVudGl0aWVzKCkuZmlsdGVyKChlKSA9PiB7XG4gICAgICBjb25zdCB0ID0gKGUudHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0ID09PSAndGFibGUnIHx8IHQgPT09ICd2aWV3JztcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXZhaWxhYmxlUHJvY2VkdXJlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxFbnRpdGllcygpLmZpbHRlcigoZSkgPT4ge1xuICAgICAgY29uc3QgdCA9IChlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdCA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnIHx8IHQgPT09ICdwcm9jZWR1cmUnIHx8IHQuaW5jbHVkZXMoJ3Byb2NlZHVyZScpO1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSBpc0V4ZWNTbmlwcGV0T3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGV4ZWNTbmlwcGV0VGV4dCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZXhlY1BhcnNlU3RhdHVzID0gc2lnbmFsPHsgbWVzc2FnZTogc3RyaW5nOyBraW5kOiAnc3VjY2VzcycgfCAnZXJyb3InIH0gfCBudWxsPihudWxsKTtcblxuICB0b2dnbGVFeGVjU25pcHBldCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhlY1NuaXBwZXRPcGVuLnVwZGF0ZSgodikgPT4gIXYpO1xuICAgIHRoaXMuZXhlY1BhcnNlU3RhdHVzLnNldChudWxsKTtcbiAgfVxuXG4gIGFwcGx5RXhlY1NuaXBwZXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5leGVjU25pcHBldFRleHQoKS50cmltKCk7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHRoaXMuZXhlY1BhcnNlU3RhdHVzLnNldCh7IG1lc3NhZ2U6ICdQbGVhc2UgcGFzdGUgYW4gRVhFQyBzdGF0ZW1lbnQgZmlyc3QuJywga2luZDogJ2Vycm9yJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVNxbEV4ZWNTdGF0ZW1lbnQocmF3KTtcbiAgICBpZiAoIXBhcnNlZCB8fCBPYmplY3Qua2V5cyhwYXJzZWQucGFyYW1ldGVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV4ZWNQYXJzZVN0YXR1cy5zZXQoe1xuICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IGV4dHJhY3QgcGFyYW1ldGVycy4gRXhhbXBsZTogZXhlYyBQcm9jTmFtZSBAcDE9dmFsMSwgQHAyPXZhbDInLFxuICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5wcm9jZWR1cmVOYW1lICYmIHBhcnNlZC5wcm9jZWR1cmVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMuYWN0aXZlRW50aXR5TmFtZSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMub25TZWxlY3RFbnRpdHkocGFyc2VkLnByb2NlZHVyZU5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRNYXBwaW5ncyA9IHsgLi4uKCh0aGlzLmRhdGFTb3VyY2UoKT8ucGFyYW1ldGVyTWFwcGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9KSB9O1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZC5wYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgICBjdXJyZW50TWFwcGluZ3Nba2V5XSA9IHZhbDtcbiAgICAgIGN1cnJlbnRNYXBwaW5nc1tjbGVhbktleV0gPSB2YWw7XG4gICAgICBjdXJyZW50TWFwcGluZ3NbYEAke2NsZWFuS2V5fWBdID0gdmFsO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2VQYXJhbWV0ZXJzLmVtaXQoY3VycmVudE1hcHBpbmdzKTtcbiAgICB0aGlzLmV4ZWNQYXJzZVN0YXR1cy5zZXQoeyBtZXNzYWdlOiBgU3VjY2Vzc2Z1bGx5IGFwcGxpZWQgJHtjb3VudH0gcGFyYW1ldGVyKHMpIWAsIGtpbmQ6ICdzdWNjZXNzJyB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNFeGVjU25pcHBldE9wZW4uc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZXhlY1BhcnNlU3RhdHVzLnNldChudWxsKTtcbiAgICAgIHRoaXMuZXhlY1NuaXBwZXRUZXh0LnNldCgnJyk7XG4gICAgfSwgMTUwMCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyAxLiBTeW5jIGFjdGl2ZSB0YWIgd2hlbmV2ZXIgaW5jb21pbmcgZ3JpZCBkYXRhU291cmNlIGNoYW5nZXMgdHlwZVxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICAgICAgaWYgKGRzPy50eXBlKSB7XG4gICAgICAgICAgaWYgKGRzLnR5cGUgPT09ICdhcGknIHx8IGRzLmVuZHBvaW50Py5zdGFydHNXaXRoKCdodHRwJykgfHwgZHMuZW5kcG9pbnQ/LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTb3VyY2VUeXBlLnNldCgnYXBpJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkcy50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNvdXJjZVR5cGUuc2V0KCd0YWJsZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNvdXJjZVR5cGUuc2V0KCdzdG9yZWRfcHJvY2VkdXJlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIDIuIEZldGNoIHBhcmFtZXRlcnMgd2hlbiBhIHN0b3JlZCBwcm9jZWR1cmUgaXMgc2VsZWN0ZWRcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5kcG9pbnRTY29wZT8ucmV2aXNpb24oKTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5hY3RpdmVFbnRpdHlOYW1lKCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1cnJlbnRTb3VyY2VUeXBlKCk7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgdHlwZSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnICYmIHRoaXMuZGF0YURpc2NvdmVyeSkge1xuICAgICAgICAgIHRoaXMuZGF0YURpc2NvdmVyeS5nZXRQYXJhbWV0ZXJzKGVudGl0eSwgJ2RibycpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocGFyYW1zKSA9PiB0aGlzLmludGVybmFsUGFyYW1ldGVycy5zZXQocGFyYW1zIHx8IFtdKSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmludGVybmFsUGFyYW1ldGVycy5zZXQoW10pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW50ZXJuYWxQYXJhbWV0ZXJzLnNldChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLy8gMy4gRmFsbGJhY2sgZGlzY292ZXJ5IGxvYWQgaWYgYXZhaWxhYmxlRW50aXRpZXMgd2Fzbid0IHBvcHVsYXRlZCBieSBwYXJlbnRcbiAgICBlZmZlY3Qob25DbGVhbnVwID0+IHtcbiAgICAgIHRoaXMuZW5kcG9pbnRTY29wZT8ucmV2aXNpb24oKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YURpc2NvdmVyeT8uZ2V0RW50aXRpZXMoKS5zdWJzY3JpYmUoZW50aXRpZXMgPT4gdGhpcy5pbnRlcm5hbEVudGl0aWVzLnNldChlbnRpdGllcykpO1xuICAgICAgb25DbGVhbnVwKCgpID0+IHN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKSk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJlYWRvbmx5IGFjdGl2ZUVudGl0eUxpc3QgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3RhYmxlJyA/IHRoaXMuYXZhaWxhYmxlVGFibGVzKCkgOiB0aGlzLmF2YWlsYWJsZVByb2NlZHVyZXMoKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZ3JpZEVudGl0eVNlbGVjdE9wdGlvbnMgPSBjb21wdXRlZDxTZWFyY2hhYmxlU2VsZWN0T3B0aW9uW10+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVFbnRpdHlMaXN0KCkubWFwKChlbnQpID0+ICh7XG4gICAgICB2YWx1ZTogZW50Lm5hbWUsXG4gICAgICBsYWJlbDogZW50LmZyaWVuZGx5TmFtZSB8fCBlbnQubmFtZSxcbiAgICAgIHN1YmxhYmVsOiBlbnQuc2NoZW1hID8gYCR7ZW50LnNjaGVtYX0uJHtlbnQubmFtZX1gIDogZW50Lm5hbWUsXG4gICAgICBiYWRnZTogZW50LnR5cGUgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyA/ICdTUCcgOiAoZW50LnR5cGU/LnRvVXBwZXJDYXNlKCkgfHwgJ1RBQkxFJyksXG4gICAgfSkpO1xuICB9KTtcblxuICByZWFkb25seSBjb2x1bW5zID0gY29tcHV0ZWQ8R3JpZENvbHVtbkRlZmluaXRpb25bXT4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWQoKT8uY29sdW1ucyA/PyBbXTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcm93Q2xpY2tBY3Rpb24gPSBjb21wdXRlZDxHcmlkUm93Q2xpY2tBY3Rpb24gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ncmlkKCk/LnJvd0NsaWNrQWN0aW9uID8/IHRoaXMuZ3JpZCgpPy5vcHRpb25zPy5yb3dDbGlja0FjdGlvbjtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzUm93Q2xpY2tBY3Rpb24gPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb3dDbGlja0FjdGlvbigpO1xuICB9KTtcblxuICByZWFkb25seSBwYXJhbWV0ZXJNYXBwaW5ncyA9IGNvbXB1dGVkPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdPigoKSA9PiB7XG4gICAgY29uc3QgbWFwcGluZyA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKT8ucGFyYW1ldGVyTWFwcGluZztcbiAgICBpZiAoIW1hcHBpbmcpIHJldHVybiBbXTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGluZykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSkpO1xuICB9KTtcblxuICBvblNvdXJjZVR5cGVDaGFuZ2UodHlwZTogJ3N0b3JlZF9wcm9jZWR1cmUnIHwgJ3RhYmxlJyB8ICdhcGknKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTb3VyY2VUeXBlLnNldCh0eXBlKTtcbiAgICBpZiAodHlwZSAhPT0gJ2FwaScgJiYgdGhpcy5hbGxFbnRpdGllcygpLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRhdGFEaXNjb3ZlcnkpIHtcbiAgICAgIHRoaXMuZGF0YURpc2NvdmVyeS5nZXRFbnRpdGllcygpLnN1YnNjcmliZSgoZW50aXRpZXMpID0+IHtcbiAgICAgICAgaWYgKGVudGl0aWVzICYmIGVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmludGVybmFsRW50aXRpZXMuc2V0KGVudGl0aWVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25BcGlFbmRwb2ludENoYW5nZShlbmRwb2ludDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGF0YVNvdXJjZSgpO1xuICAgIGNvbnN0IG5leHQ6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uID0ge1xuICAgICAgLi4uKGN1cnJlbnQgPz8geyBpZDogYGRzLWFwaS0ke0RhdGUubm93KCl9YCB9KSxcbiAgICAgIHR5cGU6ICdhcGknLFxuICAgICAgZW5kcG9pbnQ6IGVuZHBvaW50LnRyaW0oKSxcbiAgICAgIG5hbWU6IGVuZHBvaW50LnRyaW0oKSxcbiAgICAgIG1ldGhvZDogY3VycmVudD8ubWV0aG9kIHx8ICdHRVQnLFxuICAgIH07XG4gICAgdGhpcy5zZXREYXRhU291cmNlLmVtaXQobmV4dCk7XG4gICAgdGhpcy5lbnRpdHlDaGFuZ2VkLmVtaXQoeyBuYW1lOiBlbmRwb2ludC50cmltKCksIHR5cGU6ICdhcGknIH0pO1xuICB9XG5cbiAgb25BcGlNZXRob2RDaGFuZ2UobWV0aG9kOiAnR0VUJyB8ICdQT1NUJyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgdGhpcy5zZXREYXRhU291cmNlLmVtaXQoeyAuLi5jdXJyZW50LCBtZXRob2QgfSk7XG4gICAgfVxuICB9XG5cbiAgb25BcGlEYXRhUGF0aENoYW5nZShkYXRhUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGF0YVNvdXJjZSgpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICB0aGlzLnNldERhdGFTb3VyY2UuZW1pdCh7IC4uLmN1cnJlbnQsIGRhdGFQYXRoOiBkYXRhUGF0aC50cmltKCkgfSk7XG4gICAgfVxuICB9XG5cbiAgb25BcGlVc2VQcm94eUNoYW5nZSh1c2VQcm94eTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgdGhpcy5zZXREYXRhU291cmNlLmVtaXQoeyAuLi5jdXJyZW50LCB1c2VQcm94eSB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdEVudGl0eShlbnRpdHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWVudGl0eU5hbWUpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50U291cmNlVHlwZSgpID09PSAnc3RvcmVkX3Byb2NlZHVyZScgJiYgdGhpcy5kYXRhRGlzY292ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGFEaXNjb3ZlcnkuZ2V0UGFyYW1ldGVycyhlbnRpdHlOYW1lLCAnZGJvJykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHBhcmFtcykgPT4gdGhpcy5pbnRlcm5hbFBhcmFtZXRlcnMuc2V0KHBhcmFtcyB8fCBbXSksXG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmludGVybmFsUGFyYW1ldGVycy5zZXQoW10pLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxQYXJhbWV0ZXJzLnNldChbXSk7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5Q2hhbmdlZC5lbWl0KHsgbmFtZTogZW50aXR5TmFtZSwgdHlwZTogdGhpcy5jdXJyZW50U291cmNlVHlwZSgpIH0pO1xuICB9XG5cbiAgZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW1OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBjb25zdCBtYXBwaW5ncyA9ICh0aGlzLmRhdGFTb3VyY2UoKT8ucGFyYW1ldGVyTWFwcGluZ3MgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4pIHx8IHt9O1xuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHBhcmFtTmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICBjb25zdCB2YWwgPSBtYXBwaW5nc1twYXJhbU5hbWVdID8/IG1hcHBpbmdzW2BAJHtjbGVhbk5hbWV9YF0gPz8gbWFwcGluZ3NbY2xlYW5OYW1lXTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvblBhcmFtZXRlckNoYW5nZShwYXJhbU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0geyAuLi4oKHRoaXMuZGF0YVNvdXJjZSgpPy5wYXJhbWV0ZXJNYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPikgfHwge30pIH07XG4gICAgY29uc3QgY2xlYW5OYW1lID0gcGFyYW1OYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICAgIGN1cnJlbnRbcGFyYW1OYW1lXSA9IHZhbHVlO1xuICAgIGN1cnJlbnRbYEAke2NsZWFuTmFtZX1gXSA9IHZhbHVlO1xuICAgIGN1cnJlbnRbY2xlYW5OYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZVBhcmFtZXRlcnMuZW1pdChjdXJyZW50KTtcbiAgfVxuXG4gIG9uVXBkYXRlQ29sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW4uZW1pdCh7IGluZGV4LCBmaWVsZCwgdmFsdWUgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDbGlja0FjdGlvbihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh7XG4gICAgICAgIHR5cGU6ICdvcGVuLWRyYXdlcicsXG4gICAgICAgIGRyYXdlclRpdGxlOiAnRGV0YWlscycsXG4gICAgICAgIGRyYXdlcldpZHRoOiAnNzYwcHgnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJvd0FjdGlvbkZpZWxkKGZpZWxkOiBrZXlvZiBHcmlkUm93Q2xpY2tBY3Rpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBuZXh0ID0geyAuLi5jdXJyZW50LCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdChuZXh0KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlck1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBtYXBwaW5nID0geyAuLi4oY3VycmVudC5wYXJhbWV0ZXJNYXBwaW5nID8/IHt9KSB9O1xuICAgIGxldCBpZHggPSBPYmplY3Qua2V5cyhtYXBwaW5nKS5sZW5ndGggKyAxO1xuICAgIGxldCBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIHdoaWxlIChrZXkgaW4gbWFwcGluZykge1xuICAgICAgaWR4Kys7XG4gICAgICBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIH1cbiAgICBtYXBwaW5nW2tleV0gPSAncm93LmlkJztcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBtYXBwaW5nIH0pO1xuICB9XG5cbiAgdXBkYXRlTWFwcGluZ0tleShpbmRleDogbnVtYmVyLCBuZXdLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCBrID0gaSA9PT0gaW5kZXggPyBuZXdLZXkgOiBwLmtleTtcbiAgICAgIGlmIChrLnRyaW0oKSkge1xuICAgICAgICBuZXh0TWFwcGluZ1trLnRyaW0oKV0gPSBwLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICB1cGRhdGVNYXBwaW5nVmFsdWUoaW5kZXg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2ID0gaSA9PT0gaW5kZXggPyBuZXdWYWx1ZSA6IHAudmFsdWU7XG4gICAgICBpZiAocC5rZXkudHJpbSgpKSB7XG4gICAgICAgIG5leHRNYXBwaW5nW3Aua2V5LnRyaW0oKV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICByZW1vdmVNYXBwaW5nKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWlycyA9IHRoaXMucGFyYW1ldGVyTWFwcGluZ3MoKTtcbiAgICBjb25zdCBuZXh0TWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhaXJzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgIGlmIChpICE9PSBpbmRleCAmJiBwLmtleS50cmltKCkpIHtcbiAgICAgICAgbmV4dE1hcHBpbmdbcC5rZXkudHJpbSgpXSA9IHAudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBuZXh0TWFwcGluZyB9KTtcbiAgfVxufVxuIiwiICAgIEBpZiAoIWdyaWQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWdyaWQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1pY29uXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjI4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImVtcHR5LWdyaWQtdGl0bGVcIj5ObyBSZXN1bHQgR3JpZCBBdHRhY2hlZDwvaDQ+XG4gICAgICAgIDxwIGNsYXNzPVwiZW1wdHktZ3JpZC1kZXNjXCI+QXR0YWNoIGFuIGludGVyYWN0aXZlIFJlc3VsdCBEYXRhIEdyaWQgKG9yIFVsdHJhR3JpZCkgdG8gdGhpcyByZXBvcnQgZGVmaW5pdGlvbiB0byByZW5kZXIgcXVlcmllcyBhbmQgc3RvcmVkIHByb2NlZHVyZSByZXN1bHRzLjwvcD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY3JlYXRlLWdyaWQtYWN0aW9uXCIgKGNsaWNrKT1cImFkZEdyaWQuZW1pdCgpXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPisgQWRkIFJlc3VsdCBHcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInByb3BzLWZvcm1cIj5cbiAgICAgIDwhLS0gMS4gUmVwb3J0IERhdGEgU291cmNlICYgU3RvcmVkIFByb2NlZHVyZSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlLXdyYXBcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5SZXBvcnQgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGFjdGl2ZUVudGl0eU5hbWUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLWJhZGdlIGFjdGl2ZS1kcy1iYWRnZVwiPnt7IGFjdGl2ZUVudGl0eU5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTb3VyY2UgVHlwZSBTd2l0Y2hlciAoU3RvcmVkIFByb2NlZHVyZSB2cyBUYWJsZSB2cyBSRVNUIEFQSSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzb3VyY2UtdHlwZS1zd2l0Y2hlclwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdzdG9yZWRfcHJvY2VkdXJlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Tb3VyY2VUeXBlQ2hhbmdlKCdzdG9yZWRfcHJvY2VkdXJlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0b3JlZCBQcm9jZWR1cmU8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNvdXJjZS10YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3RhYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Tb3VyY2VUeXBlQ2hhbmdlKCd0YWJsZScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+VGFibGUgLyBWaWV3PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdhcGknXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNvdXJjZVR5cGVDaGFuZ2UoJ2FwaScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImdsb2JlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+UkVTVCBBUEk8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ2FwaScpIHtcbiAgICAgICAgICA8IS0tIEFQSSBFbmRwb2ludCBTZWxlY3RvciAvIElucHV0IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QVBJIEVuZHBvaW50IFVSTDwvbGFiZWw+XG4gICAgICAgICAgICBAaWYgKHJlZ2lzdGVyZWRBcGlzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNnB4O1wiPlxuICAgICAgICAgICAgICAgIDxycHQtc2VhcmNoYWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInJlZ2lzdGVyZWRBcGlzKClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRW5kcG9pbnQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkFwaUVuZHBvaW50Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBTZWxlY3QgUmVnaXN0ZXJlZCBFbmRwb2ludCBvciB0eXBlIGJlbG93IC0tXCJcbiAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwiU2VhcmNoIHJlZ2lzdGVyZWQgQVBJcy4uLlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAvYXBpL3YxL29yZGVycyBvciBodHRwczovL2FwaS5zZXJ2aWNlLmNvbS9kYXRhXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRW5kcG9pbnQoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQXBpRW5kcG9pbnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1oaW50XCIgc3R5bGU9XCJmb250LXNpemU6IDExcHg7IGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7IG1hcmdpbi10b3A6IDRweDsgZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgIERpcmVjdCBIVFRQIGNhbGwgb3IgYmFja2VuZCBwcm94eS4gVXNlIDxjb2RlPjpwYXJhbTwvY29kZT4gZm9yIHJvdXRlIHRva2Vucy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gSFRUUCBNZXRob2QgJiBEYXRhIFBhdGggR3JpZCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtZ3JpZC0yXCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkhUVFAgTWV0aG9kPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhcGlNZXRob2QoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BcGlNZXRob2RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUIChRdWVyeSBTdHJpbmcpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlBPU1RcIj5QT1NUIChCb2R5IFBheWxvYWQpPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UmVzcG9uc2UgRGF0YSBQYXRoPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gZGF0YS5pdGVtcywgcm93c1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRGF0YVBhdGgoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BcGlEYXRhUGF0aENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBVc2UgUHJveHkgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3cgY2hlY2tib3gtZmllbGQtcm93XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTJweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFwaVVzZVByb3h5KClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25BcGlVc2VQcm94eUNoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC10ZXh0XCI+Um91dGUgdGhyb3VnaCBiYWNrZW5kIHByb3h5IChieXBhc3NlcyBDT1JTIC8gaGlkZXMgY3JlZGVudGlhbHMpPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBFbnRpdHkgU2VsZWN0b3IgRHJvcGRvd24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ1N0b3JlZCBQcm9jZWR1cmUnIDogJ1RhYmxlIC8gVmlldycgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8cnB0LXNlYXJjaGFibGUtc2VsZWN0XG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImdyaWRFbnRpdHlTZWxlY3RPcHRpb25zKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVFbnRpdHlOYW1lKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdEVudGl0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBDaG9vc2UgRGF0YSBTb3VyY2UgLS1cIlxuICAgICAgICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ1NlYXJjaCBwcm9jZWR1cmVzLi4uJyA6ICdTZWFyY2ggdGFibGVzICYgdmlld3MuLi4nXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyIE1hcHBpbmdzIC0tPlxuICAgICAgICBAaWYgKGN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyAmJiBhY3RpdmVFbnRpdHlOYW1lKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvY2VkdXJlLXBhcmFtcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW1zLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbXMtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtcy10aXRsZVwiPlByb2NlZHVyZSBQYXJhbWV0ZXJzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW1zLWNvdW50LWJhZGdlXCI+e3sgZWZmZWN0aXZlUGFyYW1ldGVycygpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1wYXN0ZS1leGVjXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhlY1NuaXBwZXQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJQYXN0ZSBmdWxsIFNTTVMgJ0VYRUMgcHJvYyBAcGFyYW09dmFsJyBzbmlwcGV0IHRvIGZpbGwgcGFyYW1ldGVycyBhdXRvbWF0aWNhbGx5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpc0V4ZWNTbmlwcGV0T3BlbigpID8gJ0Nsb3NlIFNRTCcgOiAnUGFzdGUgU1FMIEV4ZWMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGlzRXhlY1NuaXBwZXRPcGVuKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4ZWMtc25pcHBldC1wYW5lbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGVjLXNuaXBwZXQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNuaXBwZXQtaGludFwiPlBhc3RlIGZ1bGwgPGNvZGU+RVhFQyBQcm9jZWR1cmVOYW1lICYjNjQ7cGFyYW09dmFsLi4uPC9jb2RlPiBzdGF0ZW1lbnQgZnJvbSBTU01TOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhlYy1zbmlwcGV0LXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCIzXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBleGVjIEdldF9IZWxwTGlzdCBAY2hyQ09NUEFOWUlEPU4nMTAxJyxAY2hyVGFibGVOYW1lPU4nTVNUQUNDVEdMU1VCJy4uLlwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJleGVjU25pcHBldFRleHQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJleGVjU25pcHBldFRleHQuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGVjLXNuaXBwZXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tc25pcHBldC1hcHBseVwiIChjbGljayk9XCJhcHBseUV4ZWNTbmlwcGV0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXBwbHkgUGFyYW1ldGVyczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tc25pcHBldC1jYW5jZWxcIiAoY2xpY2spPVwidG9nZ2xlRXhlY1NuaXBwZXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoZXhlY1BhcnNlU3RhdHVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbmlwcGV0LXN0YXR1c1wiIFtjbGFzcy5pcy1lcnJvcl09XCJleGVjUGFyc2VTdGF0dXMoKT8ua2luZCA9PT0gJ2Vycm9yJ1wiIFtjbGFzcy5pcy1zdWNjZXNzXT1cImV4ZWNQYXJzZVN0YXR1cygpPy5raW5kID09PSAnc3VjY2VzcydcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZXhlY1BhcnNlU3RhdHVzKCk/Lm1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoZWZmZWN0aXZlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWNhcmRzLWxpc3RcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChwYXJhbSBvZiBlZmZlY3RpdmVQYXJhbWV0ZXJzKCk7IHRyYWNrIHBhcmFtLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtcGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbV09XCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW50VmFsdWVdPVwiZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW0ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICBbYWxsQ29tcG9uZW50c109XCJhbGxDb21wb25lbnRzKClcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXJhbWV0ZXJDaGFuZ2UocGFyYW0ubmFtZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXBhcmFtcy1oaW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgdGhpcyBwcm9jZWR1cmUuPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gMi4gUmVzdWx0IENvbHVtbnMgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZS13cmFwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+Q29sdW1uczwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtYmFkZ2VcIj57eyBjb2x1bW5zKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERlZGljYXRlZCBGdWxsLVdpZHRoIEFjdGlvbiBCdXR0b25zIChObyBjcmFtcGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zLWFjdGlvbi1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNvbC1hY3Rpb24gYnRuLWF1dG8tZGV0ZWN0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhdXRvRGV0ZWN0Q29sdW1ucy5lbWl0KClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGV0ZWN0aW5nKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJBdXRvLWRldGVjdCBhbGwgY29sdW1ucyBmcm9tIHByb2NlZHVyZSBvciBkYXRhIHRhYmxlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMlwiIFtjbGFzcy5ycHQtc3Bpbl09XCJpc0RldGVjdGluZygpXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IGlzRGV0ZWN0aW5nKCkgPyAnRGV0ZWN0aW5nLi4uJyA6ICdBdXRvLURldGVjdCcgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1jb2wtYWN0aW9uIGJ0bi1hZGQtY29sXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRDb2x1bW4uZW1pdCgpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQWRkIGEgbmV3IGNvbHVtbiBtYW51YWxseVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+KyBBZGQgQ29sdW1uPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKHN0YXR1c01lc3NhZ2UoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc3RhdHVzLWJhbm5lclwiIFtjbGFzcy5pcy1lcnJvcl09XCJzdGF0dXNLaW5kKCkgPT09ICdlcnJvcidcIiBbY2xhc3MuaXMtc3VjY2Vzc109XCJzdGF0dXNLaW5kKCkgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cInN0YXR1c0tpbmQoKSA9PT0gJ2Vycm9yJyA/ICdjbG9zZScgOiAnY2hlY2snXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgc3RhdHVzTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtZWRpdG9yLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWhlYWRlci10aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtZHJhZy1kb3RzXCI+4ouu4ouuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtaWR4LWJhZGdlXCI+I3t7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC10aXRsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sLXR5cGUtcGlsbFwiPnt7IGNvbC5kYXRhVHlwZSB8fCAnc3RyaW5nJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWFjdGlvbi1idG4gYnRuLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb2x1bW4uZW1pdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5GaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnZmllbGQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdkYXRhVHlwZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN0cmluZ1wiPlN0cmluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VycmVuY3lcIj5DdXJyZW5jeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29sZWFuXCI+Qm9vbGVhbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZvcm1hdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBkZC9NTS95eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmb3JtYXQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFsaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5hbGlnbiB8fCAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FsaWduJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2VudGVyXCI+Q2VudGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5BZ2dyZWdhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFnZ3JlZ2F0ZSB8fCAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FnZ3JlZ2F0ZScsICRldmVudCA9PT0gJ25vbmUnID8gdW5kZWZpbmVkIDogJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtXCI+U3VtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF2Z1wiPkF2ZXJhZ2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY291bnRcIj5Db3VudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaW5cIj5NaW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWF4XCI+TWF4PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC53aWR0aCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wudmlzaWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ3Zpc2libGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmNoZWNrYm94U2VsZWN0aW9uID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdjaGVja2JveFNlbGVjdGlvbicsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEdyaWQgVGFibGUgT3B0aW9ucyBHcm91cCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5UYWJsZSBPcHRpb25zPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uc2lkZUJhciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2lkZUJhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBTaWRlIFBhbmVsIChUb29sIFBhbmVscyk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uZ2xvYmFsU2VhcmNoICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdnbG9iYWxTZWFyY2gnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5HbG9iYWwgU2VhcmNoIEJveDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zdGF0dXNCYXIgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3N0YXR1c0JhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0YXR1cyBCYXI8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnaW5hdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2luYXRpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5FbmFibGUgUGFnaW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2VsZWN0YWJsZScsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlJvdyBTZWxlY3Rpb248L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGFibGUgPz8gdHJ1ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U2VsZWN0aW9uIE1vZGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3Rpb25Nb2RlID8/IGdyaWQoKT8ub3B0aW9ucz8ucm93U2VsZWN0aW9uID8/ICdtdWx0aXBsZSdcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2VsZWN0aW9uTW9kZScsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibXVsdGlwbGVcIj5NdWx0aXBsZSBSb3dzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzaW5nbGVcIj5TaW5nbGUgUm93PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uY2hlY2tib3hTZWxlY3Rpb24gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2NoZWNrYm94U2VsZWN0aW9uJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkNoZWNrYm94IFNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKChncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGlvbk1vZGUgPz8gJ211bHRpcGxlJykgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5oZWFkZXJDaGVja2JveFNlbGVjdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdoZWFkZXJDaGVja2JveFNlbGVjdGlvbicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+SGVhZGVyIFNlbGVjdCBBbGwgQ2hlY2tib3g8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5hbGxvd0NvbHVtblJlb3JkZXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdhbGxvd0NvbHVtblJlb3JkZXInLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5BbGxvdyBDb2x1bW4gUmVvcmRlcjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5hbGxvd0V4cG9ydCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2FsbG93RXhwb3J0JywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+QWxsb3cgRXhwb3J0PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlBhZ2UgU2l6ZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICBtYXg9XCIxMDAwXCJcbiAgICAgICAgICAgICh3aGVlbCk9XCIkYW55KCRldmVudC50YXJnZXQpLmJsdXIoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5hcnJvd3VwKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmFycm93ZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnBhZ2VTaXplID8/IDEwXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdwYWdlU2l6ZScsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Um93TnVtYmVycyA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3Nob3dSb3dOdW1iZXJzJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBSb3cgTnVtYmVyczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Rm9vdGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd0Zvb3RlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNob3cgRm9vdGVyIFRvdGFsczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJvdyBDbGljayAmIERyaWxsLURvd24gQWN0aW9uIEdyb3VwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPlJvdyBDbGljayAmIERyaWxsLURvd248L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGFzUm93Q2xpY2tBY3Rpb24oKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVJvd0NsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBSb3cgQ2xpY2sgQWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaGFzUm93Q2xpY2tBY3Rpb24oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QWN0aW9uIFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IGZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnR5cGUgfHwgJ29wZW4tZHJhd2VyJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCd0eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcGVuLWRyYXdlclwiPlNsaWRlLU92ZXIgRGV0YWlsIERyYXdlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZHJpbGxkb3duLXJlcG9ydFwiPkRyaWxsLURvd24gUmVwb3J0IChIb3N0IEV2ZW50KTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmF2aWdhdGVcIj5OYXZpZ2F0ZSB0byBVUkw8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVtaXQtY3VzdG9tXCI+RW1pdCBDdXN0b20gQWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ29wZW4tZHJhd2VyJyB8fCByb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnZHJpbGxkb3duLXJlcG9ydCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5UYXJnZXQgUmVwb3J0IElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBvcmRlci1kZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy50YXJnZXRSZXBvcnRJZCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFJlcG9ydElkJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRyYXdlciBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gT3JkZXIgRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uZHJhd2VyVGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCdkcmF3ZXJUaXRsZScsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EcmF3ZXIgV2lkdGg8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDc2MHB4LCA4MCUsIDkwMHB4XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5kcmF3ZXJXaWR0aCB8fCAnNzYwcHgnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnZHJhd2VyV2lkdGgnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRhcmdldCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvb3JkZXJzL3t7cm93Lm9yZGVySWR9fSBvciBodHRwczovLy4uLidcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnRhcmdldFVybCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFVybCcsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/Lm9wZW5OZXdUYWIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ29wZW5OZXdUYWInLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPk9wZW4gaW4gTmV3IFRhYjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ2VtaXQtY3VzdG9tJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkN1c3RvbSBBY3Rpb24gTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gdmlldy1hdWRpdC10cmFpbFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uY3VzdG9tQWN0aW9uTmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ2N1c3RvbUFjdGlvbk5hbWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5QYXJhbWV0ZXIgTWFwcGluZzwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hZGQtbWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFBhcmFtZXRlck1hcHBpbmcoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBmb3IgKG1hcHBpbmcgb2YgcGFyYW1ldGVyTWFwcGluZ3MoKTsgdHJhY2sgbWFwcGluZy5rZXk7IGxldCBtSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBwaW5nLXBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYXJnZXQgKGUuZy4gY3VzdG9tZXJJZClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWFwcGluZy5rZXlcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTWFwcGluZ0tleShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogIzk0YTNiODtcIj7ihpA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTb3VyY2UgKGUuZy4gcm93LmlkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJtYXBwaW5nLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU1hcHBpbmdWYWx1ZShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYWN0aW9uLWJ0biBidG4tZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVNYXBwaW5nKG1JZHgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIG1hcHBpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSZW1vdmUgR3JpZCBBY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1kYW5nZXItem9uZVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb25cIiAoY2xpY2spPVwicmVtb3ZlR3JpZC5lbWl0KClcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlJlbW92ZSBHcmlkIGZyb20gUmVwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH0iXX0=
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFDTCw0QkFBNEIsR0FFN0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RixP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QztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7d0dBN1dVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLHdrRENqQ3hDLHMwM0JBd3FCSyxxOFhEanBCRCxZQUFZLDhCQUNaLFdBQVcsbXREQUNYLGdCQUFnQix1R0FDaEIsK0JBQStCLG9OQUMvQiw0QkFBNEI7OzRGQU1uQiwyQkFBMkI7a0JBZHZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQiwrQkFBK0I7d0JBQy9CLDRCQUE0QjtxQkFDN0IsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGaWVsZENhc2VJbnNlbnNpdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvZGF0YS1ub3JtYWxpemF0aW9uLnV0aWwnO1xuaW1wb3J0IHsgRGVzaWduZXJFbmRwb2ludHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItZW5kcG9pbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EZWZpbml0aW9uLCBHcmlkUm93Q2xpY2tBY3Rpb24sIFJlcG9ydEdyaWREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGF0YXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhYmFzZUVudGl0eU1ldGFkYXRhLCBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9zY2hlbWEtZGlzY292ZXJ5LmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtZGF0YS1kaXNjb3Zlcnkuc2VydmljZSc7XG5pbXBvcnQgeyBCV0FZU19SRVBPUlRfRU5EUE9JTlRTIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvYWRhcHRlcnMvZW5kcG9pbnQtdG9rZW5zJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgUnB0U2VhcmNoYWJsZVNlbGVjdENvbXBvbmVudCxcbiAgU2VhcmNoYWJsZVNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzJztcbmltcG9ydCB7IFBhcmFtZXRlckJpbmRpbmdFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL3BhcmFtZXRlci1iaW5kaW5nLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgcGFyc2VTcWxFeGVjU3RhdGVtZW50LCBzZXRQYXJhbWV0ZXJNYXBwaW5nIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9yZXBvcnQtcGFyYW1ldGVyLnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJwdEljb25Db21wb25lbnQsXG4gICAgUGFyYW1ldGVyQmluZGluZ0VkaXRvckNvbXBvbmVudCxcbiAgICBScHRTZWFyY2hhYmxlU2VsZWN0Q29tcG9uZW50LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb3BlcnR5LWVkaXRvci1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvcGVydHktZWRpdG9yLmNvbW1vbi5jc3MnLCAnLi9wcm9wZXJ0eS1lZGl0b3ItZ3JpZC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yR3JpZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRTY29wZSA9IGluamVjdChEZXNpZ25lckVuZHBvaW50c1NlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURpc2NvdmVyeSA9IGluamVjdChSZXBvcnREYXRhRGlzY292ZXJ5U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHMgPSBpbmplY3QoQldBWVNfUkVQT1JUX0VORFBPSU5UUywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBncmlkID0gaW5wdXQ8UmVwb3J0R3JpZERlZmluaXRpb24gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRhdGFTb3VyY2UgPSBpbnB1dDxSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlRW50aXRpZXMgPSBpbnB1dDxEYXRhYmFzZUVudGl0eU1ldGFkYXRhW10+KFtdKTtcbiAgcmVhZG9ubHkgcHJvY2VkdXJlUGFyYW1ldGVycyA9IGlucHV0PFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhW10+KFtdKTtcbiAgcmVhZG9ubHkgYWxsQ29tcG9uZW50cyA9IGlucHV0PFJlcG9ydENvbXBvbmVudERlZmluaXRpb25bXT4oW10pO1xuICByZWFkb25seSBpc0RldGVjdGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc3RhdHVzTWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzdGF0dXNLaW5kID0gaW5wdXQ8J2luZm8nIHwgJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGFkZEdyaWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhZGRDb2x1bW4gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYXV0b0RldGVjdENvbHVtbnMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29sdW1uID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlQ29sdW1uID0gb3V0cHV0PHsgaW5kZXg6IG51bWJlcjsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlT3B0aW9uID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlUm93Q2xpY2tBY3Rpb24gPSBvdXRwdXQ8R3JpZFJvd0NsaWNrQWN0aW9uIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBzZXREYXRhU291cmNlID0gb3V0cHV0PFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uPigpO1xuICByZWFkb25seSB1cGRhdGVEYXRhU291cmNlUGFyYW1ldGVycyA9IG91dHB1dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgZW50aXR5Q2hhbmdlZCA9IG91dHB1dDx7IG5hbWU6IHN0cmluZzsgdHlwZTogJ3N0b3JlZF9wcm9jZWR1cmUnIHwgJ3RhYmxlJyB8ICdhcGknIH0+KCk7XG5cbiAgcmVhZG9ubHkgaW50ZXJuYWxQYXJhbWV0ZXJzID0gc2lnbmFsPFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhW10+KFtdKTtcblxuICByZWFkb25seSBlZmZlY3RpdmVQYXJhbWV0ZXJzID0gY29tcHV0ZWQ8UHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGFbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb21QYXJlbnQgPSB0aGlzLnByb2NlZHVyZVBhcmFtZXRlcnMoKTtcbiAgICBpZiAoZnJvbVBhcmVudCAmJiBmcm9tUGFyZW50Lmxlbmd0aCA+IDApIHJldHVybiBmcm9tUGFyZW50O1xuICAgIHJldHVybiB0aGlzLmludGVybmFsUGFyYW1ldGVycygpO1xuICB9KTtcblxuICByZWFkb25seSBpbnRlcm5hbEVudGl0aWVzID0gc2lnbmFsPERhdGFiYXNlRW50aXR5TWV0YWRhdGFbXT4oW10pO1xuXG4gIHJlYWRvbmx5IGFsbEVudGl0aWVzID0gY29tcHV0ZWQ8RGF0YWJhc2VFbnRpdHlNZXRhZGF0YVtdPigoKSA9PiB7XG4gICAgY29uc3QgZnJvbVBhcmVudCA9IHRoaXMuYXZhaWxhYmxlRW50aXRpZXMoKTtcbiAgICBpZiAoZnJvbVBhcmVudCAmJiBmcm9tUGFyZW50Lmxlbmd0aCA+IDApIHJldHVybiBmcm9tUGFyZW50O1xuICAgIHJldHVybiB0aGlzLmludGVybmFsRW50aXRpZXMoKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlU291cmNlVHlwZSA9IHNpZ25hbDwnc3RvcmVkX3Byb2NlZHVyZScgfCAndGFibGUnIHwgJ2FwaSc+KCdzdG9yZWRfcHJvY2VkdXJlJyk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTb3VyY2VUeXBlID0gY29tcHV0ZWQ8J3N0b3JlZF9wcm9jZWR1cmUnIHwgJ3RhYmxlJyB8ICdhcGknPigoKSA9PiB0aGlzLmFjdGl2ZVNvdXJjZVR5cGUoKSk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlRW50aXR5TmFtZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhU291cmNlKCk7XG4gICAgaWYgKCFkcykgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRzVHlwZSA9IGRzLnR5cGUgPT09ICd0YWJsZScgPyAndGFibGUnIDogKGRzLnR5cGUgPT09ICdhcGknID8gJ2FwaScgOiAnc3RvcmVkX3Byb2NlZHVyZScpO1xuICAgIGlmIChkc1R5cGUgPT09IHRoaXMuYWN0aXZlU291cmNlVHlwZSgpKSB7XG4gICAgICByZXR1cm4gZHMubmFtZSB8fCBkcy5lbmRwb2ludCB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9KTtcblxuICByZWFkb25seSBhcGlFbmRwb2ludCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhU291cmNlKCk7XG4gICAgcmV0dXJuIGRzPy5lbmRwb2ludCB8fCBkcz8ubmFtZSB8fCAnJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYXBpTWV0aG9kID0gY29tcHV0ZWQ8J0dFVCcgfCAnUE9TVCc+KCgpID0+IHtcbiAgICBjb25zdCBtID0gKHRoaXMuZGF0YVNvdXJjZSgpPy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIG0gPT09ICdQT1NUJyA/ICdQT1NUJyA6ICdHRVQnO1xuICB9KTtcblxuICByZWFkb25seSBhcGlEYXRhUGF0aCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiAodGhpcy5kYXRhU291cmNlKCkgYXMgYW55KT8uZGF0YVBhdGggfHwgJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFwaVVzZVByb3h5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiAodGhpcy5kYXRhU291cmNlKCkgYXMgYW55KT8udXNlUHJveHkgPT09IHRydWU7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlZ2lzdGVyZWRBcGlzID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgYXBpcyA9IHRoaXMuZW5kcG9pbnRzPy5hcGlFbmRwb2ludHMgfHwgW107XG4gICAgcmV0dXJuIGFwaXMubWFwKChhcGkpID0+IHtcbiAgICAgIGNvbnN0IGVwID0gYXBpLmVuZHBvaW50IHx8IGFwaS51cmwgfHwgJyc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZXAsXG4gICAgICAgIGxhYmVsOiBhcGkubmFtZSB8fCBlcCxcbiAgICAgICAgc3VibGFiZWw6IGAke2FwaS5tZXRob2QgfHwgJ0dFVCd9ICR7ZXB9YCxcbiAgICAgICAgYmFkZ2U6IGFwaS5jYXRlZ29yeSB8fCAnQVBJJyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YWlsYWJsZVRhYmxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxFbnRpdGllcygpLmZpbHRlcigoZSkgPT4ge1xuICAgICAgY29uc3QgdCA9IChlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdCA9PT0gJ3RhYmxlJyB8fCB0ID09PSAndmlldyc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGF2YWlsYWJsZVByb2NlZHVyZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRW50aXRpZXMoKS5maWx0ZXIoKGUpID0+IHtcbiAgICAgIGNvbnN0IHQgPSAoZS50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHQgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyB8fCB0ID09PSAncHJvY2VkdXJlJyB8fCB0LmluY2x1ZGVzKCdwcm9jZWR1cmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNFeGVjU25pcHBldE9wZW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBleGVjU25pcHBldFRleHQgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGV4ZWNQYXJzZVN0YXR1cyA9IHNpZ25hbDx7IG1lc3NhZ2U6IHN0cmluZzsga2luZDogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB9IHwgbnVsbD4obnVsbCk7XG5cbiAgdG9nZ2xlRXhlY1NuaXBwZXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0V4ZWNTbmlwcGV0T3Blbi51cGRhdGUoKHYpID0+ICF2KTtcbiAgICB0aGlzLmV4ZWNQYXJzZVN0YXR1cy5zZXQobnVsbCk7XG4gIH1cblxuICBhcHBseUV4ZWNTbmlwcGV0KCk6IHZvaWQge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZXhlY1NuaXBwZXRUZXh0KCkudHJpbSgpO1xuICAgIGlmICghcmF3KSB7XG4gICAgICB0aGlzLmV4ZWNQYXJzZVN0YXR1cy5zZXQoeyBtZXNzYWdlOiAnUGxlYXNlIHBhc3RlIGFuIEVYRUMgc3RhdGVtZW50IGZpcnN0LicsIGtpbmQ6ICdlcnJvcicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VTcWxFeGVjU3RhdGVtZW50KHJhdyk7XG4gICAgaWYgKCFwYXJzZWQgfHwgT2JqZWN0LmtleXMocGFyc2VkLnBhcmFtZXRlcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5leGVjUGFyc2VTdGF0dXMuc2V0KHtcbiAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBleHRyYWN0IHBhcmFtZXRlcnMuIEV4YW1wbGU6IGV4ZWMgUHJvY05hbWUgQHAxPXZhbDEsIEBwMj12YWwyJyxcbiAgICAgICAga2luZDogJ2Vycm9yJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWQucHJvY2VkdXJlTmFtZSAmJiBwYXJzZWQucHJvY2VkdXJlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLmFjdGl2ZUVudGl0eU5hbWUoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLm9uU2VsZWN0RW50aXR5KHBhcnNlZC5wcm9jZWR1cmVOYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudE1hcHBpbmdzID0geyAuLi4odGhpcy5kYXRhU291cmNlKCk/LnBhcmFtZXRlck1hcHBpbmdzIHx8IHt9KSB9O1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZC5wYXJhbWV0ZXJzKSkge1xuICAgICAgY3VycmVudE1hcHBpbmdzID0gc2V0UGFyYW1ldGVyTWFwcGluZyhjdXJyZW50TWFwcGluZ3MsIGtleSwgdmFsKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVEYXRhU291cmNlUGFyYW1ldGVycy5lbWl0KGN1cnJlbnRNYXBwaW5ncyk7XG4gICAgdGhpcy5leGVjUGFyc2VTdGF0dXMuc2V0KHsgbWVzc2FnZTogYFN1Y2Nlc3NmdWxseSBhcHBsaWVkICR7Y291bnR9IHBhcmFtZXRlcihzKSFgLCBraW5kOiAnc3VjY2VzcycgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzRXhlY1NuaXBwZXRPcGVuLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmV4ZWNQYXJzZVN0YXR1cy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmV4ZWNTbmlwcGV0VGV4dC5zZXQoJycpO1xuICAgIH0sIDE1MDApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gMS4gU3luYyBhY3RpdmUgdGFiIHdoZW5ldmVyIGluY29taW5nIGdyaWQgZGF0YVNvdXJjZSBjaGFuZ2VzIHR5cGVcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhU291cmNlKCk7XG4gICAgICAgIGlmIChkcz8udHlwZSkge1xuICAgICAgICAgIGlmIChkcy50eXBlID09PSAnYXBpJyB8fCBkcy5lbmRwb2ludD8uc3RhcnRzV2l0aCgnaHR0cCcpIHx8IGRzLmVuZHBvaW50Py5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU291cmNlVHlwZS5zZXQoJ2FwaScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZHMudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTb3VyY2VUeXBlLnNldCgndGFibGUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTb3VyY2VUeXBlLnNldCgnc3RvcmVkX3Byb2NlZHVyZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICAvLyAyLiBGZXRjaCBwYXJhbWV0ZXJzIHdoZW4gYSBzdG9yZWQgcHJvY2VkdXJlIGlzIHNlbGVjdGVkXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmVuZHBvaW50U2NvcGU/LnJldmlzaW9uKCk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuYWN0aXZlRW50aXR5TmFtZSgpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXJyZW50U291cmNlVHlwZSgpO1xuICAgICAgICBpZiAoZW50aXR5ICYmIHR5cGUgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyAmJiB0aGlzLmRhdGFEaXNjb3ZlcnkpIHtcbiAgICAgICAgICB0aGlzLmRhdGFEaXNjb3ZlcnkuZ2V0UGFyYW1ldGVycyhlbnRpdHksICdkYm8nKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHBhcmFtcykgPT4gdGhpcy5pbnRlcm5hbFBhcmFtZXRlcnMuc2V0KHBhcmFtcyB8fCBbXSksXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5pbnRlcm5hbFBhcmFtZXRlcnMuc2V0KFtdKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmludGVybmFsUGFyYW1ldGVycy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIDMuIEZhbGxiYWNrIGRpc2NvdmVyeSBsb2FkIGlmIGF2YWlsYWJsZUVudGl0aWVzIHdhc24ndCBwb3B1bGF0ZWQgYnkgcGFyZW50XG4gICAgZWZmZWN0KG9uQ2xlYW51cCA9PiB7XG4gICAgICB0aGlzLmVuZHBvaW50U2NvcGU/LnJldmlzaW9uKCk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFEaXNjb3Zlcnk/LmdldEVudGl0aWVzKCkuc3Vic2NyaWJlKGVudGl0aWVzID0+IHRoaXMuaW50ZXJuYWxFbnRpdGllcy5zZXQoZW50aXRpZXMpKTtcbiAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCkpO1xuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gIH1cblxuICByZWFkb25seSBhY3RpdmVFbnRpdHlMaXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICd0YWJsZScgPyB0aGlzLmF2YWlsYWJsZVRhYmxlcygpIDogdGhpcy5hdmFpbGFibGVQcm9jZWR1cmVzKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGdyaWRFbnRpdHlTZWxlY3RPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRW50aXR5TGlzdCgpLm1hcCgoZW50KSA9PiAoe1xuICAgICAgdmFsdWU6IGVudC5uYW1lLFxuICAgICAgbGFiZWw6IGVudC5mcmllbmRseU5hbWUgfHwgZW50Lm5hbWUsXG4gICAgICBzdWJsYWJlbDogZW50LnNjaGVtYSA/IGAke2VudC5zY2hlbWF9LiR7ZW50Lm5hbWV9YCA6IGVudC5uYW1lLFxuICAgICAgYmFkZ2U6IGVudC50eXBlID09PSAnc3RvcmVkX3Byb2NlZHVyZScgPyAnU1AnIDogKGVudC50eXBlPy50b1VwcGVyQ2FzZSgpIHx8ICdUQUJMRScpLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY29sdW1ucyA9IGNvbXB1dGVkPEdyaWRDb2x1bW5EZWZpbml0aW9uW10+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ncmlkKCk/LmNvbHVtbnMgPz8gW107XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJvd0NsaWNrQWN0aW9uID0gY29tcHV0ZWQ8R3JpZFJvd0NsaWNrQWN0aW9uIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZCgpPy5yb3dDbGlja0FjdGlvbiA/PyB0aGlzLmdyaWQoKT8ub3B0aW9ucz8ucm93Q2xpY2tBY3Rpb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhhc1Jvd0NsaWNrQWN0aW9uID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiAhIXRoaXMucm93Q2xpY2tBY3Rpb24oKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTWFwcGluZ3MgPSBjb21wdXRlZDx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXT4oKCkgPT4ge1xuICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCk/LnBhcmFtZXRlck1hcHBpbmc7XG4gICAgaWYgKCFtYXBwaW5nKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG1hcHBpbmcpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBrZXksIHZhbHVlIH0pKTtcbiAgfSk7XG5cbiAgb25Tb3VyY2VUeXBlQ2hhbmdlKHR5cGU6ICdzdG9yZWRfcHJvY2VkdXJlJyB8ICd0YWJsZScgfCAnYXBpJyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlU291cmNlVHlwZS5zZXQodHlwZSk7XG4gICAgaWYgKHR5cGUgIT09ICdhcGknICYmIHRoaXMuYWxsRW50aXRpZXMoKS5sZW5ndGggPT09IDAgJiYgdGhpcy5kYXRhRGlzY292ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGFEaXNjb3ZlcnkuZ2V0RW50aXRpZXMoKS5zdWJzY3JpYmUoKGVudGl0aWVzKSA9PiB7XG4gICAgICAgIGlmIChlbnRpdGllcyAmJiBlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcm5hbEVudGl0aWVzLnNldChlbnRpdGllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQXBpRW5kcG9pbnRDaGFuZ2UoZW5kcG9pbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBjb25zdCBuZXh0OiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiA9IHtcbiAgICAgIC4uLihjdXJyZW50ID8/IHsgaWQ6IGBkcy1hcGktJHtEYXRlLm5vdygpfWAgfSksXG4gICAgICB0eXBlOiAnYXBpJyxcbiAgICAgIGVuZHBvaW50OiBlbmRwb2ludC50cmltKCksXG4gICAgICBuYW1lOiBlbmRwb2ludC50cmltKCksXG4gICAgICBtZXRob2Q6IGN1cnJlbnQ/Lm1ldGhvZCB8fCAnR0VUJyxcbiAgICB9O1xuICAgIHRoaXMuc2V0RGF0YVNvdXJjZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuZW50aXR5Q2hhbmdlZC5lbWl0KHsgbmFtZTogZW5kcG9pbnQudHJpbSgpLCB0eXBlOiAnYXBpJyB9KTtcbiAgfVxuXG4gIG9uQXBpTWV0aG9kQ2hhbmdlKG1ldGhvZDogJ0dFVCcgfCAnUE9TVCcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kYXRhU291cmNlKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHRoaXMuc2V0RGF0YVNvdXJjZS5lbWl0KHsgLi4uY3VycmVudCwgbWV0aG9kIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQXBpRGF0YVBhdGhDaGFuZ2UoZGF0YVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFTb3VyY2UoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgdGhpcy5zZXREYXRhU291cmNlLmVtaXQoeyAuLi5jdXJyZW50LCBkYXRhUGF0aDogZGF0YVBhdGgudHJpbSgpIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQXBpVXNlUHJveHlDaGFuZ2UodXNlUHJveHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kYXRhU291cmNlKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHRoaXMuc2V0RGF0YVNvdXJjZS5lbWl0KHsgLi4uY3VycmVudCwgdXNlUHJveHkgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RFbnRpdHkoZW50aXR5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFlbnRpdHlOYW1lKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnICYmIHRoaXMuZGF0YURpc2NvdmVyeSkge1xuICAgICAgdGhpcy5kYXRhRGlzY292ZXJ5LmdldFBhcmFtZXRlcnMoZW50aXR5TmFtZSwgJ2RibycpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChwYXJhbXMpID0+IHRoaXMuaW50ZXJuYWxQYXJhbWV0ZXJzLnNldChwYXJhbXMgfHwgW10pLFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5pbnRlcm5hbFBhcmFtZXRlcnMuc2V0KFtdKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmludGVybmFsUGFyYW1ldGVycy5zZXQoW10pO1xuICAgIH1cbiAgICB0aGlzLmVudGl0eUNoYW5nZWQuZW1pdCh7IG5hbWU6IGVudGl0eU5hbWUsIHR5cGU6IHRoaXMuY3VycmVudFNvdXJjZVR5cGUoKSB9KTtcbiAgfVxuXG4gIGdldFBhcmFtZXRlclZhbHVlKHBhcmFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gICAgY29uc3QgbWFwcGluZ3MgPSAodGhpcy5kYXRhU291cmNlKCk/LnBhcmFtZXRlck1hcHBpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KSB8fCB7fTtcbiAgICBjb25zdCB2YWwgPSBnZXRGaWVsZENhc2VJbnNlbnNpdGl2ZShtYXBwaW5ncywgcGFyYW1OYW1lKTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvblBhcmFtZXRlckNoYW5nZShwYXJhbU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc2V0UGFyYW1ldGVyTWFwcGluZyh0aGlzLmRhdGFTb3VyY2UoKT8ucGFyYW1ldGVyTWFwcGluZ3MsIHBhcmFtTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZVBhcmFtZXRlcnMuZW1pdChjdXJyZW50KTtcbiAgfVxuXG4gIG9uVXBkYXRlQ29sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW4uZW1pdCh7IGluZGV4LCBmaWVsZCwgdmFsdWUgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDbGlja0FjdGlvbihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh7XG4gICAgICAgIHR5cGU6ICdvcGVuLWRyYXdlcicsXG4gICAgICAgIGRyYXdlclRpdGxlOiAnRGV0YWlscycsXG4gICAgICAgIGRyYXdlcldpZHRoOiAnNzYwcHgnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJvd0FjdGlvbkZpZWxkKGZpZWxkOiBrZXlvZiBHcmlkUm93Q2xpY2tBY3Rpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBuZXh0ID0geyAuLi5jdXJyZW50LCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdChuZXh0KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlck1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBtYXBwaW5nID0geyAuLi4oY3VycmVudC5wYXJhbWV0ZXJNYXBwaW5nID8/IHt9KSB9O1xuICAgIGxldCBpZHggPSBPYmplY3Qua2V5cyhtYXBwaW5nKS5sZW5ndGggKyAxO1xuICAgIGxldCBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIHdoaWxlIChrZXkgaW4gbWFwcGluZykge1xuICAgICAgaWR4Kys7XG4gICAgICBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIH1cbiAgICBtYXBwaW5nW2tleV0gPSAncm93LmlkJztcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBtYXBwaW5nIH0pO1xuICB9XG5cbiAgdXBkYXRlTWFwcGluZ0tleShpbmRleDogbnVtYmVyLCBuZXdLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCBrID0gaSA9PT0gaW5kZXggPyBuZXdLZXkgOiBwLmtleTtcbiAgICAgIGlmIChrLnRyaW0oKSkge1xuICAgICAgICBuZXh0TWFwcGluZ1trLnRyaW0oKV0gPSBwLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICB1cGRhdGVNYXBwaW5nVmFsdWUoaW5kZXg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2ID0gaSA9PT0gaW5kZXggPyBuZXdWYWx1ZSA6IHAudmFsdWU7XG4gICAgICBpZiAocC5rZXkudHJpbSgpKSB7XG4gICAgICAgIG5leHRNYXBwaW5nW3Aua2V5LnRyaW0oKV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICByZW1vdmVNYXBwaW5nKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWlycyA9IHRoaXMucGFyYW1ldGVyTWFwcGluZ3MoKTtcbiAgICBjb25zdCBuZXh0TWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhaXJzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgIGlmIChpICE9PSBpbmRleCAmJiBwLmtleS50cmltKCkpIHtcbiAgICAgICAgbmV4dE1hcHBpbmdbcC5rZXkudHJpbSgpXSA9IHAudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBuZXh0TWFwcGluZyB9KTtcbiAgfVxufVxuIiwiICAgIEBpZiAoIWdyaWQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWdyaWQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1pY29uXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjI4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImVtcHR5LWdyaWQtdGl0bGVcIj5ObyBSZXN1bHQgR3JpZCBBdHRhY2hlZDwvaDQ+XG4gICAgICAgIDxwIGNsYXNzPVwiZW1wdHktZ3JpZC1kZXNjXCI+QXR0YWNoIGFuIGludGVyYWN0aXZlIFJlc3VsdCBEYXRhIEdyaWQgKG9yIFVsdHJhR3JpZCkgdG8gdGhpcyByZXBvcnQgZGVmaW5pdGlvbiB0byByZW5kZXIgcXVlcmllcyBhbmQgc3RvcmVkIHByb2NlZHVyZSByZXN1bHRzLjwvcD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY3JlYXRlLWdyaWQtYWN0aW9uXCIgKGNsaWNrKT1cImFkZEdyaWQuZW1pdCgpXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPisgQWRkIFJlc3VsdCBHcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInByb3BzLWZvcm1cIj5cbiAgICAgIDwhLS0gMS4gUmVwb3J0IERhdGEgU291cmNlICYgU3RvcmVkIFByb2NlZHVyZSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlLXdyYXBcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5SZXBvcnQgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGFjdGl2ZUVudGl0eU5hbWUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLWJhZGdlIGFjdGl2ZS1kcy1iYWRnZVwiPnt7IGFjdGl2ZUVudGl0eU5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTb3VyY2UgVHlwZSBTd2l0Y2hlciAoU3RvcmVkIFByb2NlZHVyZSB2cyBUYWJsZSB2cyBSRVNUIEFQSSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzb3VyY2UtdHlwZS1zd2l0Y2hlclwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdzdG9yZWRfcHJvY2VkdXJlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Tb3VyY2VUeXBlQ2hhbmdlKCdzdG9yZWRfcHJvY2VkdXJlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0b3JlZCBQcm9jZWR1cmU8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNvdXJjZS10YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3RhYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Tb3VyY2VUeXBlQ2hhbmdlKCd0YWJsZScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+VGFibGUgLyBWaWV3PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdhcGknXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNvdXJjZVR5cGVDaGFuZ2UoJ2FwaScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImdsb2JlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+UkVTVCBBUEk8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ2FwaScpIHtcbiAgICAgICAgICA8IS0tIEFQSSBFbmRwb2ludCBTZWxlY3RvciAvIElucHV0IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QVBJIEVuZHBvaW50IFVSTDwvbGFiZWw+XG4gICAgICAgICAgICBAaWYgKHJlZ2lzdGVyZWRBcGlzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNnB4O1wiPlxuICAgICAgICAgICAgICAgIDxycHQtc2VhcmNoYWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInJlZ2lzdGVyZWRBcGlzKClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRW5kcG9pbnQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkFwaUVuZHBvaW50Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBTZWxlY3QgUmVnaXN0ZXJlZCBFbmRwb2ludCBvciB0eXBlIGJlbG93IC0tXCJcbiAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwiU2VhcmNoIHJlZ2lzdGVyZWQgQVBJcy4uLlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAvYXBpL3YxL29yZGVycyBvciBodHRwczovL2FwaS5zZXJ2aWNlLmNvbS9kYXRhXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRW5kcG9pbnQoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQXBpRW5kcG9pbnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1oaW50XCIgc3R5bGU9XCJmb250LXNpemU6IDExcHg7IGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7IG1hcmdpbi10b3A6IDRweDsgZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgIERpcmVjdCBIVFRQIGNhbGwgb3IgYmFja2VuZCBwcm94eS4gVXNlIDxjb2RlPjpwYXJhbTwvY29kZT4gZm9yIHJvdXRlIHRva2Vucy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gSFRUUCBNZXRob2QgJiBEYXRhIFBhdGggR3JpZCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtZ3JpZC0yXCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkhUVFAgTWV0aG9kPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhcGlNZXRob2QoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BcGlNZXRob2RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUIChRdWVyeSBTdHJpbmcpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlBPU1RcIj5QT1NUIChCb2R5IFBheWxvYWQpPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UmVzcG9uc2UgRGF0YSBQYXRoPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gZGF0YS5pdGVtcywgcm93c1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXBpRGF0YVBhdGgoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BcGlEYXRhUGF0aENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBVc2UgUHJveHkgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3cgY2hlY2tib3gtZmllbGQtcm93XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTJweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFwaVVzZVByb3h5KClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25BcGlVc2VQcm94eUNoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC10ZXh0XCI+Um91dGUgdGhyb3VnaCBiYWNrZW5kIHByb3h5IChieXBhc3NlcyBDT1JTIC8gaGlkZXMgY3JlZGVudGlhbHMpPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBFbnRpdHkgU2VsZWN0b3IgRHJvcGRvd24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ1N0b3JlZCBQcm9jZWR1cmUnIDogJ1RhYmxlIC8gVmlldycgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8cnB0LXNlYXJjaGFibGUtc2VsZWN0XG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImdyaWRFbnRpdHlTZWxlY3RPcHRpb25zKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVFbnRpdHlOYW1lKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdEVudGl0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBDaG9vc2UgRGF0YSBTb3VyY2UgLS1cIlxuICAgICAgICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwiY3VycmVudFNvdXJjZVR5cGUoKSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ1NlYXJjaCBwcm9jZWR1cmVzLi4uJyA6ICdTZWFyY2ggdGFibGVzICYgdmlld3MuLi4nXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyIE1hcHBpbmdzIC0tPlxuICAgICAgICBAaWYgKGN1cnJlbnRTb3VyY2VUeXBlKCkgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyAmJiBhY3RpdmVFbnRpdHlOYW1lKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvY2VkdXJlLXBhcmFtcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW1zLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbXMtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtcy10aXRsZVwiPlByb2NlZHVyZSBQYXJhbWV0ZXJzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW1zLWNvdW50LWJhZGdlXCI+e3sgZWZmZWN0aXZlUGFyYW1ldGVycygpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1wYXN0ZS1leGVjXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhlY1NuaXBwZXQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJQYXN0ZSBmdWxsIFNTTVMgJ0VYRUMgcHJvYyBAcGFyYW09dmFsJyBzbmlwcGV0IHRvIGZpbGwgcGFyYW1ldGVycyBhdXRvbWF0aWNhbGx5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpc0V4ZWNTbmlwcGV0T3BlbigpID8gJ0Nsb3NlIFNRTCcgOiAnUGFzdGUgU1FMIEV4ZWMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGlzRXhlY1NuaXBwZXRPcGVuKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4ZWMtc25pcHBldC1wYW5lbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGVjLXNuaXBwZXQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNuaXBwZXQtaGludFwiPlBhc3RlIGZ1bGwgPGNvZGU+RVhFQyBQcm9jZWR1cmVOYW1lICYjNjQ7cGFyYW09dmFsLi4uPC9jb2RlPiBzdGF0ZW1lbnQgZnJvbSBTU01TOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhlYy1zbmlwcGV0LXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCIzXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBleGVjIEdldF9IZWxwTGlzdCBAY2hyQ09NUEFOWUlEPU4nMTAxJyxAY2hyVGFibGVOYW1lPU4nTVNUQUNDVEdMU1VCJy4uLlwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJleGVjU25pcHBldFRleHQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJleGVjU25pcHBldFRleHQuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGVjLXNuaXBwZXQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tc25pcHBldC1hcHBseVwiIChjbGljayk9XCJhcHBseUV4ZWNTbmlwcGV0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXBwbHkgUGFyYW1ldGVyczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tc25pcHBldC1jYW5jZWxcIiAoY2xpY2spPVwidG9nZ2xlRXhlY1NuaXBwZXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoZXhlY1BhcnNlU3RhdHVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbmlwcGV0LXN0YXR1c1wiIFtjbGFzcy5pcy1lcnJvcl09XCJleGVjUGFyc2VTdGF0dXMoKT8ua2luZCA9PT0gJ2Vycm9yJ1wiIFtjbGFzcy5pcy1zdWNjZXNzXT1cImV4ZWNQYXJzZVN0YXR1cygpPy5raW5kID09PSAnc3VjY2VzcydcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZXhlY1BhcnNlU3RhdHVzKCk/Lm1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoZWZmZWN0aXZlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWNhcmRzLWxpc3RcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChwYXJhbSBvZiBlZmZlY3RpdmVQYXJhbWV0ZXJzKCk7IHRyYWNrIHBhcmFtLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtcGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbV09XCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW50VmFsdWVdPVwiZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW0ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICBbYWxsQ29tcG9uZW50c109XCJhbGxDb21wb25lbnRzKClcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXJhbWV0ZXJDaGFuZ2UocGFyYW0ubmFtZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXBhcmFtcy1oaW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgdGhpcyBwcm9jZWR1cmUuPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gMi4gUmVzdWx0IENvbHVtbnMgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZS13cmFwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+Q29sdW1uczwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtYmFkZ2VcIj57eyBjb2x1bW5zKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERlZGljYXRlZCBGdWxsLVdpZHRoIEFjdGlvbiBCdXR0b25zIChObyBjcmFtcGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zLWFjdGlvbi1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNvbC1hY3Rpb24gYnRuLWF1dG8tZGV0ZWN0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhdXRvRGV0ZWN0Q29sdW1ucy5lbWl0KClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGV0ZWN0aW5nKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJBdXRvLWRldGVjdCBhbGwgY29sdW1ucyBmcm9tIHByb2NlZHVyZSBvciBkYXRhIHRhYmxlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMlwiIFtjbGFzcy5ycHQtc3Bpbl09XCJpc0RldGVjdGluZygpXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IGlzRGV0ZWN0aW5nKCkgPyAnRGV0ZWN0aW5nLi4uJyA6ICdBdXRvLURldGVjdCcgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1jb2wtYWN0aW9uIGJ0bi1hZGQtY29sXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRDb2x1bW4uZW1pdCgpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQWRkIGEgbmV3IGNvbHVtbiBtYW51YWxseVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+KyBBZGQgQ29sdW1uPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKHN0YXR1c01lc3NhZ2UoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc3RhdHVzLWJhbm5lclwiIFtjbGFzcy5pcy1lcnJvcl09XCJzdGF0dXNLaW5kKCkgPT09ICdlcnJvcidcIiBbY2xhc3MuaXMtc3VjY2Vzc109XCJzdGF0dXNLaW5kKCkgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cInN0YXR1c0tpbmQoKSA9PT0gJ2Vycm9yJyA/ICdjbG9zZScgOiAnY2hlY2snXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgc3RhdHVzTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtZWRpdG9yLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWhlYWRlci10aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtZHJhZy1kb3RzXCI+4ouu4ouuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtaWR4LWJhZGdlXCI+I3t7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC10aXRsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sLXR5cGUtcGlsbFwiPnt7IGNvbC5kYXRhVHlwZSB8fCAnc3RyaW5nJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWFjdGlvbi1idG4gYnRuLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb2x1bW4uZW1pdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5GaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnZmllbGQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdkYXRhVHlwZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN0cmluZ1wiPlN0cmluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VycmVuY3lcIj5DdXJyZW5jeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29sZWFuXCI+Qm9vbGVhbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZvcm1hdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBkZC9NTS95eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmb3JtYXQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFsaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5hbGlnbiB8fCAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FsaWduJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2VudGVyXCI+Q2VudGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5BZ2dyZWdhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFnZ3JlZ2F0ZSB8fCAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FnZ3JlZ2F0ZScsICRldmVudCA9PT0gJ25vbmUnID8gdW5kZWZpbmVkIDogJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtXCI+U3VtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF2Z1wiPkF2ZXJhZ2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY291bnRcIj5Db3VudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaW5cIj5NaW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWF4XCI+TWF4PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC53aWR0aCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wudmlzaWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ3Zpc2libGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmNoZWNrYm94U2VsZWN0aW9uID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdjaGVja2JveFNlbGVjdGlvbicsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEdyaWQgVGFibGUgT3B0aW9ucyBHcm91cCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5UYWJsZSBPcHRpb25zPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uc2lkZUJhciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2lkZUJhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBTaWRlIFBhbmVsIChUb29sIFBhbmVscyk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uZ2xvYmFsU2VhcmNoICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdnbG9iYWxTZWFyY2gnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5HbG9iYWwgU2VhcmNoIEJveDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zdGF0dXNCYXIgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3N0YXR1c0JhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0YXR1cyBCYXI8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnaW5hdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2luYXRpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5FbmFibGUgUGFnaW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2VsZWN0YWJsZScsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlJvdyBTZWxlY3Rpb248L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGFibGUgPz8gdHJ1ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U2VsZWN0aW9uIE1vZGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3Rpb25Nb2RlID8/IGdyaWQoKT8ub3B0aW9ucz8ucm93U2VsZWN0aW9uID8/ICdtdWx0aXBsZSdcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2VsZWN0aW9uTW9kZScsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibXVsdGlwbGVcIj5NdWx0aXBsZSBSb3dzPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzaW5nbGVcIj5TaW5nbGUgUm93PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uY2hlY2tib3hTZWxlY3Rpb24gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2NoZWNrYm94U2VsZWN0aW9uJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkNoZWNrYm94IFNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKChncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGlvbk1vZGUgPz8gJ211bHRpcGxlJykgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5oZWFkZXJDaGVja2JveFNlbGVjdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdoZWFkZXJDaGVja2JveFNlbGVjdGlvbicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+SGVhZGVyIFNlbGVjdCBBbGwgQ2hlY2tib3g8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5hbGxvd0NvbHVtblJlb3JkZXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdhbGxvd0NvbHVtblJlb3JkZXInLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5BbGxvdyBDb2x1bW4gUmVvcmRlcjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5hbGxvd0V4cG9ydCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2FsbG93RXhwb3J0JywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+QWxsb3cgRXhwb3J0PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlBhZ2UgU2l6ZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICBtYXg9XCIxMDAwXCJcbiAgICAgICAgICAgICh3aGVlbCk9XCIkYW55KCRldmVudC50YXJnZXQpLmJsdXIoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5hcnJvd3VwKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmFycm93ZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnBhZ2VTaXplID8/IDEwXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdwYWdlU2l6ZScsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Um93TnVtYmVycyA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3Nob3dSb3dOdW1iZXJzJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBSb3cgTnVtYmVyczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Rm9vdGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd0Zvb3RlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNob3cgRm9vdGVyIFRvdGFsczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJvdyBDbGljayAmIERyaWxsLURvd24gQWN0aW9uIEdyb3VwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPlJvdyBDbGljayAmIERyaWxsLURvd248L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGFzUm93Q2xpY2tBY3Rpb24oKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVJvd0NsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBSb3cgQ2xpY2sgQWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaGFzUm93Q2xpY2tBY3Rpb24oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QWN0aW9uIFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IGZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnR5cGUgfHwgJ29wZW4tZHJhd2VyJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCd0eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcGVuLWRyYXdlclwiPlNsaWRlLU92ZXIgRGV0YWlsIERyYXdlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZHJpbGxkb3duLXJlcG9ydFwiPkRyaWxsLURvd24gUmVwb3J0IChIb3N0IEV2ZW50KTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmF2aWdhdGVcIj5OYXZpZ2F0ZSB0byBVUkw8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVtaXQtY3VzdG9tXCI+RW1pdCBDdXN0b20gQWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ29wZW4tZHJhd2VyJyB8fCByb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnZHJpbGxkb3duLXJlcG9ydCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5UYXJnZXQgUmVwb3J0IElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBvcmRlci1kZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy50YXJnZXRSZXBvcnRJZCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFJlcG9ydElkJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRyYXdlciBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gT3JkZXIgRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uZHJhd2VyVGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCdkcmF3ZXJUaXRsZScsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EcmF3ZXIgV2lkdGg8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDc2MHB4LCA4MCUsIDkwMHB4XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5kcmF3ZXJXaWR0aCB8fCAnNzYwcHgnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnZHJhd2VyV2lkdGgnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRhcmdldCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvb3JkZXJzL3t7cm93Lm9yZGVySWR9fSBvciBodHRwczovLy4uLidcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnRhcmdldFVybCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFVybCcsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/Lm9wZW5OZXdUYWIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ29wZW5OZXdUYWInLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPk9wZW4gaW4gTmV3IFRhYjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ2VtaXQtY3VzdG9tJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkN1c3RvbSBBY3Rpb24gTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gdmlldy1hdWRpdC10cmFpbFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uY3VzdG9tQWN0aW9uTmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ2N1c3RvbUFjdGlvbk5hbWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5QYXJhbWV0ZXIgTWFwcGluZzwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hZGQtbWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFBhcmFtZXRlck1hcHBpbmcoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBmb3IgKG1hcHBpbmcgb2YgcGFyYW1ldGVyTWFwcGluZ3MoKTsgdHJhY2sgbWFwcGluZy5rZXk7IGxldCBtSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBwaW5nLXBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYXJnZXQgKGUuZy4gY3VzdG9tZXJJZClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWFwcGluZy5rZXlcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTWFwcGluZ0tleShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogIzk0YTNiODtcIj7ihpA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTb3VyY2UgKGUuZy4gcm93LmlkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJtYXBwaW5nLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU1hcHBpbmdWYWx1ZShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYWN0aW9uLWJ0biBidG4tZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVNYXBwaW5nKG1JZHgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIG1hcHBpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSZW1vdmUgR3JpZCBBY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1kYW5nZXItem9uZVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb25cIiAoY2xpY2spPVwicmVtb3ZlR3JpZC5lbWl0KClcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlJlbW92ZSBHcmlkIGZyb20gUmVwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH0iXX0=
|