@cqa-lib/cqa-ui 1.1.549-delta.1 → 1.1.549-delta.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/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +298 -19
- package/esm2020/lib/test-case-details/api-edit-step/graphql-operation-picker/graphql-operation-picker.component.mjs +121 -0
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +413 -30
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +408 -11
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/api-edit-step/api-edit-step.component.d.ts +108 -5
- package/lib/test-case-details/api-edit-step/graphql-operation-picker/graphql-operation-picker.component.d.ts +83 -0
- package/lib/ui-kit.module.d.ts +60 -59
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
|
@@ -3,15 +3,16 @@ import { FormArray, FormControl } from '@angular/forms';
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/forms";
|
|
5
5
|
import * as i2 from "../../button/button.component";
|
|
6
|
-
import * as i3 from "../../
|
|
7
|
-
import * as i4 from "../../
|
|
6
|
+
import * as i3 from "../../segment-control/segment-control.component";
|
|
7
|
+
import * as i4 from "../../custom-input/custom-input.component";
|
|
8
8
|
import * as i5 from "../../autocomplete/autocomplete.component";
|
|
9
|
-
import * as i6 from "../../
|
|
10
|
-
import * as i7 from "../../
|
|
11
|
-
import * as i8 from "../../
|
|
12
|
-
import * as i9 from "
|
|
13
|
-
import * as i10 from "
|
|
14
|
-
import * as i11 from "
|
|
9
|
+
import * as i6 from "../../dynamic-select/dynamic-select-field.component";
|
|
10
|
+
import * as i7 from "../../badge/badge.component";
|
|
11
|
+
import * as i8 from "../../custom-textarea/custom-textarea.component";
|
|
12
|
+
import * as i9 from "./graphql-operation-picker/graphql-operation-picker.component";
|
|
13
|
+
import * as i10 from "@angular/material/icon";
|
|
14
|
+
import * as i11 from "../../step-builder/advanced-variables-form/advanced-variables-form.component";
|
|
15
|
+
import * as i12 from "@angular/common";
|
|
15
16
|
export const API_EDIT_STEP_LABELS = {
|
|
16
17
|
REQUEST_DETAILS: 'Request Details',
|
|
17
18
|
STORE_RESPONSE: 'Store Response',
|
|
@@ -351,6 +352,10 @@ export class ApiEditStepComponent {
|
|
|
351
352
|
this.cdr = cdr;
|
|
352
353
|
/** True while parent is creating the step (API in progress); show loader on Create/Update button */
|
|
353
354
|
this.isCreatingStep = false;
|
|
355
|
+
/** Operations list for the picker. Empty until parent loads/introspects the schema. */
|
|
356
|
+
this.graphQLOperations = [];
|
|
357
|
+
/** True while the parent is introspecting; the picker swaps its empty state for a spinner. */
|
|
358
|
+
this.isLoadingGraphQLSchema = false;
|
|
354
359
|
/** Emits the cURL string when user clicks Import (value from the textarea control). */
|
|
355
360
|
this.importCurl = new EventEmitter();
|
|
356
361
|
/** Emits when user cancels the Import cURL panel (clicks Cancel). */
|
|
@@ -412,6 +417,8 @@ export class ApiEditStepComponent {
|
|
|
412
417
|
this.environmentSearch = new EventEmitter();
|
|
413
418
|
/** Emit when user scrolls to load more environments. */
|
|
414
419
|
this.environmentLoadMore = new EventEmitter();
|
|
420
|
+
/** Emit when user clicks "Load Schema" in GraphQL mode. Parent handles the schema fetch (or shows a "coming soon" toast for now). */
|
|
421
|
+
this.loadSchema = new EventEmitter();
|
|
415
422
|
/** Auth type options: array of strings or objects with id, name, value, label (passed from parent). Falls back to built-in list when empty. */
|
|
416
423
|
this.authTypeOptions = [];
|
|
417
424
|
/** Config for Auth Type dropdown (updated when authTypeOptions changes, like environment) */
|
|
@@ -442,13 +449,23 @@ export class ApiEditStepComponent {
|
|
|
442
449
|
this._url = '';
|
|
443
450
|
/** When true, params form changes should not update the URL (we're syncing from URL). */
|
|
444
451
|
this.paramsSyncingFromUrl = false;
|
|
445
|
-
this.payloadTabs = [
|
|
446
|
-
{ value: 'authorization', label: 'Authorization' },
|
|
447
|
-
{ value: 'headers', label: 'Headers' },
|
|
448
|
-
{ value: 'body', label: 'Body' },
|
|
449
|
-
{ value: 'params', label: 'Params' },
|
|
450
|
-
];
|
|
451
452
|
this.activePayloadTab = 'headers';
|
|
453
|
+
/** Currently selected API type. REST is the default and matches today's behaviour exactly. */
|
|
454
|
+
this.activeApiType = 'rest';
|
|
455
|
+
/** Segments rendered above the Method/URL row. SOAP/WebSocket/gRPC are intentionally `disabled` for now. */
|
|
456
|
+
this.apiTypeSegments = [
|
|
457
|
+
{ label: 'REST API', value: 'rest' },
|
|
458
|
+
{ label: 'GraphQL', value: 'graphql' },
|
|
459
|
+
{ label: 'SOAP', value: 'soap', disabled: true, tooltip: 'Coming soon' },
|
|
460
|
+
{ label: 'WebSocket', value: 'websocket', disabled: true, tooltip: 'Coming soon' },
|
|
461
|
+
{ label: 'gRPC', value: 'grpc', disabled: true, tooltip: 'Coming soon' },
|
|
462
|
+
];
|
|
463
|
+
/** Inline error displayed under the Query textarea when empty/blank on Save. Cleared as the user types. */
|
|
464
|
+
this.graphQLQueryError = '';
|
|
465
|
+
/** Inline error displayed under the Variables textarea when JSON is malformed. */
|
|
466
|
+
this.graphQLVariablesError = '';
|
|
467
|
+
/** Non-blocking warning shown under the Operation Name field when the query declares 2+ operations. */
|
|
468
|
+
this.graphQLOperationWarning = '';
|
|
452
469
|
/** Step 3: Response verification tabs */
|
|
453
470
|
this.responseVerificationTabs = [
|
|
454
471
|
{ value: 'response-body', label: 'Response Body' },
|
|
@@ -762,6 +779,12 @@ export class ApiEditStepComponent {
|
|
|
762
779
|
get urlPlaceholder() {
|
|
763
780
|
return (this.urlOptions?.length ?? 0) > 0 ? 'Enter URL or select Parameter *' : 'Enter URL *';
|
|
764
781
|
}
|
|
782
|
+
/** Tabs visible under the request row, swapped based on `activeApiType`. */
|
|
783
|
+
get payloadTabs() {
|
|
784
|
+
return this.activeApiType === 'graphql'
|
|
785
|
+
? ApiEditStepComponent.GRAPHQL_PAYLOAD_TABS
|
|
786
|
+
: ApiEditStepComponent.REST_PAYLOAD_TABS;
|
|
787
|
+
}
|
|
765
788
|
onPayloadTypeChange(val) {
|
|
766
789
|
this.payloadType = val;
|
|
767
790
|
}
|
|
@@ -1115,6 +1138,50 @@ export class ApiEditStepComponent {
|
|
|
1115
1138
|
if (this.advancedSettingsVariables && this.advancedSettingsVariables.length > 0) {
|
|
1116
1139
|
this.buildAdvancedVariablesForm();
|
|
1117
1140
|
}
|
|
1141
|
+
// GraphQL form + initial state. Hydrate from `initialApiType` / `initialGraphQL` if the parent
|
|
1142
|
+
// is editing a GraphQL step. Variables come in as either an object (preferred) or a JSON string —
|
|
1143
|
+
// we always store the form value as a pretty-printed JSON string so the textarea round-trips cleanly.
|
|
1144
|
+
this.activeApiType = this.initialApiType === 'graphql' ? 'graphql' : 'rest';
|
|
1145
|
+
const initialQuery = this.initialGraphQL?.query ?? '';
|
|
1146
|
+
const initialVarsRaw = this.initialGraphQL?.variables;
|
|
1147
|
+
let initialVariablesString = '';
|
|
1148
|
+
if (initialVarsRaw != null) {
|
|
1149
|
+
if (typeof initialVarsRaw === 'string') {
|
|
1150
|
+
initialVariablesString = initialVarsRaw;
|
|
1151
|
+
}
|
|
1152
|
+
else {
|
|
1153
|
+
try {
|
|
1154
|
+
initialVariablesString = JSON.stringify(initialVarsRaw, null, 2);
|
|
1155
|
+
}
|
|
1156
|
+
catch {
|
|
1157
|
+
initialVariablesString = '';
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
const initialOperationName = this.initialGraphQL?.operationName ?? '';
|
|
1162
|
+
this.graphQLForm = this.fb.group({
|
|
1163
|
+
query: [initialQuery],
|
|
1164
|
+
variables: [initialVariablesString],
|
|
1165
|
+
operationName: [initialOperationName],
|
|
1166
|
+
});
|
|
1167
|
+
// Re-validate as the user types so inline errors clear/re-render in real time.
|
|
1168
|
+
this.graphQLForm.get('query')?.valueChanges.subscribe(() => {
|
|
1169
|
+
if (this.graphQLQueryError)
|
|
1170
|
+
this.graphQLQueryError = '';
|
|
1171
|
+
this.recomputeGraphQLOperationWarning();
|
|
1172
|
+
});
|
|
1173
|
+
this.graphQLForm.get('variables')?.valueChanges.subscribe(() => {
|
|
1174
|
+
this.validateGraphQLVariables(false);
|
|
1175
|
+
});
|
|
1176
|
+
this.graphQLForm.get('operationName')?.valueChanges.subscribe(() => {
|
|
1177
|
+
this.recomputeGraphQLOperationWarning();
|
|
1178
|
+
});
|
|
1179
|
+
// Default the active tab to "graphql" when the user is editing a GraphQL step,
|
|
1180
|
+
// so the Query / Variables / Operation Name fields are visible immediately.
|
|
1181
|
+
if (this.activeApiType === 'graphql') {
|
|
1182
|
+
this.activePayloadTab = 'graphql';
|
|
1183
|
+
}
|
|
1184
|
+
this.recomputeGraphQLOperationWarning();
|
|
1118
1185
|
}
|
|
1119
1186
|
ngAfterViewInit() {
|
|
1120
1187
|
this.setupPayloadTextareaScrollSync();
|
|
@@ -1633,6 +1700,8 @@ export class ApiEditStepComponent {
|
|
|
1633
1700
|
keyValueRows: step1.keyValueRows,
|
|
1634
1701
|
keyTypeValueRows: step1.keyTypeValueRows,
|
|
1635
1702
|
paramsRows: step1.paramsRows,
|
|
1703
|
+
...(step1.apiType && { apiType: step1.apiType }),
|
|
1704
|
+
...(step1.graphQL && { graphQL: step1.graphQL }),
|
|
1636
1705
|
});
|
|
1637
1706
|
}
|
|
1638
1707
|
catch {
|
|
@@ -1690,6 +1759,145 @@ export class ApiEditStepComponent {
|
|
|
1690
1759
|
setPayloadTab(value) {
|
|
1691
1760
|
this.activePayloadTab = value;
|
|
1692
1761
|
}
|
|
1762
|
+
/**
|
|
1763
|
+
* Handle API Type segment toggle (REST ↔ GraphQL). When switching to GraphQL we
|
|
1764
|
+
* jump to the GraphQL tab so the Query / Variables / Operation Name fields are
|
|
1765
|
+
* immediately visible. When switching back to REST we land on Headers (REST default).
|
|
1766
|
+
* Disabled segments (SOAP/WebSocket/gRPC) cannot fire here — `cqa-segment-control`
|
|
1767
|
+
* blocks the click — but we guard anyway in case a future caller bypasses that.
|
|
1768
|
+
*/
|
|
1769
|
+
onApiTypeChange(value) {
|
|
1770
|
+
if (value !== 'rest' && value !== 'graphql')
|
|
1771
|
+
return;
|
|
1772
|
+
if (this.activeApiType === value)
|
|
1773
|
+
return;
|
|
1774
|
+
this.activeApiType = value;
|
|
1775
|
+
if (this.activeApiType === 'graphql') {
|
|
1776
|
+
this.activePayloadTab = 'graphql';
|
|
1777
|
+
// Re-validate variables on first switch — the textarea may already have content
|
|
1778
|
+
// from a previous edit and we want the inline error to surface immediately.
|
|
1779
|
+
this.validateGraphQLVariables(false);
|
|
1780
|
+
this.recomputeGraphQLOperationWarning();
|
|
1781
|
+
}
|
|
1782
|
+
else {
|
|
1783
|
+
// Returning to REST — drop any GraphQL-only inline state so it doesn't linger.
|
|
1784
|
+
this.graphQLQueryError = '';
|
|
1785
|
+
this.graphQLVariablesError = '';
|
|
1786
|
+
this.graphQLOperationWarning = '';
|
|
1787
|
+
this.activePayloadTab = 'headers';
|
|
1788
|
+
}
|
|
1789
|
+
this.cdr.markForCheck();
|
|
1790
|
+
}
|
|
1791
|
+
/**
|
|
1792
|
+
* Parse the Variables textarea as JSON. Empty string is valid (= no variables).
|
|
1793
|
+
* Sets `graphQLVariablesError` for inline display; returns the parsed object or
|
|
1794
|
+
* the raw string when the user typed something non-empty that didn't parse.
|
|
1795
|
+
*
|
|
1796
|
+
* @param strict When true (called from `onCreate`), an invalid JSON blocks save
|
|
1797
|
+
* — we leave the error visible and return `null` to signal abort.
|
|
1798
|
+
*/
|
|
1799
|
+
validateGraphQLVariables(strict) {
|
|
1800
|
+
const raw = (this.graphQLForm?.get('variables')?.value ?? '').trim();
|
|
1801
|
+
if (!raw) {
|
|
1802
|
+
this.graphQLVariablesError = '';
|
|
1803
|
+
return { value: undefined, valid: true };
|
|
1804
|
+
}
|
|
1805
|
+
try {
|
|
1806
|
+
const parsed = JSON.parse(raw);
|
|
1807
|
+
this.graphQLVariablesError = '';
|
|
1808
|
+
return { value: parsed, valid: true };
|
|
1809
|
+
}
|
|
1810
|
+
catch (err) {
|
|
1811
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1812
|
+
this.graphQLVariablesError = `Invalid JSON: ${message}`;
|
|
1813
|
+
// In non-strict mode (live typing) we still echo back the raw string so the parent
|
|
1814
|
+
// can decide what to do; in strict mode the caller checks `valid` to abort save.
|
|
1815
|
+
return { value: strict ? undefined : raw, valid: false };
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
/**
|
|
1819
|
+
* Detect when the GraphQL query declares 2+ named operations. GraphQL requires the
|
|
1820
|
+
* client to specify `operationName` in that case; absence is a runtime error, not a
|
|
1821
|
+
* syntax one, so we surface it as a non-blocking warning.
|
|
1822
|
+
*/
|
|
1823
|
+
recomputeGraphQLOperationWarning() {
|
|
1824
|
+
if (this.activeApiType !== 'graphql' || !this.graphQLForm) {
|
|
1825
|
+
this.graphQLOperationWarning = '';
|
|
1826
|
+
return;
|
|
1827
|
+
}
|
|
1828
|
+
const query = (this.graphQLForm.get('query')?.value ?? '');
|
|
1829
|
+
const opName = (this.graphQLForm.get('operationName')?.value ?? '').trim();
|
|
1830
|
+
if (!query.trim() || opName) {
|
|
1831
|
+
this.graphQLOperationWarning = '';
|
|
1832
|
+
return;
|
|
1833
|
+
}
|
|
1834
|
+
// Match `query`, `mutation`, `subscription` as standalone tokens at the start of a line.
|
|
1835
|
+
// Strip block/line comments first so commented-out operations don't trip the count.
|
|
1836
|
+
const stripped = query
|
|
1837
|
+
.replace(/#[^\n]*/g, '')
|
|
1838
|
+
.replace(/"""[\s\S]*?"""/g, '');
|
|
1839
|
+
const matches = stripped.match(/^[\s]*(query|mutation|subscription)\b/gm) || [];
|
|
1840
|
+
this.graphQLOperationWarning = matches.length >= 2
|
|
1841
|
+
? 'Multiple operations detected — Operation Name is required.'
|
|
1842
|
+
: '';
|
|
1843
|
+
}
|
|
1844
|
+
/**
|
|
1845
|
+
* Click handler for the "Load Schema" button (GraphQL mode only). Switches the body view
|
|
1846
|
+
* to the operation picker AND emits `loadSchema` so the parent can fetch / refresh the
|
|
1847
|
+
* schema in the background. The picker renders whatever `graphQLSchemaSource` /
|
|
1848
|
+
* `graphQLOperations` the parent has supplied at any given time — empty state by default.
|
|
1849
|
+
*/
|
|
1850
|
+
onLoadSchema() {
|
|
1851
|
+
this.bodyView = 'graphql-schema';
|
|
1852
|
+
this.loadSchema.emit({ url: this.url ?? '', headers: this.headers });
|
|
1853
|
+
this.cdr.markForCheck();
|
|
1854
|
+
}
|
|
1855
|
+
/** Picker → back: drop the picker view and return to the headers/tabs panel. */
|
|
1856
|
+
onGraphQLPickerBack() {
|
|
1857
|
+
this.bodyView = 'headers';
|
|
1858
|
+
this.cdr.markForCheck();
|
|
1859
|
+
}
|
|
1860
|
+
/** Picker → re-introspect: forward to parent so it can refetch the schema. */
|
|
1861
|
+
onGraphQLPickerReIntrospect() {
|
|
1862
|
+
this.loadSchema.emit({ url: this.url ?? '', headers: this.headers });
|
|
1863
|
+
}
|
|
1864
|
+
/**
|
|
1865
|
+
* Picker → operation selected: patch the GraphQL form (query / variables / operationName)
|
|
1866
|
+
* and pop back to the main view with the GraphQL tab active so the user can see the
|
|
1867
|
+
* filled-in fields.
|
|
1868
|
+
*/
|
|
1869
|
+
onGraphQLPickerOperationSelected(op) {
|
|
1870
|
+
if (!this.graphQLForm) {
|
|
1871
|
+
this.bodyView = 'headers';
|
|
1872
|
+
return;
|
|
1873
|
+
}
|
|
1874
|
+
let variablesString = '';
|
|
1875
|
+
if (op.variables != null) {
|
|
1876
|
+
try {
|
|
1877
|
+
variablesString = JSON.stringify(op.variables, null, 2);
|
|
1878
|
+
}
|
|
1879
|
+
catch {
|
|
1880
|
+
variablesString = '';
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
this.graphQLForm.patchValue({
|
|
1884
|
+
query: op.query ?? '',
|
|
1885
|
+
variables: variablesString,
|
|
1886
|
+
operationName: op.operationName ?? op.name ?? '',
|
|
1887
|
+
});
|
|
1888
|
+
this.graphQLQueryError = '';
|
|
1889
|
+
this.graphQLVariablesError = '';
|
|
1890
|
+
this.recomputeGraphQLOperationWarning();
|
|
1891
|
+
// Drop any stale response from a previously-picked operation. The next Send Request
|
|
1892
|
+
// will populate the preview again. Note: ngOnChanges on `initialResponsePreview` only
|
|
1893
|
+
// syncs non-null values down, so clearing here doesn't get clobbered when the parent
|
|
1894
|
+
// also clears its `initialResponsePreview` field.
|
|
1895
|
+
this.responsePreview = '';
|
|
1896
|
+
this.activeApiType = 'graphql';
|
|
1897
|
+
this.activePayloadTab = 'graphql';
|
|
1898
|
+
this.bodyView = 'headers';
|
|
1899
|
+
this.cdr.markForCheck();
|
|
1900
|
+
}
|
|
1693
1901
|
setResponseVerificationTab(value) {
|
|
1694
1902
|
this.activeResponseVerificationTab = value;
|
|
1695
1903
|
}
|
|
@@ -1814,6 +2022,22 @@ export class ApiEditStepComponent {
|
|
|
1814
2022
|
/** Emit all entered details (environment, HTTP method, URL, headers, body, step2 variable, step3 verifications) when user clicks Create. */
|
|
1815
2023
|
onCreate() {
|
|
1816
2024
|
console.log('9999999');
|
|
2025
|
+
// GraphQL mode validation: query is required + non-blank, variables (if non-empty) must be valid JSON.
|
|
2026
|
+
if (this.activeApiType === 'graphql') {
|
|
2027
|
+
const query = (this.graphQLForm?.get('query')?.value ?? '').trim();
|
|
2028
|
+
if (!query) {
|
|
2029
|
+
this.graphQLQueryError = 'Query is required.';
|
|
2030
|
+
this.activePayloadTab = 'graphql';
|
|
2031
|
+
this.cdr.markForCheck();
|
|
2032
|
+
return;
|
|
2033
|
+
}
|
|
2034
|
+
const variables = this.validateGraphQLVariables(true);
|
|
2035
|
+
if (!variables.valid) {
|
|
2036
|
+
this.activePayloadTab = 'graphql';
|
|
2037
|
+
this.cdr.markForCheck();
|
|
2038
|
+
return;
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
1817
2041
|
try {
|
|
1818
2042
|
const payload = this.getCreatePayload();
|
|
1819
2043
|
console.log('9999999 payload', payload);
|
|
@@ -1925,13 +2149,38 @@ export class ApiEditStepComponent {
|
|
|
1925
2149
|
clientAuthentication: clientAuth !== '' ? clientAuth : 'basic',
|
|
1926
2150
|
};
|
|
1927
2151
|
}
|
|
2152
|
+
// GraphQL extension: when in GraphQL mode, package the query/variables/operationName into a
|
|
2153
|
+
// single sub-object and ensure Content-Type defaults to application/json (engine sets it too,
|
|
2154
|
+
// but surfacing it on the headers list is cleaner for the user). Method is forced to POST so
|
|
2155
|
+
// legacy REST-flavoured downstream code paths keep working when they peek at it.
|
|
2156
|
+
const isGraphQL = this.activeApiType === 'graphql';
|
|
2157
|
+
let outputApiType;
|
|
2158
|
+
let outputGraphQL;
|
|
2159
|
+
let outputHeaders = this.headers;
|
|
2160
|
+
let outputMethod = method;
|
|
2161
|
+
if (isGraphQL) {
|
|
2162
|
+
outputApiType = 'graphql';
|
|
2163
|
+
const query = (this.graphQLForm?.get('query')?.value ?? '').trim();
|
|
2164
|
+
const operationName = (this.graphQLForm?.get('operationName')?.value ?? '').trim();
|
|
2165
|
+
const variablesResult = this.validateGraphQLVariables(false);
|
|
2166
|
+
outputGraphQL = {
|
|
2167
|
+
query,
|
|
2168
|
+
...(variablesResult.value !== undefined && { variables: variablesResult.value }),
|
|
2169
|
+
...(operationName && { operationName }),
|
|
2170
|
+
};
|
|
2171
|
+
outputMethod = 'POST';
|
|
2172
|
+
const hasContentType = outputHeaders.some(h => (h.name || '').trim().toLowerCase() === 'content-type');
|
|
2173
|
+
if (!hasContentType) {
|
|
2174
|
+
outputHeaders = [{ name: 'Content-Type', type: 'string', value: 'application/json' }, ...outputHeaders];
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
1928
2177
|
return {
|
|
1929
2178
|
step1: {
|
|
1930
2179
|
summary: this.summary?.trim() || undefined,
|
|
1931
2180
|
environment,
|
|
1932
|
-
method,
|
|
2181
|
+
method: outputMethod,
|
|
1933
2182
|
url: this.url ?? '',
|
|
1934
|
-
headers:
|
|
2183
|
+
headers: outputHeaders,
|
|
1935
2184
|
authType,
|
|
1936
2185
|
...(bearerToken !== undefined && { bearerToken }),
|
|
1937
2186
|
...(oauth2 !== undefined && { oauth2 }),
|
|
@@ -1942,6 +2191,8 @@ export class ApiEditStepComponent {
|
|
|
1942
2191
|
keyValueRows,
|
|
1943
2192
|
keyTypeValueRows,
|
|
1944
2193
|
paramsRows,
|
|
2194
|
+
...(outputApiType && { apiType: outputApiType }),
|
|
2195
|
+
...(outputGraphQL && { graphQL: outputGraphQL }),
|
|
1945
2196
|
},
|
|
1946
2197
|
step2: {
|
|
1947
2198
|
variableName: this.variableName ?? '',
|
|
@@ -2161,6 +2412,22 @@ ApiEditStepComponent.OAUTH_CLIENT_AUTH_OPTIONS = [
|
|
|
2161
2412
|
{ id: 'basic', value: 'basic', name: 'Send as Basic Auth header', label: 'Send as Basic Auth header' },
|
|
2162
2413
|
{ id: 'body', value: 'body', name: 'Send in body', label: 'Send in body' },
|
|
2163
2414
|
];
|
|
2415
|
+
/**
|
|
2416
|
+
* The two tab arrangements. REST keeps the legacy four-tab layout. GraphQL drops Body & Params
|
|
2417
|
+
* because the body is a single { query, variables, operationName } object (rendered in the new
|
|
2418
|
+
* GraphQL tab below) and query params have no meaning for a GraphQL POST.
|
|
2419
|
+
*/
|
|
2420
|
+
ApiEditStepComponent.REST_PAYLOAD_TABS = [
|
|
2421
|
+
{ value: 'authorization', label: 'Authorization' },
|
|
2422
|
+
{ value: 'headers', label: 'Headers' },
|
|
2423
|
+
{ value: 'body', label: 'Body' },
|
|
2424
|
+
{ value: 'params', label: 'Params' },
|
|
2425
|
+
];
|
|
2426
|
+
ApiEditStepComponent.GRAPHQL_PAYLOAD_TABS = [
|
|
2427
|
+
{ value: 'authorization', label: 'Authorization' },
|
|
2428
|
+
{ value: 'headers', label: 'Headers' },
|
|
2429
|
+
{ value: 'graphql', label: 'GraphQL' },
|
|
2430
|
+
];
|
|
2164
2431
|
ApiEditStepComponent.DEFAULT_FORMAT_OPTIONS = [
|
|
2165
2432
|
{ id: 'json', value: 'json', name: 'JSON', label: 'JSON' },
|
|
2166
2433
|
{ id: 'xml', value: 'xml', name: 'XML', label: 'XML' },
|
|
@@ -2232,10 +2499,10 @@ ApiEditStepComponent.DEFAULT_STATUS_VERIFICATION_OPTIONS = [
|
|
|
2232
2499
|
{ id: 'greater-than', value: 'greater-than', name: 'Greater than', label: 'Greater than' },
|
|
2233
2500
|
];
|
|
2234
2501
|
ApiEditStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2235
|
-
ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialPayloadType: "initialPayloadType", initialPayloadText: "initialPayloadText", initialSummary: "initialSummary", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", initialResponseBodyVerifications: "initialResponseBodyVerifications", initialStatusVerifications: "initialStatusVerifications", initialActiveResponseVerificationTab: "initialActiveResponseVerificationTab", editMode: "editMode", isCreatingStep: "isCreatingStep", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", urlOptions: "urlOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange", environmentChange: "environmentChange", environmentSearch: "environmentSearch", environmentLoadMore: "environmentLoadMore" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }, { propertyName: "responsePreviewRef", first: true, predicate: ["responsePreviewRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Summary field: label on top, input below (above Environment) -->\n <div class=\"cqa-api-edit-step-summary-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-summary-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Summary</label>\n <cqa-custom-input [(value)]=\"summary\"\n [label]=\"''\" placeholder=\"Enter Request summary\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Summary\">\n </cqa-custom-input>\n </div>\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-start cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full cqa-mt-1\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-note cqa-px-5 cqa-pt-3\">\n <cqa-badge label=\"cURL is supported in Bash format only.\" icon=\"info\" variant=\"info\" size=\"small\" [fullWidth]=\"true\"></cqa-badge>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i6.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i7.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i8.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }], directives: [{ type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i11.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i11.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i11.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
|
|
2502
|
+
ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialPayloadType: "initialPayloadType", initialPayloadText: "initialPayloadText", initialSummary: "initialSummary", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", initialResponseBodyVerifications: "initialResponseBodyVerifications", initialStatusVerifications: "initialStatusVerifications", initialActiveResponseVerificationTab: "initialActiveResponseVerificationTab", editMode: "editMode", isCreatingStep: "isCreatingStep", initialApiType: "initialApiType", initialGraphQL: "initialGraphQL", graphQLSchemaSource: "graphQLSchemaSource", graphQLOperations: "graphQLOperations", isLoadingGraphQLSchema: "isLoadingGraphQLSchema", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", urlOptions: "urlOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange", environmentChange: "environmentChange", environmentSearch: "environmentSearch", environmentLoadMore: "environmentLoadMore", loadSchema: "loadSchema" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }, { propertyName: "responsePreviewRef", first: true, predicate: ["responsePreviewRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- API Type segment: REST API (default) | GraphQL | SOAP/WebSocket/gRPC (disabled) -->\n <div class=\"cqa-api-edit-step-api-type-row cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-api-edit-step-api-type-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">API Type</label>\n <cqa-segment-control\n [value]=\"activeApiType\"\n [segments]=\"apiTypeSegments\"\n (valueChange)=\"onApiTypeChange($event)\"\n class=\"cqa-api-edit-step-api-type-segment\">\n </cqa-segment-control>\n </div>\n\n <!-- Summary field: label on top, input below (above Environment) -->\n <div class=\"cqa-api-edit-step-summary-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-summary-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Summary</label>\n <cqa-custom-input [(value)]=\"summary\"\n [label]=\"''\" placeholder=\"Enter Request summary\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Summary\">\n </cqa-custom-input>\n </div>\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <div *ngIf=\"activeApiType === 'graphql'\" class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div [ngClass]=\"{'cqa-items-start': activeApiType === 'rest', 'cqa-justify-between': activeApiType === 'graphql'}\" class=\"cqa-api-edit-step-request-row cqa-flex cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <!-- REST mode shows the HTTP Method dropdown. GraphQL pins method to POST internally so the dropdown is hidden. -->\n <cqa-dynamic-select *ngIf=\"methodForm && activeApiType === 'rest'\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div *ngIf=\"activeApiType === 'rest'\" class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n\n <!-- Import API cURL: REST-only (the cURL parser produces REST shapes). -->\n <div *ngIf=\"activeApiType === 'rest'\" class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full cqa-mt-1\">\n </cqa-button>\n </div>\n <!--\n Load Schema: GraphQL-only. Uses the elevated cqa-button variant so the\n indigo surface + text + elevation shadow come from the design system \u2014\n customClass keeps only the typography + responsive sizing tweaks.\n Disabled / blocked styling is handled natively by the elevated variant\n (cqa-bg-primary-muted, muted text, no shadow), so we don't add an\n opacity override on top.\n -->\n <cqa-button *ngIf=\"activeApiType === 'graphql'\" type=\"button\" variant=\"elevated\" btnSize=\"lg\" text=\"Load Schema\"\n icon=\"schema\"\n customClass=\"cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [disabled]=\"!url || !url.trim() || isLoadingGraphQLSchema\"\n (clicked)=\"onLoadSchema()\">\n </cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-note cqa-px-5 cqa-pt-3\">\n <cqa-badge label=\"cURL is supported in Bash format only.\" icon=\"info\" variant=\"info\" size=\"small\" [fullWidth]=\"true\"></cqa-badge>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <!-- GraphQL operation picker \u2014 opened by the \"Load Schema\" button in GraphQL mode. -->\n <ng-container *ngIf=\"bodyView === 'graphql-schema'\">\n <cqa-graphql-operation-picker\n [schemaSource]=\"graphQLSchemaSource\"\n [operations]=\"graphQLOperations\"\n [introspected]=\"!!graphQLSchemaSource\"\n [isLoading]=\"isLoadingGraphQLSchema\"\n (back)=\"onGraphQLPickerBack()\"\n (reIntrospect)=\"onGraphQLPickerReIntrospect()\"\n (operationSelected)=\"onGraphQLPickerOperationSelected($event)\">\n </cqa-graphql-operation-picker>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows. REST-only \u2014 GraphQL POST has no query params. -->\n <div *ngIf=\"activePayloadTab === 'params' && activeApiType === 'rest'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next. REST-only \u2014 GraphQL uses the dedicated tab below. -->\n <div *ngIf=\"activePayloadTab === 'body' && activeApiType === 'rest'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Payload content (GraphQL): Query + Variables + Operation Name. Active only in GraphQL mode. -->\n <div *ngIf=\"activePayloadTab === 'graphql' && activeApiType === 'graphql' && graphQLForm\"\n class=\"cqa-api-edit-step-payload-graphql cqa-api-edit-step-graphql-tab cqa-flex cqa-flex-col cqa-gap-4\">\n <!--\n Query / Variables use the design-system `cqa-custom-textarea` so\n styling, label, error rendering, and accessibility come from the\n primitive. We bind via [value] / (valueChange) instead of\n formControlName because cqa-custom-textarea isn't a CVA \u2014 calling\n form.get('\u2026').setValue still fires the existing valueChanges\n subscriptions (which clear inline errors and recompute the\n multi-operation warning).\n -->\n <cqa-custom-textarea\n label=\"Query\"\n [required]=\"true\"\n [value]=\"graphQLForm.get('query')?.value || ''\"\n (valueChange)=\"graphQLForm.get('query')?.setValue($event)\"\n placeholder=\"query GetX($id: ID!) { x(id: $id) { name } }\"\n ariaLabel=\"GraphQL query\"\n [errors]=\"graphQLQueryError ? [graphQLQueryError] : []\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n resize=\"vertical\"\n size=\"md\">\n </cqa-custom-textarea>\n <div class=\"cqa-flex cqa-gap-1.5\">\n <cqa-custom-textarea\n class=\"cqa-flex-1\"\n label=\"Variables (JSON)\"\n [value]=\"graphQLForm.get('variables')?.value || ''\"\n (valueChange)=\"graphQLForm.get('variables')?.setValue($event)\"\n placeholder='{ \"id\": \"abc\" }'\n ariaLabel=\"GraphQL variables\"\n [errors]=\"graphQLVariablesError ? [graphQLVariablesError] : []\"\n [fullWidth]=\"true\"\n [rows]=\"3\"\n resize=\"vertical\"\n size=\"md\">\n </cqa-custom-textarea>\n <!-- Operation Name: optional unless 2+ operations are declared. -->\n <div class=\"cqa-api-edit-step-graphql-field cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-api-edit-step-graphql-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-text-[#374151]\">Operation Name</label>\n <cqa-custom-input\n [value]=\"graphQLForm.get('operationName')?.value || ''\"\n (valueChange)=\"graphQLForm.get('operationName')?.setValue($event)\"\n [label]=\"''\" placeholder=\"e.g. GetBooking\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"GraphQL operation name\">\n </cqa-custom-input>\n <p *ngIf=\"graphQLOperationWarning\" class=\"cqa-text-[#B45309] cqa-text-[12px] cqa-mt-1\">\n {{ graphQLOperationWarning }}\n </p>\n <div class=\"cqa-flex cqa-flex-row cqa-items-center cqa-gap-1.5 cqa-text-[12px] cqa-p-2\" style=\"border-radius: 8px; border: 1px solid #EDE9FE; background: #F5F3FF;\">\n <div>\n <mat-icon style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[14px] cqa-text-[#7C3AED]\" >lightbulb</mat-icon>\n </div>\n <div class=\"cqa-text-[#7C3AED]\">\n Use <span style=\"background-color: white; color:black; border-radius: 4px; padding: 2px;\">var</span> in variables to bind from earlier steps.\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level). Hidden while the GraphQL picker is open so it doesn't compete for focus with the operation list. -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview. Hidden while the GraphQL picker is open \u2014 the user is in \"pick an operation\" mode, not \"view last response\" mode, so showing a stale preview below the picker is just noise. -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\" #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\" class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i6.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i7.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i8.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i9.GraphQLOperationPickerComponent, selector: "cqa-graphql-operation-picker", inputs: ["schemaSource", "operations", "introspected", "isLoading"], outputs: ["back", "operationSelected", "reIntrospect", "change", "preview"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }], directives: [{ type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i12.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i12.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i12.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
|
|
2236
2503
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, decorators: [{
|
|
2237
2504
|
type: Component,
|
|
2238
|
-
args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Summary field: label on top, input below (above Environment) -->\n <div class=\"cqa-api-edit-step-summary-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-summary-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Summary</label>\n <cqa-custom-input [(value)]=\"summary\"\n [label]=\"''\" placeholder=\"Enter Request summary\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Summary\">\n </cqa-custom-input>\n </div>\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-start cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full cqa-mt-1\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-note cqa-px-5 cqa-pt-3\">\n <cqa-badge label=\"cURL is supported in Bash format only.\" icon=\"info\" variant=\"info\" size=\"small\" [fullWidth]=\"true\"></cqa-badge>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
|
|
2505
|
+
args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- API Type segment: REST API (default) | GraphQL | SOAP/WebSocket/gRPC (disabled) -->\n <div class=\"cqa-api-edit-step-api-type-row cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-api-edit-step-api-type-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">API Type</label>\n <cqa-segment-control\n [value]=\"activeApiType\"\n [segments]=\"apiTypeSegments\"\n (valueChange)=\"onApiTypeChange($event)\"\n class=\"cqa-api-edit-step-api-type-segment\">\n </cqa-segment-control>\n </div>\n\n <!-- Summary field: label on top, input below (above Environment) -->\n <div class=\"cqa-api-edit-step-summary-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-summary-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Summary</label>\n <cqa-custom-input [(value)]=\"summary\"\n [label]=\"''\" placeholder=\"Enter Request summary\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Summary\">\n </cqa-custom-input>\n </div>\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <div *ngIf=\"activeApiType === 'graphql'\" class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div [ngClass]=\"{'cqa-items-start': activeApiType === 'rest', 'cqa-justify-between': activeApiType === 'graphql'}\" class=\"cqa-api-edit-step-request-row cqa-flex cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <!-- REST mode shows the HTTP Method dropdown. GraphQL pins method to POST internally so the dropdown is hidden. -->\n <cqa-dynamic-select *ngIf=\"methodForm && activeApiType === 'rest'\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div *ngIf=\"activeApiType === 'rest'\" class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n\n <!-- Import API cURL: REST-only (the cURL parser produces REST shapes). -->\n <div *ngIf=\"activeApiType === 'rest'\" class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full cqa-mt-1\">\n </cqa-button>\n </div>\n <!--\n Load Schema: GraphQL-only. Uses the elevated cqa-button variant so the\n indigo surface + text + elevation shadow come from the design system \u2014\n customClass keeps only the typography + responsive sizing tweaks.\n Disabled / blocked styling is handled natively by the elevated variant\n (cqa-bg-primary-muted, muted text, no shadow), so we don't add an\n opacity override on top.\n -->\n <cqa-button *ngIf=\"activeApiType === 'graphql'\" type=\"button\" variant=\"elevated\" btnSize=\"lg\" text=\"Load Schema\"\n icon=\"schema\"\n customClass=\"cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [disabled]=\"!url || !url.trim() || isLoadingGraphQLSchema\"\n (clicked)=\"onLoadSchema()\">\n </cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full cqa-mt-1\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-note cqa-px-5 cqa-pt-3\">\n <cqa-badge label=\"cURL is supported in Bash format only.\" icon=\"info\" variant=\"info\" size=\"small\" [fullWidth]=\"true\"></cqa-badge>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <!-- GraphQL operation picker \u2014 opened by the \"Load Schema\" button in GraphQL mode. -->\n <ng-container *ngIf=\"bodyView === 'graphql-schema'\">\n <cqa-graphql-operation-picker\n [schemaSource]=\"graphQLSchemaSource\"\n [operations]=\"graphQLOperations\"\n [introspected]=\"!!graphQLSchemaSource\"\n [isLoading]=\"isLoadingGraphQLSchema\"\n (back)=\"onGraphQLPickerBack()\"\n (reIntrospect)=\"onGraphQLPickerReIntrospect()\"\n (operationSelected)=\"onGraphQLPickerOperationSelected($event)\">\n </cqa-graphql-operation-picker>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows. REST-only \u2014 GraphQL POST has no query params. -->\n <div *ngIf=\"activePayloadTab === 'params' && activeApiType === 'rest'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next. REST-only \u2014 GraphQL uses the dedicated tab below. -->\n <div *ngIf=\"activePayloadTab === 'body' && activeApiType === 'rest'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Payload content (GraphQL): Query + Variables + Operation Name. Active only in GraphQL mode. -->\n <div *ngIf=\"activePayloadTab === 'graphql' && activeApiType === 'graphql' && graphQLForm\"\n class=\"cqa-api-edit-step-payload-graphql cqa-api-edit-step-graphql-tab cqa-flex cqa-flex-col cqa-gap-4\">\n <!--\n Query / Variables use the design-system `cqa-custom-textarea` so\n styling, label, error rendering, and accessibility come from the\n primitive. We bind via [value] / (valueChange) instead of\n formControlName because cqa-custom-textarea isn't a CVA \u2014 calling\n form.get('\u2026').setValue still fires the existing valueChanges\n subscriptions (which clear inline errors and recompute the\n multi-operation warning).\n -->\n <cqa-custom-textarea\n label=\"Query\"\n [required]=\"true\"\n [value]=\"graphQLForm.get('query')?.value || ''\"\n (valueChange)=\"graphQLForm.get('query')?.setValue($event)\"\n placeholder=\"query GetX($id: ID!) { x(id: $id) { name } }\"\n ariaLabel=\"GraphQL query\"\n [errors]=\"graphQLQueryError ? [graphQLQueryError] : []\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n resize=\"vertical\"\n size=\"md\">\n </cqa-custom-textarea>\n <div class=\"cqa-flex cqa-gap-1.5\">\n <cqa-custom-textarea\n class=\"cqa-flex-1\"\n label=\"Variables (JSON)\"\n [value]=\"graphQLForm.get('variables')?.value || ''\"\n (valueChange)=\"graphQLForm.get('variables')?.setValue($event)\"\n placeholder='{ \"id\": \"abc\" }'\n ariaLabel=\"GraphQL variables\"\n [errors]=\"graphQLVariablesError ? [graphQLVariablesError] : []\"\n [fullWidth]=\"true\"\n [rows]=\"3\"\n resize=\"vertical\"\n size=\"md\">\n </cqa-custom-textarea>\n <!-- Operation Name: optional unless 2+ operations are declared. -->\n <div class=\"cqa-api-edit-step-graphql-field cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-api-edit-step-graphql-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-text-[#374151]\">Operation Name</label>\n <cqa-custom-input\n [value]=\"graphQLForm.get('operationName')?.value || ''\"\n (valueChange)=\"graphQLForm.get('operationName')?.setValue($event)\"\n [label]=\"''\" placeholder=\"e.g. GetBooking\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"GraphQL operation name\">\n </cqa-custom-input>\n <p *ngIf=\"graphQLOperationWarning\" class=\"cqa-text-[#B45309] cqa-text-[12px] cqa-mt-1\">\n {{ graphQLOperationWarning }}\n </p>\n <div class=\"cqa-flex cqa-flex-row cqa-items-center cqa-gap-1.5 cqa-text-[12px] cqa-p-2\" style=\"border-radius: 8px; border: 1px solid #EDE9FE; background: #F5F3FF;\">\n <div>\n <mat-icon style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[14px] cqa-text-[#7C3AED]\" >lightbulb</mat-icon>\n </div>\n <div class=\"cqa-text-[#7C3AED]\">\n Use <span style=\"background-color: white; color:black; border-radius: 4px; padding: 2px;\">var</span> in variables to bind from earlier steps.\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level). Hidden while the GraphQL picker is open so it doesn't compete for focus with the operation list. -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview. Hidden while the GraphQL picker is open \u2014 the user is in \"pick an operation\" mode, not \"view last response\" mode, so showing a stale preview below the picker is just noise. -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\" #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div *ngIf=\"bodyView !== 'graphql-schema'\" class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
|
|
2239
2506
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { initialMethod: [{
|
|
2240
2507
|
type: Input
|
|
2241
2508
|
}], initialEnvironment: [{
|
|
@@ -2268,6 +2535,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2268
2535
|
type: Input
|
|
2269
2536
|
}], isCreatingStep: [{
|
|
2270
2537
|
type: Input
|
|
2538
|
+
}], initialApiType: [{
|
|
2539
|
+
type: Input
|
|
2540
|
+
}], initialGraphQL: [{
|
|
2541
|
+
type: Input
|
|
2542
|
+
}], graphQLSchemaSource: [{
|
|
2543
|
+
type: Input
|
|
2544
|
+
}], graphQLOperations: [{
|
|
2545
|
+
type: Input
|
|
2546
|
+
}], isLoadingGraphQLSchema: [{
|
|
2547
|
+
type: Input
|
|
2271
2548
|
}], importCurl: [{
|
|
2272
2549
|
type: Output
|
|
2273
2550
|
}], importCurlCancel: [{
|
|
@@ -2300,6 +2577,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2300
2577
|
type: Output
|
|
2301
2578
|
}], environmentLoadMore: [{
|
|
2302
2579
|
type: Output
|
|
2580
|
+
}], loadSchema: [{
|
|
2581
|
+
type: Output
|
|
2303
2582
|
}], authTypeOptions: [{
|
|
2304
2583
|
type: Input
|
|
2305
2584
|
}], initialAuthType: [{
|
|
@@ -2328,4 +2607,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2328
2607
|
}], advancedSettingsVariables: [{
|
|
2329
2608
|
type: Input
|
|
2330
2609
|
}] } });
|
|
2331
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUtoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsVUFBVSxFQUFFLFlBQVk7Q0FDaEIsQ0FBQztBQXFHWCxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUV2RCw4RUFBOEU7QUFDOUUsTUFBTSx3QkFBd0IsR0FBMkIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFZcEcsU0FBUyxhQUFhLENBQUMsRUFBVTtJQUMvQixPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLFFBQVEsSUFBSSxFQUFFLEtBQUssUUFBUSxDQUFDO0FBQzFELENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxFQUFVO0lBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxF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LE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQWdFRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBK0JHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBdURJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFHRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBTUUsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQWdQRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBaUtrQyx5QkFBeUI7c0JBQWhFLFNBQVM7dUJBQUMsMkJBQTJCO2dCQUNMLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBK0N0QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBc0dHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkE4Q0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQWdFRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBOEM4QyxrQkFBa0I7c0JBQXJFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQVd6Qyx5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi4vLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBBUElfRURJVF9TVEVQX0xBQkVMUyA9IHtcbiAgUkVRVUVTVF9ERVRBSUxTOiAnUmVxdWVzdCBEZXRhaWxzJyxcbiAgU1RPUkVfUkVTUE9OU0U6ICdTdG9yZSBSZXNwb25zZScsXG4gIFZBTElEQVRJT046ICdWYWxpZGF0aW9uJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFwaUVkaXRQYXlsb2FkVGFiID0gJ2hlYWRlcnMnIHwgJ2JvZHknIHwgJ3BhcmFtcycgfCAnYXV0aG9yaXphdGlvbic7XG5cbi8qKiBXaGljaCBib2R5IGNvbnRlbnQgYmxvY2sgaXMgdmlzaWJsZTogaGVhZGVycyAodGFicykgb3IgaW1wb3J0IGNVUkwgdGV4dGFyZWEuICovXG5leHBvcnQgdHlwZSBBcGlFZGl0Qm9keVZpZXcgPSAnaGVhZGVycycgfCAnaW1wb3J0LWN1cmwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRIZWFkZXJSb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFBheWxvYWQgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFNlbmQgUmVxdWVzdCAoZW52aXJvbm1lbnQsIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCBib2R5KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFNlbmRSZXF1ZXN0UGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBwYXlsb2FkPzogc3RyaW5nO1xuICBhdXRoVHlwZT86IHN0cmluZztcbiAgYmVhcmVyVG9rZW4/OiBzdHJpbmc7XG4gIG9hdXRoMj86IEFwaUVkaXRPQXV0aDJQYXlsb2FkO1xuICBwYXlsb2FkVHlwZT86ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgcGF5bG9hZEZvcm1hdD86IHN0cmluZztcbiAgcGF5bG9hZFRleHQ/OiBzdHJpbmc7XG4gIGtleVZhbHVlUm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuICBrZXlUeXBlVmFsdWVSb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xufVxuXG4vKiogT0F1dGggMi4wIGF1dGggZmllbGRzICh3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0T0F1dGgyUGF5bG9hZCB7XG4gIGdyYW50VHlwZTogc3RyaW5nO1xuICBhY2Nlc3NUb2tlblVybDogc3RyaW5nO1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgY2xpZW50QXV0aGVudGljYXRpb246IHN0cmluZztcbn1cblxuLyoqIFN0ZXAgMSByZXF1ZXN0ICsgYm9keSBwYXlsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RlcDFQYXlsb2FkIHtcbiAgc3VtbWFyeT86IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W107XG4gIC8qKiBTZWxlY3RlZCBhdXRoIHR5cGU6IGUuZy4gJ25vLWF1dGgnLCAnYmVhcmVyJywgJ29hdXRoMicuICovXG4gIGF1dGhUeXBlOiBzdHJpbmc7XG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgd2hlbiBhdXRoVHlwZSBpcyAnYmVhcmVyJy4gKi9cbiAgYmVhcmVyVG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBPQXV0aCAyLjAgZmllbGRzIHdoZW4gYXV0aFR5cGUgaXMgJ29hdXRoMicuICovXG4gIG9hdXRoMj86IEFwaUVkaXRPQXV0aDJQYXlsb2FkO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYjtcbiAgcGF5bG9hZFR5cGU6ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgcGF5bG9hZEZvcm1hdDogc3RyaW5nO1xuICBwYXlsb2FkVGV4dDogc3RyaW5nO1xuICBrZXlWYWx1ZVJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuICBrZXlUeXBlVmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuICBwYXJhbXNSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbn1cblxuLyoqIFN0ZXAgMiBzdG9yZS1yZXNwb25zZSBwYXlsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RlcDJQYXlsb2FkIHtcbiAgdmFyaWFibGVOYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBSZXNwb25zZSBib2R5IHZlcmlmaWNhdGlvbiByb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRSZXNwb25zZUJvZHlWZXJpZmljYXRpb25Sb3cge1xuICBqc29uUGF0aDogc3RyaW5nO1xuICB2ZXJpZmljYXRpb246IHN0cmluZztcbiAgZGF0YVR5cGU6IHN0cmluZztcbiAgZXhwZWN0ZWRWYWx1ZTogc3RyaW5nO1xufVxuXG4vKiogU3RhdHVzIHZlcmlmaWNhdGlvbiByb3cuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGF0dXNWZXJpZmljYXRpb25Sb3cge1xuICB2ZXJpZmljYXRpb246IHN0cmluZztcbiAgZXhwZWN0ZWRWYWx1ZTogc3RyaW5nO1xufVxuXG4vKiogU3RlcCAzIHZhbGlkYXRpb24gcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAzUGF5bG9hZCB7XG4gIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJztcbiAgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uczogQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvd1tdO1xuICBzdGF0dXNWZXJpZmljYXRpb25zOiBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93W107XG59XG5cbi8qKiBGdWxsIHBheWxvYWQgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZSAoYWxsIHN0ZXBz4oCZIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0Q3JlYXRlUGF5bG9hZCB7XG4gIHN0ZXAxOiBBcGlFZGl0U3RlcDFQYXlsb2FkO1xuICBzdGVwMjogQXBpRWRpdFN0ZXAyUGF5bG9hZDtcbiAgc3RlcDM6IEFwaUVkaXRTdGVwM1BheWxvYWQ7XG4gIC8qKiBBZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZm9yIHRoaXMgQVBJIHN0ZXAgKGUuZy4gaXNTdGVwT3B0aW9uYWwsIHNob3VsZFNraXApLiAqL1xuICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzPzogYW55W107XG59XG5cbi8qKiBFbnZpcm9ubWVudCBvcHRpb246IGVpdGhlciBhIHN0cmluZyAoZGlzcGxheSA9IHZhbHVlKSBvciBhbiBvYmplY3Qgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsLiAqL1xuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRPcHRpb25JbnB1dCA9IHN0cmluZyB8IFNlbGVjdE9wdGlvbjtcblxuY29uc3QgTUVUSE9EU19XSVRIT1VUX0JPRFkgPSBbJ0dFVCcsICdIRUFEJywgJ0RFTEVURSddO1xuXG4vKiogQXV0by1jbG9zZSBwYWlycyBmb3IgcGF5bG9hZCBKU09OIGVkaXRvcjogb3BlbmluZyBjaGFyIC0+IGNsb3NpbmcgY2hhci4gKi9cbmNvbnN0IFBBWUxPQURfQVVUT19DTE9TRV9QQUlSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ3snOiAnfScsICdbJzogJ10nLCAnXCInOiAnXCInLCBcIidcIjogXCInXCIgfTtcblxuLyoqIFJlc3VsdCBvZiBwYXJzaW5nIGEgY1VSTCBjb21tYW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRDdXJsIHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W107XG4gIGJvZHk6IHN0cmluZztcbiAgLyoqIEVudHJpZXMgZnJvbSAtRiAvIC0tZm9ybSBmbGFncyAobXVsdGlwYXJ0L2Zvcm0tZGF0YSkuICovXG4gIGZvcm1EYXRhOiB7IGtleTogc3RyaW5nOyB0eXBlOiAndGV4dCcgfCAnZmlsZSc7IHZhbHVlOiBzdHJpbmcgfVtdO1xufVxuXG5mdW5jdGlvbiBpc1NpbmdsZVF1b3RlKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoID09PSBcIidcIiB8fCBjaCA9PT0gJ1xcdTIwMTgnIHx8IGNoID09PSAnXFx1MjAxOSc7XG59XG5mdW5jdGlvbiBpc0RvdWJsZVF1b3RlKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoID09PSAnXCInIHx8IGNoID09PSAnXFx1MjAxQycgfHwgY2ggPT09ICdcXHUyMDFEJztcbn1cbmZ1bmN0aW9uIGlzQ2xvc2luZ1F1b3RlKGNoOiBzdHJpbmcsIG9wZW5RdW90ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc1NpbmdsZVF1b3RlKG9wZW5RdW90ZSkpIHJldHVybiBpc1NpbmdsZVF1b3RlKGNoKTtcbiAgaWYgKGlzRG91YmxlUXVvdGUob3BlblF1b3RlKSkgcmV0dXJuIGlzRG91YmxlUXVvdGUoY2gpO1xuICByZXR1cm4gY2ggPT09IG9wZW5RdW90ZTtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIGNVUkwgY29tbWFuZCBzdHJpbmcgaW50byBhcmd1bWVudCB0b2tlbnMsIG1hdGNoaW5nIGJhc2ggcXVvdGluZyBydWxlczpcbiAqICAtIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhcmUgRlVMTFkgTElURVJBTCDigJQgYmFja3NsYXNoIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcuXG4gKiAgICBUaGlzIHByZXNlcnZlcyBKU09OIGVzY2FwZSBzZXF1ZW5jZXMgKGUuZy4gXFxcIikgaW5zaWRlICctLWRhdGEtcmF3JyBib2RpZXMuXG4gKiAgLSBEb3VibGUtcXVvdGVkIHN0cmluZ3MgdHJlYXQgYmFja3NsYXNoIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgKFxcXCIg4oaSIFwiKS5cbiAqICAgIFRoaXMgaGFuZGxlcyBXaW5kb3dzLUNNRC1ub3JtYWxpc2VkIHZhbHVlcyBhbmQgcGxhaW4gLWQgXCJ7XFxcImtcXFwiOlxcXCJ2XFxcIn1cIiBib2RpZXMuXG4gKiBBbHNvIGhhbmRsZXMgc3RyYWlnaHQgYW5kIGN1cmx5L3NtYXJ0IHF1b3RlIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplQ3VybExpbmUobGluZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpID0gMDtcbiAgY29uc3QgbiA9IGxpbmUubGVuZ3RoO1xuICB3aGlsZSAoaSA8IG4pIHtcbiAgICB3aGlsZSAoaSA8IG4gJiYgL1xccy8udGVzdChsaW5lW2ldKSkgaSsrO1xuICAgIGlmIChpID49IG4pIGJyZWFrO1xuICAgIGNvbnN0IGNoID0gbGluZVtpXTtcbiAgICBpZiAoaXNTaW5nbGVRdW90ZShjaCkgfHwgaXNEb3VibGVRdW90ZShjaCkpIHtcbiAgICAgIGNvbnN0IHF1b3RlID0gY2g7XG4gICAgICBjb25zdCBzaW5nbGVRdW90ZWQgPSBpc1NpbmdsZVF1b3RlKGNoKTtcbiAgICAgIGkrKztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgd2hpbGUgKGkgPCBuICYmICFpc0Nsb3NpbmdRdW90ZShsaW5lW2ldLCBxdW90ZSkpIHtcbiAgICAgICAgaWYgKCFzaW5nbGVRdW90ZWQgJiYgbGluZVtpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGlmIChpIDwgbikgdmFsdWUgKz0gbGluZVtpKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBuKSBpKys7XG4gICAgICB0b2tlbnMucHVzaCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IHdvcmQgPSAnJztcbiAgICB3aGlsZSAoaSA8IG4gJiYgIS9cXHMvLnRlc3QobGluZVtpXSkgJiYgIWlzU2luZ2xlUXVvdGUobGluZVtpXSkgJiYgIWlzRG91YmxlUXVvdGUobGluZVtpXSkpIHtcbiAgICAgIHdvcmQgKz0gbGluZVtpKytdO1xuICAgIH1cbiAgICBpZiAod29yZCkgdG9rZW5zLnB1c2god29yZCk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFN0cmlwIG9uZSBsYXllciBvZiBzdXJyb3VuZGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodXNlZCBmb3IgaW5saW5lIC0tZGF0YT0gdmFsdWVzKS4gKi9cbmZ1bmN0aW9uIHN0cmlwU3Vycm91bmRpbmdRdW90ZXMoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHMubGVuZ3RoID49IDIgJiYgKChzLnN0YXJ0c1dpdGgoXCInXCIpICYmIHMuZW5kc1dpdGgoXCInXCIpKSB8fCAocy5zdGFydHNXaXRoKCdcIicpICYmIHMuZW5kc1dpdGgoJ1wiJykpKSkge1xuICAgIHJldHVybiBzLnNsaWNlKDEsIC0xKTtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBGbGFncyB0aGF0IHRha2Ugb25lIGFyZ3VtZW50IHdob3NlIHZhbHVlIHNob3VsZCBiZSBjb25zdW1lZCBidXQgRElTQ0FSREVELlxuICogV2l0aG91dCB0aGlzIGxpc3QsIGZsYWdzIGxpa2UgLS1yZWZlcmVyIG9yIC0tcHJveHkgd291bGQgaGF2ZSB0aGVpciBVUkwtbGlrZVxuICogYXJndW1lbnQgbWlzdGFrZW5seSBjYXB0dXJlZCBhcyB0aGUgcmVxdWVzdCBVUkwgYnkgdGhlIHBhdHRlcm4gbWF0Y2hlciBiZWxvdy5cbiAqL1xuY29uc3QgQ1VSTF9GTEFHU19XSVRIX0lHTk9SRURfQVJHID0gbmV3IFNldChbXG4gICctLXJlZmVyZXInLCAnLWUnLCAnLS1yZWZlcicsXG4gICctLXByb3h5JywgJy14JywgJy0tc29ja3M1JywgJy0tc29ja3M0JywgJy0tc29ja3M0YScsICctLXNvY2tzNS1ob3N0bmFtZScsXG4gICctLXVzZXItYWdlbnQnLCAnLUEnLFxuICAnLS1jb29raWUnLCAnLWInLFxuICAnLS1jb29raWUtamFyJywgJy1jJyxcbiAgJy1vJywgJy0tb3V0cHV0JyxcbiAgJy11JywgJy0tdXNlcicsXG4gICctLWNlcnQnLCAnLS1rZXknLCAnLS1jYWNlcnQnLCAnLS1jYXBhdGgnLFxuICAnLS1jb25uZWN0LXRpbWVvdXQnLCAnLS1tYXgtdGltZScsICctbScsXG4gICctLXJldHJ5JywgJy0tcmV0cnktZGVsYXknLCAnLS1yZXRyeS1tYXgtdGltZScsXG4gICctLW1heC1yZWRpcnMnLCAnLS1pbnRlcmZhY2UnLCAnLS1kbnMtc2VydmVycycsXG4gICctLXByb3h5LXVzZXInLCAnLS1wcm94eS1oZWFkZXInLFxuICAnLS1yZXNvbHZlJywgJy0tbGltaXQtcmF0ZScsXG4gICctLXRsc3Bhc3N3b3JkJywgJy0tdGxzYXV0aHR5cGUnLFxuICAnLS11cGxvYWQtZmlsZScsICctVCcsXG4gICctLXJhbmdlJywgJy1yJyxcbiAgJy0tcGFzcycsICctLWVuZ2luZScsXG4gICctLXBpbm5lZHB1YmtleScsICctLWhvc3RwdWJtZDUnLFxuXSk7XG5cbi8qKiBCb29sZWFuIGZsYWdzIHRoYXQgdGFrZSBubyBhcmd1bWVudCDigJQgc2tpcCB3aXRob3V0IGNvbnN1bWluZyB0aGUgbmV4dCB0b2tlbi4gKi9cbmNvbnN0IENVUkxfTk9fQVJHX0ZMQUdTID0gbmV3IFNldChbXG4gICctLWNvbXByZXNzZWQnLCAnLS1sb2NhdGlvbicsICctTCcsICctLWluc2VjdXJlJywgJy1rJyxcbiAgJy0tc2lsZW50JywgJy1zJywgJy0tdmVyYm9zZScsICctdicsICctLWdldCcsICctRycsXG4gICctLWZhaWwnLCAnLWYnLCAnLS1zaG93LWVycm9yJywgJy1TJyxcbiAgJy0taGVhZCcsICctSScsICctLWluY2x1ZGUnLCAnLWknLFxuICAnLS1yZW1vdGUtbmFtZScsICctTycsICctLXJlbW90ZS1uYW1lLWFsbCcsXG4gICctLWlwdjQnLCAnLTQnLCAnLS1pcHY2JywgJy02JyxcbiAgJy0tYW55YXV0aCcsICctLWJhc2ljJywgJy0tZGlnZXN0JywgJy0tbnRsbScsICctLW5lZ290aWF0ZScsXG4gICctLW5vLWtlZXBhbGl2ZScsICctLW5vLXNlc3Npb25pZCcsICctLWdsb2JvZmYnLCAnLWcnLFxuICAnLS1yZW1vdGUtdGltZScsICctUicsICctLXRjcC1ub2RlbGF5JyxcbiAgJy0taHR0cDEuMCcsICctMCcsICctLWh0dHAxLjEnLCAnLS1odHRwMicsICctLWh0dHAyLXByaW9yLWtub3dsZWRnZScsXG4gICctLWh0dHAzJywgJy0tbm8tYnVmZmVyJywgJy1OJyxcbiAgJy0tdHJhY2UtdGltZScsICctLWNlcnQtc3RhdHVzJywgJy0tZmFsc2Utc3RhcnQnLFxuICAnLS1wYXRoLWFzLWlzJywgJy0tbGlzdC1vbmx5JywgJy1sJyxcbiAgJy0tYXBwZW5kJywgJy1hJywgJy0tdXNlLWFzY2lpJywgJy1CJyxcbiAgJy0taGFwcm94eS1wcm90b2NvbCcsICctLW5ldHJjJywgJy1uJywgJy0tbmV0cmMtb3B0aW9uYWwnLFxuXSk7XG5cbi8qKiBQYXJzZSBhIHNpbmdsZSAtRi8tLWZvcm0gdmFsdWUgKGtleT12YWx1ZSB8IGtleT1AZmlsZSB8IGtleT08ZmlsZSkgaW50byBhIGZvcm1EYXRhIGVudHJ5LiAqL1xuZnVuY3Rpb24gcGFyc2VGb3JtRW50cnkocmF3OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB0eXBlOiAndGV4dCcgfCAnZmlsZSc7IHZhbHVlOiBzdHJpbmcgfSB8IG51bGwge1xuICBjb25zdCBlcSA9IHJhdy5pbmRleE9mKCc9Jyk7XG4gIGlmIChlcSA9PT0gLTEpIHJldHVybiBudWxsO1xuICBjb25zdCBrZXkgPSByYXcuc2xpY2UoMCwgZXEpLnRyaW0oKTtcbiAgaWYgKCFrZXkpIHJldHVybiBudWxsO1xuICBjb25zdCByZXN0ID0gcmF3LnNsaWNlKGVxICsgMSk7XG4gIC8vIFN0cmlwIG9wdGlvbmFsIDt0eXBlPS4uLiBzdWZmaXhcbiAgY29uc3Qgc2VtaSA9IHJlc3QuaW5kZXhPZignOycpO1xuICBjb25zdCB2YWwgPSAoc2VtaSAhPT0gLTEgPyByZXN0LnNsaWNlKDAsIHNlbWkpIDogcmVzdCkudHJpbSgpO1xuICBpZiAodmFsLnN0YXJ0c1dpdGgoJ0AnKSB8fCB2YWwuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgcmV0dXJuIHsga2V5LCB0eXBlOiAnZmlsZScsIHZhbHVlOiB2YWwuc2xpY2UoMSkgfTtcbiAgfVxuICByZXR1cm4geyBrZXksIHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbCB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFueSBjVVJMIGNvbW1hbmQgc3RyaW5nIGFuZCByZXR1cm4gbWV0aG9kLCB1cmwsIGhlYWRlcnMsIGJvZHksIGFuZCBmb3JtRGF0YS5cbiAqXG4gKiBTdXBwb3J0ZWQgZm9ybWF0cyAvIGZlYXR1cmVzOlxuICogIOKAoiBVbml4L01hYyAgOiBzaW5nbGUtcXVvdGUgYXJncywgYmFja3NsYXNoIChcXCkgbGluZSBjb250aW51YXRpb25cbiAqICDigKIgUG93ZXJTaGVsbDogYmFja3RpY2sgKGApIGxpbmUgY29udGludWF0aW9uXG4gKiAg4oCiIFdpbmRvd3MgQ01EOiBeXCIgcXVvdGUgZGVsaW1pdGVycywgXlxcXlwiIGlubmVyIGVzY2FwZWQgcXVvdGUsIF4gbGluZSBjb250aW51YXRpb25cbiAqICDigKIgSFRUUCBtZXRob2QgIDogLVggUE9TVCB8IC0tcmVxdWVzdCBQT1NUIHwgLS1yZXF1ZXN0PVBPU1QgfCAtWFBPU1RcbiAqICDigKIgSGVhZGVycyAgICAgIDogLUggLyAtLWhlYWRlciAvIC0taGVhZGVyPSfigKYnIC8gLUg9J+KApicgaW5saW5lLT0gZm9ybVxuICogIOKAoiBCb2R5ICAgICAgICAgOiAtZCAvIC0tZGF0YSAvIC0tZGF0YS1yYXcgLyAtLWRhdGEtYmluYXJ5IC8gLS1kYXRhLWFzY2lpIC9cbiAqICAgICAgICAgICAgICAgICAgIGlubGluZSAtLWRhdGE9J+KApicgLyBtdWx0aXBsZSAtZCBmbGFncyAoY29uY2F0ZW5hdGVkIHdpdGggJikgL1xuICogICAgICAgICAgICAgICAgICAgLS1kYXRhLXVybGVuY29kZSAvIC0tanNvbiAoY1VSTCA3LjgyKylcbiAqICDigKIgRm9ybS1kYXRhICAgIDogLUYgLyAtLWZvcm0gLyAtLWZvcm0tc3RyaW5nIChtdWx0aXBhcnQvZm9ybS1kYXRhKVxuICogIOKAoiBVUkwgICAgICAgICAgOiBiYXJlIGh0dHBzPzovLyB0b2tlbiBvciBleHBsaWNpdCAtLXVybCBmbGFnXG4gKiAg4oCiIEF1dGggaW5mZXIgICA6IEJlYXJlciB0b2tlbiBleHRyYWN0ZWQgZnJvbSBBdXRob3JpemF0aW9uIGhlYWRlclxuICogIOKAoiBNZXRob2QgaW5mZXIgOiBHRVTihpJQT1NUIHdoZW4gYm9keS9mb3JtLWRhdGEgcHJlc2VudCBhbmQgbm8gZXhwbGljaXQgLVhcbiAqL1xuZnVuY3Rpb24gcGFyc2VDdXJsKGN1cmxTdHJpbmc6IHN0cmluZyk6IFBhcnNlZEN1cmwgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gKGN1cmxTdHJpbmcgPz8gJycpLnRyaW0oKTtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuXG4gIGxldCBzID0gcmF3O1xuXG4gIC8vIOKUgOKUgCBXaW5kb3dzIENNRCBmb3JtYXQgKENocm9tZSBEZXZUb29scyBcIkNvcHkgYXMgY1VSTCAoY21kKVwiKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gRGV0ZWN0ZWQgYnkgcHJlc2VuY2Ugb2YgXlwiIChjYXJldCArIGRvdWJsZS1xdW90ZSkgYXMgcXVvdGUgZGVsaW1pdGVyLlxuICAvLyBPbmx5IGFwcGxpZWQgd2hlbiB0aGUgY1VSTCBpcyBOT1QgYWxyZWFkeSB1c2luZyBzaW5nbGUtcXVvdGVzIGFzIHRoZSBwcmltYXJ5XG4gIC8vIHF1b3RpbmcgbWVjaGFuaXNtIChpLmUuIG5vdCBhIFVuaXggY1VSTCB0aGF0IG1lcmVseSBjb250YWlucyBeXCIgaW4gYSBib2R5KS5cbiAgaWYgKC9cXF5cIi8udGVzdChzKSAmJiAhLyg/Ol58XFxzKScvLnRlc3QocykpIHtcbiAgICBzID0gcy5yZXBsYWNlKC9cXHMqXFxeXFxzKlxccj9cXG5cXHMqL2csICcgJyk7ICAvLyBeIGxpbmUtY29udGludWF0aW9uXG4gICAgcyA9IHMucmVwbGFjZSgvXFxeXFxcXFxcXlwiL2csICdcXFxcXCInKTsgICAgICAgICAgIC8vIF5cXF5cIiDihpIgXFxcIiAoaW5uZXIgZXNjYXBlZCBxdW90ZSlcbiAgICBzID0gcy5yZXBsYWNlKC9cXF5cIi9nLCAnXCInKTsgICAgICAgICAgICAgICAgIC8vIF5cIiAg4oaSIFwiICAocXVvdGUgZGVsaW1pdGVyKVxuICB9XG5cbiAgLy8g4pSA4pSAIFBvd2VyU2hlbGwgYmFja3RpY2sgbGluZSBjb250aW51YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHMgPSBzLnJlcGxhY2UoL2BcXHMqXFxyP1xcblxccyovZywgJyAnKTtcblxuICAvLyDilIDilIAgVW5peC9NYWMgYmFja3NsYXNoIGxpbmUgY29udGludWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBzID0gcy5yZXBsYWNlKC9cXFxcXFxzKlxccj9cXG5cXHMqL2csICcgJyk7XG5cbiAgLy8gQ29sbGFwc2UgcmVtYWluaW5nIGxpdGVyYWwgbmV3bGluZXMgYW5kIHJlZHVuZGFudCBzcGFjZXNcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHMucmVwbGFjZSgvXFxyP1xcbi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDdXJsTGluZShub3JtYWxpemVkKTtcblxuICBsZXQgbWV0aG9kID0gJyc7XG4gIGxldCB1cmwgPSAnJztcbiAgY29uc3QgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW107XG4gIGxldCBib2R5ID0gJyc7XG4gIGNvbnN0IGZvcm1EYXRhOiB7IGtleTogc3RyaW5nOyB0eXBlOiAndGV4dCcgfCAnZmlsZSc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gIGNvbnN0IHVybFBhdHRlcm4gPSAvXmh0dHBzPzpcXC9cXC8vaTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHQgPSB0b2tlbnNbaV07XG4gICAgY29uc3QgY29uc3VtZU5leHQgPSAoKTogc3RyaW5nID0+IHRva2Vuc1srK2ldID8/ICcnO1xuXG4gICAgLy8g4pSA4pSAIFNraXAgYm9vbGVhbiBuby1hcmcgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKENVUkxfTk9fQVJHX0ZMQUdTLmhhcyh0KSkgY29udGludWU7XG5cbiAgICAvLyDilIDilIAgQ29uc3VtZS1hbmQtZGlzY2FyZCBmbGFncyAodGhlaXIgYXJnIG11c3Qgbm90IGJlIG1pc3Rha2VuIGZvciB0aGUgVVJMKSDilIDilIBcbiAgICBpZiAoQ1VSTF9GTEFHU19XSVRIX0lHTk9SRURfQVJHLmhhcyh0KSkgeyBjb25zdW1lTmV4dCgpOyBjb250aW51ZTsgfVxuXG4gICAgLy8g4pSA4pSAIEhUVFAgbWV0aG9kIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmICh0ID09PSAnLVgnIHx8IHQgPT09ICctLXJlcXVlc3QnKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTsgaWYgKHYpIG1ldGhvZCA9IHYudG9VcHBlckNhc2UoKTsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tcmVxdWVzdD0nKSkge1xuICAgICAgY29uc3QgdiA9IHQuc2xpY2UoMTApOyBpZiAodikgbWV0aG9kID0gdi50b1VwcGVyQ2FzZSgpOyBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLVgnKSAmJiB0Lmxlbmd0aCA+IDIpIHtcbiAgICAgIG1ldGhvZCA9IHQuc2xpY2UoMikudG9VcHBlckNhc2UoKTsgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIEhlYWRlcnM6IC1IIC8gLS1oZWFkZXIgLyBpbmxpbmUgLS1oZWFkZXI9J+KApicgLyAtSD0n4oCmJyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy1IJyB8fCB0ID09PSAnLS1oZWFkZXInKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGNvbnN0IGNvbG9uID0gdi5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb24gIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB2LnNsaWNlKDAsIGNvbG9uKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHZhbCAgPSB2LnNsaWNlKGNvbG9uICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAobmFtZSkgaGVhZGVycy5wdXNoKHsgbmFtZSwgdHlwZTogJ3N0cmluZycsIHZhbHVlOiB2YWwgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gSW5saW5lIC0taGVhZGVyPSdOYW1lOiBWYWx1ZScg4oCUIHRva2VuaXplciBzcGxpdHMgaW50byBbJy0taGVhZGVyPScsICdOYW1lOiBWYWx1ZSddXG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1oZWFkZXI9JykgfHwgdC5zdGFydHNXaXRoKCctSD0nKSkge1xuICAgICAgY29uc3QgcHJlZml4TGVuID0gdC5zdGFydHNXaXRoKCctLWhlYWRlcj0nKSA/IDkgOiAzO1xuICAgICAgY29uc3QgaW5saW5lID0gdC5zbGljZShwcmVmaXhMZW4pIHx8IGNvbnN1bWVOZXh0KCk7XG4gICAgICBjb25zdCBjb2xvbiAgPSBpbmxpbmUuaW5kZXhPZignOicpO1xuICAgICAgaWYgKGNvbG9uICE9PSAtMSkge1xuICAgICAgICBjb25zdCBuYW1lID0gaW5saW5lLnNsaWNlKDAsIGNvbG9uKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHZhbCAgPSBpbmxpbmUuc2xpY2UoY29sb24gKyAxKS50cmltKCk7XG4gICAgICAgIGlmIChuYW1lKSBoZWFkZXJzLnB1c2goeyBuYW1lLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6IHZhbCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBSZXF1ZXN0IGJvZHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gY1VSTCBjb25jYXRlbmF0ZXMgbXVsdGlwbGUgLWQgZmxhZ3Mgd2l0aCAnJic7IHJlcGxpY2F0ZSB0aGF0IGJlaGF2aW91ci5cbiAgICBpZiAodCA9PT0gJy1kJyB8fCB0ID09PSAnLS1kYXRhJyB8fCB0ID09PSAnLS1kYXRhLXJhdycgfHxcbiAgICAgICAgdCA9PT0gJy0tZGF0YS1iaW5hcnknIHx8IHQgPT09ICctLWRhdGEtYXNjaWknKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2ICYmICF2LnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModik7XG4gICAgICAgIGJvZHkgPSBib2R5ID8gYCR7Ym9keX0mJHtjaHVua31gIDogY2h1bms7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gLS1qc29uIGZsYWcgKGNVUkwgNy44MispOiBzZXRzIENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uICsgYm9keVxuICAgIGlmICh0ID09PSAnLS1qc29uJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodiAmJiAhdi5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHYpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIElubGluZSAtLWRhdGE9J+KApicgLyAtLWRhdGEtcmF3PSfigKYnIOKAlCB0b2tlbml6ZXIgc3BsaXRzIGludG8gWyctLWRhdGE9JywgdmFsdWVdXG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1kYXRhPScpIHx8IHQuc3RhcnRzV2l0aCgnLS1kYXRhLXJhdz0nKSB8fFxuICAgICAgICB0LnN0YXJ0c1dpdGgoJy0tZGF0YS1iaW5hcnk9JykgfHwgdC5zdGFydHNXaXRoKCctLWRhdGEtYXNjaWk9JykpIHtcbiAgICAgIGNvbnN0IGVxSWR4ID0gdC5pbmRleE9mKCc9Jyk7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0LnNsaWNlKGVxSWR4ICsgMSkgfHwgY29uc3VtZU5leHQoKTtcbiAgICAgIGlmIChpbmxpbmUgJiYgIVN0cmluZyhpbmxpbmUpLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXMoU3RyaW5nKGlubGluZSkpO1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7Y2h1bmt9YCA6IGNodW5rO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIElubGluZSBzaG9ydCBmb3JtIC1kVkFMVUUgb3IgLWQ9VkFMVUVcbiAgICBpZiAodC5zdGFydHNXaXRoKCctZCcpICYmIHQubGVuZ3RoID4gMikge1xuICAgICAgY29uc3QgdiA9IHQuc3RhcnRzV2l0aCgnLWQ9JykgPyB0LnNsaWNlKDMpIDogdC5zbGljZSgyKTtcbiAgICAgIGlmICghdi5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHYpO1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7Y2h1bmt9YCA6IGNodW5rO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIC0tZGF0YS11cmxlbmNvZGUgbmFtZT12YWx1ZSAodHJlYXQgYXMgcGxhaW4gYm9keSBlbnRyeSlcbiAgICBpZiAodCA9PT0gJy0tZGF0YS11cmxlbmNvZGUnKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2ICYmICF2LmluY2x1ZGVzKCdAJykpIGJvZHkgPSBib2R5ID8gYCR7Ym9keX0mJHt2fWAgOiB2O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZGF0YS11cmxlbmNvZGU9JykpIHtcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UoMTcpIHx8IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAoaW5saW5lICYmICFTdHJpbmcoaW5saW5lKS5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIGJvZHkgPSBib2R5ID8gYCR7Ym9keX0mJHtpbmxpbmV9YCA6IFN0cmluZyhpbmxpbmUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIE11bHRpcGFydCBmb3JtLWRhdGE6IC1GIC8gLS1mb3JtIC8gLS1mb3JtLXN0cmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy1GJyB8fCB0ID09PSAnLS1mb3JtJyB8fCB0ID09PSAnLS1mb3JtLXN0cmluZycpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHYpIHsgY29uc3QgZSA9IHBhcnNlRm9ybUVudHJ5KHYpOyBpZiAoZSkgZm9ybURhdGEucHVzaChlKTsgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZm9ybT0nKSB8fCB0LnN0YXJ0c1dpdGgoJy1GPScpKSB7XG4gICAgICBjb25zdCBwcmVmaXhMZW4gPSB0LnN0YXJ0c1dpdGgoJy0tZm9ybT0nKSA/IDcgOiAzO1xuICAgICAgY29uc3QgaW5saW5lID0gdC5zbGljZShwcmVmaXhMZW4pIHx8IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAoaW5saW5lKSB7IGNvbnN0IGUgPSBwYXJzZUZvcm1FbnRyeShTdHJpbmcoaW5saW5lKSk7IGlmIChlKSBmb3JtRGF0YS5wdXNoKGUpOyB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVVJMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmICh0ID09PSAnLS11cmwnKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTsgaWYgKHYgJiYgIXVybCkgdXJsID0gdjsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tdXJsPScpKSB7XG4gICAgICBjb25zdCB2ID0gdC5zbGljZSg2KSB8fCBjb25zdW1lTmV4dCgpOyBpZiAodiAmJiAhdXJsKSB1cmwgPSB2OyBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVybFBhdHRlcm4udGVzdCh0KSAmJiAhdXJsKSB7IHVybCA9IHQ7IH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBzY2FuIGFsbCB0b2tlbnMgZm9yIHRoZSBmaXJzdCBVUkwtbGlrZSB2YWx1ZVxuICBpZiAoIXVybCkge1xuICAgIHVybCA9IHRva2Vucy5maW5kKHRvayA9PiB1cmxQYXR0ZXJuLnRlc3QodG9rKSkgPz8gJyc7XG4gIH1cblxuICAvLyBJbmZlciBtZXRob2Q6IGlmIGEgYm9keS9mb3JtLWRhdGEgaXMgcHJlc2VudCBidXQgbm8gZXhwbGljaXQgLVggd2FzIGdpdmVuLFxuICAvLyB1c2UgUE9TVCAobWFueSBicm93c2VyIERldlRvb2xzIGNVUkxzIG9taXQgLVggUE9TVCkuXG4gIGNvbnN0IGZpbmFsTWV0aG9kID0gKG1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgaWYgKChib2R5IHx8IGZvcm1EYXRhLmxlbmd0aCA+IDApICYmIChmaW5hbE1ldGhvZCA9PT0gJ0dFVCcgfHwgZmluYWxNZXRob2QgPT09ICdIRUFEJykpIHtcbiAgICByZXR1cm4geyBtZXRob2Q6ICdQT1NUJywgdXJsLCBoZWFkZXJzLCBib2R5LCBmb3JtRGF0YSB9O1xuICB9XG4gIHJldHVybiB7IG1ldGhvZDogZmluYWxNZXRob2QsIHVybCwgaGVhZGVycywgYm9keSwgZm9ybURhdGEgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1lZGl0LXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBBcGlFZGl0U3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBpbml0aWFsTWV0aG9kPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsRW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBpbml0aWFsVXJsPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFRhYj86IEFwaUVkaXRQYXlsb2FkVGFiO1xuICAvKiogSW5pdGlhbCBwYXlsb2FkIHR5cGUgKHJhdywgeC13d3ctZm9ybS11cmxlbmNvZGVkLCBmb3JtLWRhdGEpIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFR5cGU/OiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIC8qKiBJbml0aWFsIHBheWxvYWQgdGV4dCAoYm9keSkgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxQYXlsb2FkVGV4dD86IHN0cmluZztcbiAgLyoqIEluaXRpYWwgc3VtbWFyeSB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcCAobWFwcyB0byBzdGVwIGRlc2NyaXB0aW9uKS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFN1bW1hcnk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxIZWFkZXJzPzogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBASW5wdXQoKSBpbml0aWFsUmVzcG9uc2VQcmV2aWV3Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsVmFyaWFibGVOYW1lPzogc3RyaW5nO1xuICAvKiogSW5pdGlhbCByZXNwb25zZSBib2R5IHZlcmlmaWNhdGlvbnMgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zPzogQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvd1tdO1xuICAvKiogSW5pdGlhbCBzdGF0dXMgdmVyaWZpY2F0aW9ucyB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnM/OiBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93W107XG4gIC8qKiBJbml0aWFsIGFjdGl2ZSByZXNwb25zZSB2ZXJpZmljYXRpb24gdGFiIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI/OiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJztcbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZS9VcGRhdGUgYnV0dG9uICovXG4gIEBJbnB1dCgpIGlzQ3JlYXRpbmdTdGVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIHRoZSBjVVJMIHN0cmluZyB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydCAodmFsdWUgZnJvbSB0aGUgdGV4dGFyZWEgY29udHJvbCkuICovXG4gIEBPdXRwdXQoKSBpbXBvcnRDdXJsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2FuY2VscyB0aGUgSW1wb3J0IGNVUkwgcGFuZWwgKGNsaWNrcyBDYW5jZWwpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0LCB3aXRoIGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgYW5kIGhlYWRlcnMuICovXG4gIEBPdXRwdXQoKSBzZW5kUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdFNlbmRSZXF1ZXN0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uIChzdGVwIDEpLiAqL1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIHdpdGggYWxsIGVudGVyZWQgZGV0YWlsczogc3RlcDEgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5KSwgc3RlcDIgKHZhcmlhYmxlIG5hbWUpLCBzdGVwMyAodmVyaWZpY2F0aW9ucykuICovXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRDcmVhdGVQYXlsb2FkPigpO1xuICAvKiogRW1pdHMgd2hlbmV2ZXIgaGVhZGVycyBjaGFuZ2UgKGFkZCwgcmVtb3ZlLCBvciBlZGl0KSBzbyB0aGUgcGFyZW50IGNhbiByZWZsZWN0IHRoZW0gaW4gdGhlIGNhbnZhcy9jb250cm9scy4gKi9cbiAgQE91dHB1dCgpIGhlYWRlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRIZWFkZXJSb3dbXT4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGVudmlyb25tZW50IGRyb3Bkb3duIHNlbGVjdGlvbiBjaGFuZ2VzIChzZWxlY3RlZCB2YWx1ZS9pZCBvciBudWxsIGZvciBOb25lKSBzbyB0aGUgcGFyZW50IGNhbiBwcm92aWRlIHVybE9wdGlvbnMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKiogRm9ybSBjb250cm9sIGZvciBJbXBvcnQgY1VSTCB0ZXh0YXJlYTsgdmFsdWUgaXMgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydC4gKi9cbiAgcmVhZG9ubHkgaW1wb3J0Q3VybENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gIHZhcmlhYmxlTmFtZSA9ICcnO1xuICB2YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB1cmxFcnJvciA9ICcnO1xuICAvKiogU3RlcCBzdW1tYXJ5IChkaXNwbGF5ZWQgaW4gQVBJIHN0ZXAgdGl0bGU7IG1hcHMgdG8gc3RlcCBkZXNjcmlwdGlvbikuICovXG4gIHN1bW1hcnkgPSAnJztcblxuICAvKiogQ29udHJvbHMgd2hpY2ggYm9keSBjb250ZW50IGlzIHZpc2libGU6IGhlYWRlcnMgKGRlZmF1bHQpIG9yIGltcG9ydC1jdXJsLiAqL1xuICBib2R5VmlldzogQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuXG4gIHJlYWRvbmx5IHN0ZXBMYWJlbHMgPSBbXG4gICAgeyBpbmRleDogMSwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlJFUVVFU1RfREVUQUlMUyB9LFxuICAgIHsgaW5kZXg6IDIsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5TVE9SRV9SRVNQT05TRSB9LFxuICAgIHsgaW5kZXg6IDMsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5WQUxJREFUSU9OIH0sXG4gIF07XG4gIGN1cnJlbnRTdGVwID0gMTtcblxuICAvKiogVGhlIGxhYmVsIGZvciB0aGUgY3VycmVudCBzdGVwIG9ubHkgKHVzZWQgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIGluZGljYXRvcikuICovXG4gIGdldCBhY3RpdmVTdGVwTGFiZWwoKTogeyBpbmRleDogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0ZXBMYWJlbHNbdGhpcy5jdXJyZW50U3RlcCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtaW5TdGVwID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTdGVwID0gMztcblxuICAvKiogUGVyY2VudGFnZSB0byB0cmFuc2xhdGUgdGhlIHN0ZXAgc3RyaXAgKDAsIC0zMy4zMzMsIC02Ni42NjYpIGZvciBDU1MgdHJhbnNpdGlvbi4gKi9cbiAgZ2V0IHN0cmlwVHJhbnNsYXRlUGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50U3RlcCAtIDEpICogLTMzLjMzMztcbiAgfVxuXG4gIHNldFN0ZXAoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPj0gdGhpcy5taW5TdGVwICYmIHN0ZXAgPD0gdGhpcy5tYXhTdGVwKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBjdXJyZW50IHN0ZXAgYmVmb3JlIGFsbG93aW5nIGZvcndhcmQgbmF2aWdhdGlvblxuICAgICAgaWYgKHN0ZXAgPiB0aGlzLmN1cnJlbnRTdGVwKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIFVSTCBiZWZvcmUgYWxsb3dpbmcgbmF2aWdhdGlvbiBhd2F5IGZyb20gc3RlcCAxXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAxKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZSBuYW1lIGJlZm9yZSBhbGxvd2luZyBuYXZpZ2F0aW9uIGF3YXkgZnJvbSBzdGVwIDJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPT09IDIgJiYgIXRoaXMudmFyaWFibGVOYW1lPy50cmltKCkpIHtcbiAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJ1ZhcmlhYmxlIE5hbWUgaXMgcmVxdWlyZWQuJztcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHN0ZXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUluaXRpYWxTdGVwKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCh0aGlzLm1pblN0ZXAsIE1hdGgubWluKHRoaXMubWF4U3RlcCwgTWF0aC5mbG9vcih2YWx1ZSkpKTtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gY2xhbXBlZDtcbiAgfVxuXG4gIC8qKiBIVFRQIG1ldGhvZCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBodHRwTWV0aG9kT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIEZvcm0gZm9yIEhUVFAgbWV0aG9kIHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBtZXRob2RGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDb25maWcgZm9yIG1ldGhvZCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGh0dHBNZXRob2RPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgbWV0aG9kU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbWV0aG9kJyxcbiAgICBwbGFjZWhvbGRlcjogJ01ldGhvZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmh0dHBNZXRob2RPcHRpb25zID8/IFtdKS5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG0pKTtcbiAgICB0aGlzLm1ldGhvZFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubWV0aG9kU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRob2RWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG0pKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IChjcWEtZHluYW1pYy1zZWxlY3QpICovXG4gIGVudmlyb25tZW50Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRW52aXJvbm1lbnQgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsIChwcm92aWRlZCBieSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVVJMIGZpZWxkIG9wdGlvbnMgd2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCAoYmFzZSBVUkwgKyBwYXJhbWV0ZXJzIGFzICp8a2V5fCkuIFBhcmVudCBmaWxscyB0aGlzIHdoZW4gZW52aXJvbm1lbnRDaGFuZ2UgZmlyZXMuICovXG4gIEBJbnB1dCgpIHVybE9wdGlvbnM6IENxYUF1dG9jb21wbGV0ZU9wdGlvbltdID0gW107XG5cbiAgLyoqIENvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBlbnZpcm9ubWVudE9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBlbnZpcm9ubWVudFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Vudmlyb25tZW50JyxcbiAgICBwbGFjZWhvbGRlcjogJ0Vudmlyb25tZW50JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyB0b1NlbGVjdE9wdGlvbihpdGVtOiBFbnZpcm9ubWVudE9wdGlvbklucHV0KTogU2VsZWN0T3B0aW9uIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBpZDogaXRlbSwgdmFsdWU6IGl0ZW0sIG5hbWU6IGl0ZW0sIGxhYmVsOiBpdGVtIH07XG4gICAgfVxuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG8uaWQgPz8gby52YWx1ZSxcbiAgICAgIHZhbHVlOiBvLnZhbHVlID8/IG8uaWQsXG4gICAgICBuYW1lOiBvLm5hbWUgPz8gby5sYWJlbCA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICAgIGxhYmVsOiBvLmxhYmVsID8/IG8ubmFtZSA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3B0aW9uVmFsdWUoaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgcmV0dXJuIGl0ZW07XG4gICAgY29uc3QgbyA9IGl0ZW0gYXMgU2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHYgPSBvLnZhbHVlID8/IG8uaWQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IFN0cmluZyh2KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkubWFwKChlKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihlKSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZUVudmlyb25tZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbnZpcm9ubWVudHMsXG4gICAgICBvbkxvYWRNb3JlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRMb2FkTW9yZS5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2guZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEVudmlyb25tZW50VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zID8/IFtdKVxuICAgICAgLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZSkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBlbnZpcm9ubWVudHMgZnJvbSB0aGUgZHJvcGRvd24uICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudExvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBGb3JtIGZvciBBdXRoIFR5cGUgc2VsZWN0IChBdXRob3JpemF0aW9uIHRhYikgKi9cbiAgYXV0aFR5cGVGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBBdXRoIHR5cGUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGF1dGhUeXBlT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIEluaXRpYWwgYXV0aCB0eXBlIChzdHJpbmcgb3Igb3B0aW9uIG9iamVjdCkuIFdoZW4gbm90IHNldCwgZmlyc3Qgb2YgYXV0aFR5cGVPcHRpb25zIG9yIGRlZmF1bHQgXCJObyBBdXRoXCIgaXMgdXNlZC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbEF1dGhUeXBlPzogc3RyaW5nIHwgRW52aXJvbm1lbnRPcHRpb25JbnB1dDtcblxuICAvKiogRGVmYXVsdCBvcHRpb25zIHdoZW4gYXV0aFR5cGVPcHRpb25zIGlzIGVtcHR5IChzYW1lIHNoYXBlIGFzIGVudmlyb25tZW50KSAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0FVVEhfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnbm8tYXV0aCcsIHZhbHVlOiAnbm8tYXV0aCcsIG5hbWU6ICdObyBBdXRoJywgbGFiZWw6ICdObyBBdXRoJyB9LFxuICAgIHsgaWQ6ICdiZWFyZXInLCB2YWx1ZTogJ2JlYXJlcicsIG5hbWU6ICdCZWFyZXIgVG9rZW4nLCBsYWJlbDogJ0JlYXJlciBUb2tlbicgfSxcbiAgICB7IGlkOiAnb2F1dGgyJywgdmFsdWU6ICdvYXV0aDInLCBuYW1lOiAnT0F1dGggMi4wJywgbGFiZWw6ICdPQXV0aCAyLjAnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgQXV0aCBUeXBlIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gYXV0aFR5cGVPcHRpb25zIGNoYW5nZXMsIGxpa2UgZW52aXJvbm1lbnQpICovXG4gIGF1dGhUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnYXV0aFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnTm8gQXV0aCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnMubWFwKChhKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihhKSlcbiAgICAgICAgOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OU107XG4gICAgdGhpcy5hdXRoVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEF1dGhUeXBlVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5hdXRoVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmF1dGhUeXBlT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0FVVEhfVFlQRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoYSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgYXV0aCB0eXBlIHZhbHVlIChlLmcuICduby1hdXRoJykgZm9yIHRlbXBsYXRlICovXG4gIGdldCBzZWxlY3RlZEF1dGhUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IHRoaXMuYXV0aFR5cGVGb3JtPy5nZXQoJ2F1dGhUeXBlJyk/LnZhbHVlO1xuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiAnbm8tYXV0aCc7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/ICh2Py52YWx1ZSA/PyB2Py5pZCA/PyAnbm8tYXV0aCcpIDogU3RyaW5nKHYpO1xuICB9XG5cbiAgLyoqIEJlYXJlciB0b2tlbiB2YWx1ZSAoQXV0aG9yaXphdGlvbiB0YWIsIHdoZW4gYXV0aCB0eXBlIGlzIEJlYXJlciBUb2tlbikuICovXG4gIGJlYXJlclRva2VuID0gJyc7XG5cbiAgLyoqIEZvcm0gZm9yIE9BdXRoIDIuMCBmaWVsZHMgKEF1dGhvcml6YXRpb24gdGFiIHdoZW4gYXV0aCB0eXBlIGlzIE9BdXRoIDIuMCkuICovXG4gIG9hdXRoMkZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEdyYW50IHR5cGUgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0dSQU5UX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2NsaWVudF9jcmVkZW50aWFscycsIHZhbHVlOiAnY2xpZW50X2NyZWRlbnRpYWxzJywgbmFtZTogJ0NsaWVudCBDcmVkZW50aWFscycsIGxhYmVsOiAnQ2xpZW50IENyZWRlbnRpYWxzJyB9LFxuICAgIHsgaWQ6ICdhdXRob3JpemF0aW9uX2NvZGUnLCB2YWx1ZTogJ2F1dGhvcml6YXRpb25fY29kZScsIG5hbWU6ICdBdXRob3JpemF0aW9uIENvZGUnLCBsYWJlbDogJ0F1dGhvcml6YXRpb24gQ29kZScgfSxcbiAgICB7IGlkOiAncGFzc3dvcmQnLCB2YWx1ZTogJ3Bhc3N3b3JkJywgbmFtZTogJ1Bhc3N3b3JkJywgbGFiZWw6ICdQYXNzd29yZCcgfSxcbiAgICB7IGlkOiAnaW1wbGljaXQnLCB2YWx1ZTogJ2ltcGxpY2l0JywgbmFtZTogJ0ltcGxpY2l0JywgbGFiZWw6ICdJbXBsaWNpdCcgfSxcbiAgXTtcblxuICAvKiogQ2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBvcHRpb25zIGZvciBPQXV0aCAyLjAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2Jhc2ljJywgdmFsdWU6ICdiYXNpYycsIG5hbWU6ICdTZW5kIGFzIEJhc2ljIEF1dGggaGVhZGVyJywgbGFiZWw6ICdTZW5kIGFzIEJhc2ljIEF1dGggaGVhZGVyJyB9LFxuICAgIHsgaWQ6ICdib2R5JywgdmFsdWU6ICdib2R5JywgbmFtZTogJ1NlbmQgaW4gYm9keScsIGxhYmVsOiAnU2VuZCBpbiBib2R5JyB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IG9hdXRoMkdyYW50VHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2dyYW50VHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgZ3JhbnQgdHlwZScsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50Lk9BVVRIX0dSQU5UX1RZUEVfT1BUSU9OU10sXG4gIH07XG5cbiAgcmVhZG9ubHkgb2F1dGgyQ2xpZW50QXV0aFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2NsaWVudEF1dGhlbnRpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBtZXRob2QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9DTElFTlRfQVVUSF9PUFRJT05TXSxcbiAgfTtcblxuICAvKiogQ3VycmVudCBIVFRQIG1ldGhvZCAoZnJvbSBmb3JtIG9yIGRlZmF1bHQ6IGZpcnN0IG9mIGh0dHBNZXRob2RPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkTWV0aG9kKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1ldGhvZEZvcm0/LmdldCgnbWV0aG9kJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycgPyAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHZhbHVlIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHZhbHVlKSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVkID8/IGZpcnN0VmFsdWUgPz8gJ0dFVCc7XG4gIH1cbiAgc2V0IHNlbGVjdGVkTWV0aG9kKHY6IHN0cmluZykge1xuICAgIHRoaXMubWV0aG9kRm9ybT8ucGF0Y2hWYWx1ZSh7IG1ldGhvZDogdiB9KTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNlbGVjdGVkIEhUVFAgbWV0aG9kIGlzIEdFVCwgSEVBRCwgb3IgREVMRVRFIChubyByZXF1ZXN0IGJvZHkpLiAqL1xuICBnZXQgaXNNZXRob2RXaXRob3V0Qm9keSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgIHJldHVybiBNRVRIT0RTX1dJVEhPVVRfQk9EWS5pbmNsdWRlcyhtZXRob2QpO1xuICB9XG5cbiAgLyoqIENhY2hlZCBlbnZpcm9ubWVudCB2YWx1ZSBmcm9tIGxhc3Qgc2VsZWN0aW9uIChzbyBDcmVhdGUgcGF5bG9hZCBoYXMgdGhlIHNlbGVjdGVkIHZhbHVlKS4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDYWNoZWQgSFRUUCBtZXRob2QgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudE1ldGhvZFZhbHVlID0gJyc7XG5cbiAgLyoqIEN1cnJlbnQgZW52aXJvbm1lbnQgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBlbnZpcm9ubWVudE9wdGlvbnMpLiBUcmVhdHMgZW1wdHkgc3RyaW5nIGFzIHVuc2V0LiAqL1xuICBnZXQgc2VsZWN0ZWRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5lbnZpcm9ubWVudEZvcm0/LmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWU7XG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gIH1cbiAgc2V0IHNlbGVjdGVkRW52aXJvbm1lbnQodjogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm0/LnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogdiB9KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgYW4gZW52aXJvbm1lbnQ7IGtlZXBzIGN1cnJlbnRFbnZpcm9ubWVudFZhbHVlIGluIHN5bmMsIHNldHMgcmVxdWVzdCBVUkwgZnJvbSBlbnZpcm9ubWVudCB3aGVuIGF2YWlsYWJsZSwgYW5kIG5vdGlmaWVzIHBhcmVudCBmb3IgdXJsT3B0aW9ucy4gKi9cbiAgb25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSBldmVudC52YWx1ZTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcblxuICAgIC8vIENsZWFyIFVSTCBmaWVsZCB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICB0aGlzLnVybCA9ICcnO1xuICAgIHRoaXMudXJsRXJyb3IgPSAnJzsgLy8gQWxzbyBjbGVhciBhbnkgVVJMIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBOb3RpZnkgcGFyZW50IHNvIGl0IGNhbiBwcm92aWRlIHVybE9wdGlvbnMgKGVudmlyb25tZW50IHBhcmFtZXRlcnMgZm9yIFwiRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXJcIilcbiAgICBjb25zdCBlbWl0VmFsID0gdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9PT0gJycgfHwgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9PT0gJ25vbmUnXG4gICAgICA/IG51bGxcbiAgICAgIDogKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA6IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRDaGFuZ2UuZW1pdChlbWl0VmFsID09PSAnbm9uZScgPyBudWxsIDogKGVtaXRWYWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkpO1xuICB9XG5cbiAgLyoqIFdoZW4gdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBVUkwgYXV0b2NvbXBsZXRlIChlLmcuIGVudmlyb25tZW50IHBhcmFtZXRlciAqfGtleXwpLCBzZXQgdGhlIFVSTCBmaWVsZCB0byB0aGF0IHZhbHVlLiAqL1xuICBvblVybE9wdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMudXJsID0gb3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIHRoaXMudXJsRXJyb3IgPSAnJzsgLy8gQ2xlYXIgZXJyb3Igd2hlbiBvcHRpb24gaXMgc2VsZWN0ZWRcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSByZXF1ZXN0IFVSTCBmb3IgdGhlIHNlbGVjdGVkIGVudmlyb25tZW50IG9wdGlvbi5cbiAgICogRW52aXJvbm1lbnQgb3B0aW9ucyBtYXkgY2FycnkgYW4gb3B0aW9uYWwgYHVybGAgKGUuZy4gZnJvbSBFbnZpcm9ubWVudCBtb2RlbCk7IFwiTm9uZVwiIGhhcyBubyB1cmwuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkRW52aXJvbm1lbnRVcmwoc2VsZWN0ZWRWYWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChzZWxlY3RlZFZhbHVlID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9iaiA9IHNlbGVjdGVkVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgdXJsUHJvcCA9IG9ialsndXJsJ107XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiB1cmxQcm9wID09PSAnc3RyaW5nJyAmJiB1cmxQcm9wLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIHJldHVybiB1cmxQcm9wLnRyaW0oKTtcbiAgICB9XG4gICAgY29uc3QgaWRPclZhbHVlID1cbiAgICAgIHR5cGVvZiBzZWxlY3RlZFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShzZWxlY3RlZFZhbHVlIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICA6IFN0cmluZyhzZWxlY3RlZFZhbHVlKTtcbiAgICBpZiAoIWlkT3JWYWx1ZSB8fCBpZE9yVmFsdWUgPT09ICdub25lJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3B0aW9uID0gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zID8/IFtdKS5maW5kKFxuICAgICAgKG9wdCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUob3B0KSA9PT0gaWRPclZhbHVlXG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBvcHRpb24gIT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyA/IChvcHRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pWyd1cmwnXSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnRyaW0oKSAhPT0gJycgPyB1cmwudHJpbSgpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgYW4gSFRUUCBtZXRob2Q7IGtlZXBzIGN1cnJlbnRNZXRob2RWYWx1ZSBpbiBzeW5jIGZvciBjcmVhdGUgcGF5bG9hZC4gKi9cbiAgb25NZXRob2RTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPVxuICAgICAgdiAhPSBudWxsXG4gICAgICAgID8gdHlwZW9mIHYgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsID0gJyc7XG5cbiAgLyoqIFVSTCBmb3IgdGhlIHJlcXVlc3QuIEdldHRlci9zZXR0ZXIgc3luY3MgcXVlcnkgcGFyYW1zIHdpdGggdGhlIFBhcmFtcyB0YWIgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuICBzZXQgdXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gJyc7XG4gICAgaWYgKHRoaXMuX3VybCA9PT0gbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMuX3VybCA9IG5leHQ7XG4gICAgLy8gQ2xlYXIgZXJyb3Igd2hlbiBVUkwgY2hhbmdlc1xuICAgIHRoaXMudXJsRXJyb3IgPSAnJztcbiAgICBpZiAodGhpcy5wYXJhbXNGb3JtQXJyYXkpIHtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSB0cnVlO1xuICAgICAgdGhpcy5zeW5jUGFyYW1zRnJvbVVybCgpO1xuICAgICAgdGhpcy5wYXJhbXNTeW5jaW5nRnJvbVVybCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGVuIHRydWUsIHBhcmFtcyBmb3JtIGNoYW5nZXMgc2hvdWxkIG5vdCB1cGRhdGUgdGhlIFVSTCAod2UncmUgc3luY2luZyBmcm9tIFVSTCkuICovXG4gIHByaXZhdGUgcGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcblxuICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBVUkwgZmllbGQ6IHNob3cgXCJFbnRlciBVUkwgb3Igc2VsZWN0IFBhcmFtZXRlciAqXCIgd2hlbiB1cmxPcHRpb25zIGFyZSBhdmFpbGFibGUgKGVudmlyb25tZW50IHNlbGVjdGVkKS4gKi9cbiAgZ2V0IHVybFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLnVybE9wdGlvbnM/Lmxlbmd0aCA/PyAwKSA+IDAgPyAnRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXIgKicgOiAnRW50ZXIgVVJMIConO1xuICB9XG5cbiAgcmVhZG9ubHkgcGF5bG9hZFRhYnM6IHsgdmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnYXV0aG9yaXphdGlvbicsIGxhYmVsOiAnQXV0aG9yaXphdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnaGVhZGVycycsIGxhYmVsOiAnSGVhZGVycycgfSxcbiAgICB7IHZhbHVlOiAnYm9keScsIGxhYmVsOiAnQm9keScgfSxcbiAgICB7IHZhbHVlOiAncGFyYW1zJywgbGFiZWw6ICdQYXJhbXMnIH0sXG4gIF07XG4gIGFjdGl2ZVBheWxvYWRUYWI6IEFwaUVkaXRQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuXG4gIC8qKiBTdGVwIDM6IFJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWJzICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiczogeyB2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgIHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JywgbGFiZWw6ICdSZXNwb25zZSBCb2R5JyB9LFxuICAgIHsgdmFsdWU6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycgfSxcbiAgXTtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gIC8qKiBQYXlsb2FkIHR5cGUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb246IHJhdywgeC13d3ctZm9ybS11cmxlbmNvZGVkLCBmb3JtLWRhdGEgKi9cbiAgcGF5bG9hZFR5cGU6ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJyA9ICdyYXcnO1xuXG4gIC8qKiBTZWdtZW50IG9wdGlvbnMgZm9yIHBheWxvYWQgdHlwZSAodXNlZCBieSBjcWEtc2VnbWVudC1jb250cm9sKSAqL1xuICByZWFkb25seSBwYXlsb2FkVHlwZVNlZ21lbnRzID0gW1xuICAgIHsgbGFiZWw6ICdSYXcnLCB2YWx1ZTogJ3JhdycgfSxcbiAgICB7IGxhYmVsOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJywgdmFsdWU6ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgeyBsYWJlbDogJ0Zvcm0gRGF0YScsIHZhbHVlOiAnZm9ybS1kYXRhJyB9LFxuICBdO1xuXG4gIG9uUGF5bG9hZFR5cGVDaGFuZ2UodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUeXBlID0gdmFsIGFzICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgfVxuXG4gIC8qKiBGb3JtIGZvciBGb3JtYXQgc2VsZWN0IChCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uKSAqL1xuICBwYXlsb2FkRm9ybWF0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRm9ybWF0IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBKU09OLCBYTUwsIEhUTUwsIFRleHQgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgZm9ybWF0T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgQElucHV0KCkgaW5pdGlhbEZvcm1hdD86IHN0cmluZztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZPUk1BVF9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnanNvbicsIHZhbHVlOiAnanNvbicsIG5hbWU6ICdKU09OJywgbGFiZWw6ICdKU09OJyB9LFxuICAgIHsgaWQ6ICd4bWwnLCB2YWx1ZTogJ3htbCcsIG5hbWU6ICdYTUwnLCBsYWJlbDogJ1hNTCcgfSxcbiAgICB7IGlkOiAnaHRtbCcsIHZhbHVlOiAnaHRtbCcsIG5hbWU6ICdIVE1MJywgbGFiZWw6ICdIVE1MJyB9LFxuICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgRm9ybWF0IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZm9ybWF0T3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgcGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Zvcm1hdCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmZvcm1hdE9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZvcm1hdE9wdGlvbnMubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihmKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TO1xuICAgIHRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWF0VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfRk9STUFUX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShmIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogUGF5bG9hZCB0ZXh0IGFyZWEgdmFsdWUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb24gKi9cbiAgcGF5bG9hZFRleHQgPSAnJztcblxuICAvKiogSlNPTiBwYXJzZSBlcnJvciB3aGVuIGZvcm1hdCBpcyBKU09OIGFuZCBwYXlsb2FkIGlzIGludmFsaWQ7IG51bGwgd2hlbiB2YWxpZCBvciBub3QgSlNPTi4gKi9cbiAgcGF5bG9hZEpzb25FcnJvcjoge1xuICAgIGxpbmU6IG51bWJlcjtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZXhjZXJwdDogc3RyaW5nO1xuICAgIGNhcmV0T2Zmc2V0OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogTGluZSBudW1iZXJzIGZvciBwYXlsb2FkIHRleHRhcmVhICgxLCAyLCAzLCAuLi4pIGJhc2VkIG9uIGN1cnJlbnQgbGluZSBjb3VudC4gKi9cbiAgZ2V0IHBheWxvYWRMaW5lTnVtYmVycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDEsICh0aGlzLnBheWxvYWRUZXh0IHx8ICcnKS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgcGF5bG9hZCBmb3JtYXQgaXMgSlNPTiAoc28gd2UgdmFsaWRhdGUgYW5kIHNob3cgSlNPTiBlZGl0b3IgYmVoYXZpb3IpLiAqL1xuICBnZXQgaXNQYXlsb2FkRm9ybWF0SnNvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtPy5nZXQoJ2Zvcm1hdCcpPy52YWx1ZTtcbiAgICByZXR1cm4gZm9ybWF0ID09PSAnanNvbic7XG4gIH1cblxuICAvKiogRXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBwYXlsb2FkIHRleHRhcmVhIChyZWQgYm9yZGVyICsgYm90dG9tIGxpbmUpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWRKc29uRXJyb3IgPyBbJ0ludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC4nXSA6IFtdO1xuICB9XG5cbiAgLyoqIFRvb2x0aXAgY29udGVudCBmb3IgdGhlIGxpbmUtbGV2ZWwgZXJyb3IgaWNvbiAocGFyc2UgZXJyb3Igb24gbGluZSBYLCBleGNlcnB0LCBjYXJldCwgbWVzc2FnZSkuICovXG4gIGdldCBwYXlsb2FkSnNvbkVycm9yVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5wYXlsb2FkSnNvbkVycm9yKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZSA9IHRoaXMucGF5bG9hZEpzb25FcnJvcjtcbiAgICBjb25zdCBjYXJldCA9ICcgJy5yZXBlYXQoZS5jYXJldE9mZnNldCkgKyAnXic7XG4gICAgcmV0dXJuIGBQYXJzZSBlcnJvciBvbiBsaW5lICR7ZS5saW5lfTpcXG5cXG4ke2UuZXhjZXJwdH1cXG4ke2NhcmV0fVxcblxcbiR7ZS5tZXNzYWdlfWA7XG4gIH1cblxuICBvblBheWxvYWRUZXh0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gIH1cblxuICBvblBheWxvYWRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5vblBheWxvYWRUZXh0Q2hhbmdlKHRhcmdldD8udmFsdWUgPz8gJycpO1xuICB9XG5cbiAgb25QYXlsb2FkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IGNsb3NlID0gUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTW2tleV07XG4gICAgaWYgKCFjbG9zZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qgc3RhcnQgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQuc2VsZWN0aW9uRW5kID8/IHN0YXJ0O1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoMCwgc3RhcnQpO1xuICAgIGNvbnN0IGFmdGVyID0gdGhpcy5wYXlsb2FkVGV4dC5zbGljZShlbmQpO1xuICAgIGNvbnN0IGluc2VydFBvcyA9IHN0YXJ0ICsgMTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGJlZm9yZSArIGtleSArIGNsb3NlICsgYWZ0ZXI7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IG5ld1ZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wYXlsb2FkVGV4dGFyZWFSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKGluc2VydFBvcywgaW5zZXJ0UG9zKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBwYXlsb2FkIHdoZW4gZm9ybWF0IGlzIEpTT047IHNldHMgcGF5bG9hZEpzb25FcnJvciBvciBjbGVhcnMgaXQuICovXG4gIHZhbGlkYXRlUGF5bG9hZEpzb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGF5bG9hZEZvcm1hdEpzb24pIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBheWxvYWRUZXh0ID8/ICcnO1xuICAgIGlmICh0ZXh0LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSB0aGlzLnBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQsIHBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgY29uc3QgbGluZUluZGV4ID0gTWF0aC5tYXgoMCwgbGluZSAtIDEpO1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBsaW5lc1tsaW5lSW5kZXhdID8/ICcnO1xuICAgICAgY29uc3QgZXhjZXJwdCA9IGxpbmVDb250ZW50IHx8ICcgJztcbiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gbGluZUluZGV4ID09PSBsaW5lIC0gMSA/IE1hdGgubWluKGNvbHVtbiAtIDEsIGxpbmVDb250ZW50Lmxlbmd0aCkgOiAwO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0ge1xuICAgICAgICBsaW5lLFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubm9ybWFsaXplSnNvbkVycm9yTWVzc2FnZShtZXNzYWdlKSxcbiAgICAgICAgZXhjZXJwdCxcbiAgICAgICAgY2FyZXRPZmZzZXQsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvcG9zaXRpb25cXHMrKFxcZCspL2kpIHx8IG1lc3NhZ2UubWF0Y2goL2F0XFxzK3Bvc2l0aW9uXFxzKyhcXGQrKS9pKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ub0xpbmVDb2x1bW4odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogeyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UoMCwgTWF0aC5taW4ocG9zaXRpb24sIHRleHQubGVuZ3RoKSk7XG4gICAgY29uc3QgbGluZXMgPSBiZWZvcmUuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBjb25zdCBsaW5lID0gbGluZXMubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPz8gJyc7XG4gICAgcmV0dXJuIHsgbGluZSwgY29sdW1uOiBsYXN0TGluZS5sZW5ndGggKyAxIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnRXhwZWN0aW5nJykgfHwgbWVzc2FnZS5pbmNsdWRlcygnZXhwZWN0aW5nJykpIHJldHVybiBtZXNzYWdlO1xuICAgIGNvbnN0IHRva2VuTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC9VbmV4cGVjdGVkIHRva2VuXFxzK1snXCJdPyhbXidcIl0rKVsnXCJdPy9pKVxuICAgICAgfHwgbWVzc2FnZS5tYXRjaCgvdW5leHBlY3RlZCBjaGFyYWN0ZXIuKj8oW15cXHNdKykvaSk7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbk1hdGNoID8gdG9rZW5NYXRjaFsxXS50cmltKCkgOiAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gYEV4cGVjdGluZyAnU1RSSU5HJywgJ05VTUJFUicsICdOVUxMJywgJ1RSVUUnLCAnRkFMU0UnLCAneycsICdbJywgZ290ICcke3Rva2VufSdgO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgncGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZicpIHBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGF5bG9hZFRleHRhcmVhUmVmJykgcGF5bG9hZFRleHRhcmVhUmVmPzogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlM6IHN0cmluZ1tdID0gW1xuICAgICdBY2NlcHQnLFxuICAgICdBY2NlcHQtQ2hhcnNldCcsXG4gICAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycycsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kJyxcbiAgICAnU2NyaXB0cycsXG4gICAgJ0NhY2hlLUNvbnRyb2wnLFxuICAgICdDb250ZW50LU1ENScsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgICAnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ0NvbnRlbnQtVHlwZScsXG4gICAgJ0Nvb2tpZScsXG4gICAgJ0RhdGUnLFxuICAgICdFeHBlY3QnLFxuICAgICdGcm9tJyxcbiAgICAnSG9zdCcsXG4gICAgJ0lmLU1hdGNoJyxcbiAgICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1Ob25lLU1hdGNoJyxcbiAgICAnSWYtVW5tb2RpZmllZC1TaW5jZScsXG4gICAgJ0lmLVJhbmdlJyxcbiAgICAnS2VlcC1BbGl2ZScsXG4gICAgJ01heC1Gb3J3YXJkcycsXG4gICAgJ09yaWdpbicsXG4gICAgJ1ByYWdtYScsXG4gICAgJ1Byb3h5LUF1dGhvcml6YXRpb24nLFxuICAgICdSYW5nZScsXG4gICAgJ1JlZmVyZXInLFxuICAgICdURScsXG4gICAgJ1RyYWlsZXInLFxuICAgICdUcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ1VwZ3JhZGUnLFxuICAgICdVc2VyLUFnZW50JyxcbiAgICAnVmlhJyxcbiAgICAnV2FybmluZycsXG4gICAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAgICdYLURvLU5vdC1UcmFjaycsXG4gICAgJ0ROVCcsXG4gICAgJ3gtYXBpLWtleScsXG4gICAgJ0Nvbm5lY3Rpb24nLFxuICBdO1xuXG4gIC8qKiBIZWFkZXIgbmFtZSBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgaGVhZGVyTmFtZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBoZWFkZXIgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IG5hbWUsIHZhbHVlIH0pIGZvciBjcWEtZHluYW1pYy1zZWxlY3QgYW5kIHZhbHVlIGlucHV0ICovXG4gIGhlYWRlcnNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgLyoqIFR5cGVkIGFjY2Vzc29yIGZvciB0ZW1wbGF0ZSAoRm9ybUFycmF5LmNvbnRyb2xzIGlzIEFic3RyYWN0Q29udHJvbFtdKSAqL1xuICBnZXQgaGVhZGVyUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIGhlYWRlciBuYW1lIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gaGVhZGVyTmFtZU9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBoZWFkZXJOYW1lU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgaGVhZGVyJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5oZWFkZXJOYW1lT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICBjb25zdCBiYXNlT3B0aW9ucyA9IHNvdXJjZS5tYXAoKGgpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGgpKTtcbiAgICBjb25zdCBiYXNlVmFsdWVzID0gbmV3IFNldChiYXNlT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBjdXJyZW50TmFtZXNGcm9tRm9ybSA9IHRoaXMuZ2V0Q3VycmVudEhlYWRlck5hbWVzRnJvbUZvcm0oKTtcbiAgICBjb25zdCBleHRyYU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGN1cnJlbnROYW1lc0Zyb21Gb3JtKSB7XG4gICAgICBjb25zdCBrZXkgPSBuYW1lLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgJiYgIWJhc2VWYWx1ZXMuaGFzKGtleSkpIHtcbiAgICAgICAgYmFzZVZhbHVlcy5hZGQoa2V5KTtcbiAgICAgICAgZXh0cmFPcHRpb25zLnB1c2goeyBpZDoga2V5LCB2YWx1ZToga2V5LCBuYW1lOiBrZXksIGxhYmVsOiBrZXkgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBbLi4uYmFzZU9wdGlvbnMsIC4uLmV4dHJhT3B0aW9uc107XG4gICAgdGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbGxlY3RzIGRpc3RpbmN0IG5vbi1lbXB0eSBoZWFkZXIgbmFtZXMgY3VycmVudGx5IGluIHRoZSBoZWFkZXJzIGZvcm0gKGZvciBkeW5hbWljIG9wdGlvbnMpLiAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzPy5sZW5ndGgpIHJldHVybiBuYW1lcztcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWU7XG4gICAgICBjb25zdCBzdHIgPSBuYW1lICE9IG51bGwgPyBTdHJpbmcobmFtZSkudHJpbSgpIDogJyc7XG4gICAgICBpZiAoc3RyICYmICFzZWVuLmhhcyhzdHIpKSB7XG4gICAgICAgIHNlZW4uYWRkKHN0cik7XG4gICAgICAgIG5hbWVzLnB1c2goc3RyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0SGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW1xuICAgIHsgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gIF07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIGtleS12YWx1ZSByb3dzIChCb2R5IHBheWxvYWQpOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBrZXlWYWx1ZUZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQga2V5VmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdHlwZS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB0eXBlLCB2YWx1ZSB9KSAqL1xuICBrZXlUeXBlVmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVR5cGVWYWx1ZVJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBQYXJhbXMgdGFiIGtleS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBwYXJhbXNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHBhcmFtc1Jvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5wYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFR5cGUgZHJvcGRvd24gaW4ga2V5LXR5cGUtdmFsdWUgcm93cyAoVGV4dCwgRmlsZSkgKi9cbiAgcmVhZG9ubHkga2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnVGV4dCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RleHQnLCB2YWx1ZTogJ3RleHQnLCBuYW1lOiAnVGV4dCcsIGxhYmVsOiAnVGV4dCcgfSxcbiAgICAgIHsgaWQ6ICdmaWxlJywgdmFsdWU6ICdmaWxlJywgbmFtZTogJ0ZpbGUnLCBsYWJlbDogJ0ZpbGUnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgcmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGpzb25QYXRoLCB2ZXJpZmljYXRpb24sIGRhdGFUeXBlLCBleHBlY3RlZFZhbHVlIH0pICovXG4gIHZlcmlmaWNhdGlvbkZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQgdmVyaWZpY2F0aW9uUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhdGlvbiBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSB2ZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRXF1YWxzJywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgeyBpZDogJ25vdC1lcXVhbCcsIHZhbHVlOiAnbm90LWVxdWFsJywgbmFtZTogJ05vdCBlcXVhbCcsIGxhYmVsOiAnTm90IGVxdWFsJyB9LFxuICAgIHsgaWQ6ICdsZXNzLXRoYW4nLCB2YWx1ZTogJ2xlc3MtdGhhbicsIG5hbWU6ICdMZXNzIHRoYW4nLCBsYWJlbDogJ0xlc3MgdGhhbicgfSxcbiAgICB7IGlkOiAnZ3JlYXRlci10aGFuJywgdmFsdWU6ICdncmVhdGVyLXRoYW4nLCBuYW1lOiAnR3JlYXRlciB0aGFuJywgbGFiZWw6ICdHcmVhdGVyIHRoYW4nIH0sXG4gICAgeyBpZDogJ2lzLW51bGwnLCB2YWx1ZTogJ2lzLW51bGwnLCBuYW1lOiAnSXMgbnVsbCcsIGxhYmVsOiAnSXMgbnVsbCcgfSxcbiAgICB7IGlkOiAnaXMtbm90LW51bGwnLCB2YWx1ZTogJ2lzLW5vdC1udWxsJywgbmFtZTogJ0lzIG5vdCBudWxsJywgbGFiZWw6ICdJcyBub3QgbnVsbCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBWZXJpZmljYXRpb24gZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25PcHRpb25zIGNoYW5nZXMsIGxpa2UgTWV0aG9kIGRyb3Bkb3duKSAqL1xuICB2ZXJpZmljYXRpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2ZXJpZmljYXRpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnRXF1YWxzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKCh2KSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbih2KSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy52ZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiAnZXF1YWxzJztcbiAgfVxuXG4gIC8qKiBEYXRhIFR5cGUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnc3RyaW5nJywgdmFsdWU6ICdzdHJpbmcnLCBuYW1lOiAnU3RyaW5nJywgbGFiZWw6ICdTdHJpbmcnIH0sXG4gICAgeyBpZDogJ251bWJlcicsIHZhbHVlOiAnbnVtYmVyJywgbmFtZTogJ051bWJlcicsIGxhYmVsOiAnTnVtYmVyJyB9LFxuICAgIHsgaWQ6ICdib29sZWFuJywgdmFsdWU6ICdib29sZWFuJywgbmFtZTogJ0Jvb2xlYW4nLCBsYWJlbDogJ0Jvb2xlYW4nIH0sXG4gICAgeyBpZDogJ2FycmF5JywgdmFsdWU6ICdhcnJheScsIG5hbWU6ICdBcnJheScsIGxhYmVsOiAnQXJyYXknIH0sXG4gICAgeyBpZDogJ29iamVjdCcsIHZhbHVlOiAnb2JqZWN0JywgbmFtZTogJ09iamVjdCcsIGxhYmVsOiAnT2JqZWN0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIERhdGEgVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkYXRhVHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTdHJpbmcnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucy5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGQpKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfREFUQV9UWVBFX09QVElPTlM7XG4gICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFUeXBlVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldERhdGFUeXBlVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ3N0cmluZyc7XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBFeHBlY3RlZCBWYWx1ZSB3aGVuIERhdGEgVHlwZSBpcyBCb29sZWFuICh0cnVlL2ZhbHNlIGRyb3Bkb3duKSAqL1xuICByZWFkb25seSB2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2V4cGVjdGVkVmFsdWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IGlkOiAndHJ1ZScsIHZhbHVlOiAndHJ1ZScsIG5hbWU6ICd0cnVlJywgbGFiZWw6ICd0cnVlJyB9LFxuICAgICAgeyBpZDogJ2ZhbHNlJywgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdmYWxzZScsIGxhYmVsOiAnZmFsc2UnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgU3RhdHVzIHRhYiB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IHZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICBzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHN0YXR1c1ZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duIChFcXVhbHMsIE5vdCBlcXVhbCwgTGVzcyB0aGFuLCBHcmVhdGVyIHRoYW4pICovXG4gIC8qKiBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBvcHRpb25zIChFcXVhbHMsIE5vdCBlcXVhbCwgZXRjLikuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzKS4gKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucy5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG8pKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG8gYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICByZXNwb25zZVByZXZpZXcgPSBgYDtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByZXNwb25zZSBwcmV2aWV3IHNlY3Rpb24sIHVzZWQgdG8gc2Nyb2xsIGludG8gdmlldyBhZnRlciBTZW5kIFJlcXVlc3QgY29tcGxldGVzLiAqL1xuICBAVmlld0NoaWxkKCdyZXNwb25zZVByZXZpZXdSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgcmVzcG9uc2VQcmV2aWV3UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBtZXRob2RDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvcm1hdENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbWV0aG9kRm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcblxuICAvLyBBZHZhbmNlZCBzZXR0aW5nczogZ2VuZXJpYyBhZHZhbmNlZCB2YXJpYWJsZXMgZm9yIHRoaXMgQVBJIHN0ZXAgKGNhbiBiZSBwcm92aWRlZCBieSBwYXJlbnQpXG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZFZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcCh0aGlzLmluaXRpYWxTdGVwKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5tZXRob2RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBtZXRob2Q6IFtkZWZhdWx0TWV0aG9kXSxcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdFZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVudmlyb25tZW50OiBbZGVmYXVsdEVudl0sXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRBdXRoVHlwZSA9IHRoaXMuaW5pdGlhbEF1dGhUeXBlID8/IGZpcnN0QXV0aFZhbHVlID8/ICduby1hdXRoJztcbiAgICB0aGlzLmF1dGhUeXBlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYXV0aFR5cGU6IFtkZWZhdWx0QXV0aFR5cGVdLFxuICAgIH0pO1xuICAgIHRoaXMub2F1dGgyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JhbnRUeXBlOiBbJ2NsaWVudF9jcmVkZW50aWFscyddLFxuICAgICAgYWNjZXNzVG9rZW5Vcmw6IFsnJ10sXG4gICAgICBjbGllbnRJZDogWycnXSxcbiAgICAgIGNsaWVudFNlY3JldDogWycnXSxcbiAgICAgIHNjb3BlOiBbJyddLFxuICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IFsnYmFzaWMnXSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWIgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoXG4gICAgICB0aGlzLmluaXRpYWxIZWFkZXJzID8/IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dXG4gICAgKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1YiA9IHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0Rm9ybWF0VmFsdWUgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gZmlyc3RGb3JtYXRWYWx1ZSA/PyAnanNvbic7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoeyBmb3JtYXQ6IFtkZWZhdWx0Rm9ybWF0XSB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgcGF5bG9hZCB0eXBlIGFuZCB0ZXh0IGZyb20gaW5wdXRzIHdoZW4gZWRpdGluZ1xuICAgIGlmICh0aGlzLmluaXRpYWxQYXlsb2FkVHlwZSkge1xuICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9IHRoaXMuaW5pdGlhbFBheWxvYWRUeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsUGF5bG9hZFRleHQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IHRoaXMuaW5pdGlhbFBheWxvYWRUZXh0O1xuICAgIH1cblxuICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KCk7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViID0gdGhpcy5wYXJhbXNGb3JtQXJyYXkudmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zeW5jVXJsRnJvbVBhcmFtcygpKTtcbiAgICBpZiAodGhpcy5pbml0aWFsVXJsICE9IG51bGwgJiYgdGhpcy5pbml0aWFsVXJsICE9PSAnJykge1xuICAgICAgdGhpcy5fdXJsID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZGVjb2RlVXJsRm9yRGlzcGxheSh0aGlzLmluaXRpYWxVcmwpO1xuICAgICAgdGhpcy5zeW5jUGFyYW1zRnJvbVVybCgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlTmFtZSBmcm9tIGluaXRpYWxWYXJpYWJsZU5hbWVcbiAgICBpZiAodGhpcy5pbml0aWFsVmFyaWFibGVOYW1lICE9IG51bGwgJiYgdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lICE9PSAnJykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWUgPSB0aGlzLmluaXRpYWxWYXJpYWJsZU5hbWU7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgc3VtbWFyeSBmcm9tIGluaXRpYWxTdW1tYXJ5IChzdGVwIGRlc2NyaXB0aW9uKVxuICAgIGlmICh0aGlzLmluaXRpYWxTdW1tYXJ5ICE9IG51bGwgJiYgdGhpcy5pbml0aWFsU3VtbWFyeSAhPT0gJycpIHtcbiAgICAgIHRoaXMuc3VtbWFyeSA9IHRoaXMuaW5pdGlhbFN1bW1hcnk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB2ZXJpZmljYXRpb24gcm93cyBmcm9tIGlucHV0cyB3aGVuIHByb3ZpZGVkOyBvdGhlcndpc2UgYnVpbGQgZGVmYXVsdHNcbiAgICBjb25zdCBib2R5Um93cyA9XG4gICAgICB0aGlzLmluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zICYmIHRoaXMuaW5pdGlhbFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaW5pdGlhbFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5idWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheShib2R5Um93cyk7XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IHN0YXR1c1Jvd3MgPVxuICAgICAgdGhpcy5pbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9ucyAmJiB0aGlzLmluaXRpYWxTdGF0dXNWZXJpZmljYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmluaXRpYWxTdGF0dXNWZXJpZmljYXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkoc3RhdHVzUm93cyk7XG4gICAgdGhpcy5tZXRob2RDaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKSAmJiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgIT09ICdoZWFkZXJzJykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWIgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhY3RpdmUgcmVzcG9uc2UgdmVyaWZpY2F0aW9uIHRhYiBmcm9tIGlucHV0IHdoZW4gcHJvdmlkZWRcbiAgICBpZiAodGhpcy5pbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIpIHtcbiAgICAgIHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPSB0aGlzLmluaXRpYWxBY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBhZHZhbmNlZCBzZXR0aW5ncyBmb3JtIG9ubHkgZnJvbSBpbnB1dCB2YXJpYWJsZXMgKG5vIGxvY2FsIGluaXRpYWxpemF0aW9uKVxuICAgIGlmICh0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgJiYgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFBheWxvYWRUZXh0YXJlYVNjcm9sbFN5bmMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubWV0aG9kQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWV0aG9kRm9ybUNoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIFN5bmMgbGluZSBudW1iZXJzIGNvbHVtbiBzY3JvbGwgd2l0aCBwYXlsb2FkIHRleHRhcmVhIHNjcm9sbCAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMucGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghaG9zdCkgcmV0dXJuO1xuICAgICAgY29uc3QgbGluZU51bWJlcnNFbCA9IGhvc3QucXVlcnlTZWxlY3RvcignLmNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgY29uc3QgdGV4dGFyZWEgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoIWxpbmVOdW1iZXJzRWwgfHwgIXRleHRhcmVhKSByZXR1cm47XG4gICAgICB0ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wID0gdGV4dGFyZWEuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgICBsaW5lTnVtYmVyc0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgdGV4dGFyZWEuc2Nyb2xsVG9wID0gbGluZU51bWJlcnNFbC5zY3JvbGxUb3A7XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+IHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFtyLmtleV0sIHZhbHVlOiBbci52YWx1ZV0gfSkpO1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdHlwZTogJ3RleHQnLCB2YWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+IHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFtyLmtleV0sIHR5cGU6IFtyLnR5cGVdLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYXJhbXNGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICBpZiAodGhpcy5wYXJhbXNGb3JtQXJyYXkpIHtcbiAgICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5wYXJhbXNGb3JtQXJyYXkucHVzaChnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyYW1zRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUcnVlIGlmIFVSTCBpcyBhIHBhcmFtZXRlciBwbGFjZWhvbGRlciAoZS5nLiAqfHBhcmFtfCk7IG11c3Qgbm90IGJlIHBhcnNlZCB3aXRoIFVSTCgpIHdoaWNoIGVuY29kZXMgfCB0byAlN0MuICovXG4gIHByaXZhdGUgc3RhdGljIGlzUGFyYW1ldGVyVXJsKHVybFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF1cmxTdHIgfHwgdHlwZW9mIHVybFN0ciAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gLyhcXCpcXHxbXFx3LV0rXFx8KFxcKik/fFxcJFxcfFtcXHctXStcXHwoXFwqKT98QFxcfFtcXHctXStcXHwoXFwqKT98XFwkXFx7W159XStcXH0pLy50ZXN0KHVybFN0ci50cmltKCkpO1xuICB9XG5cbiAgLyoqIERlY29kZSBVUkwgZm9yIGRpc3BsYXkvcGF5bG9hZDogc3RyaXAgLyogcHJlZml4IGFuZCBkZWNvZGUgJTdDIHRvIHwgc28gKnxwYXJhbXwgc2hvd3MgY29ycmVjdGx5LiAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVVcmxGb3JEaXNwbGF5KHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICAgIGxldCBzID0gcmF3LnRyaW0oKTtcbiAgICBpZiAoIXMpIHJldHVybiAnJztcbiAgICBpZiAocy5zdGFydHNXaXRoKCcvKicpKSBzID0gcy5zbGljZSgyKS50cmltKCk7XG4gICAgaWYgKHMuaW5jbHVkZXMoJyU3QycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzID0gZGVjb2RlVVJJQ29tcG9uZW50KHMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGxlYXZlIGFzLWlzICovXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqIFBhcnNlIFVSTCBpbnRvIGJhc2UgKHdpdGhvdXQgcXVlcnkvZnJhZ21lbnQpIGFuZCBxdWVyeSBrZXktdmFsdWUgcGFpcnMuIFByZXNlcnZlcyByZWxhdGl2ZSBVUkxzIGFuZCBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzLiAqL1xuICBwcml2YXRlIHBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHVybFN0cjogc3RyaW5nKTogeyBiYXNlVXJsOiBzdHJpbmc7IHJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIH0ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB1cmxTdHI/LnRyaW0oKSA/PyAnJztcbiAgICBjb25zdCBlbXB0eSA9IHsgYmFzZVVybDogdHJpbW1lZCB8fCB1cmxTdHIsIHJvd3M6IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSB9O1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIGVtcHR5O1xuICAgIGlmIChBcGlFZGl0U3RlcENvbXBvbmVudC5pc1BhcmFtZXRlclVybCh1cmxTdHIpKSByZXR1cm4gZW1wdHk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHRyaW1tZWQpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICBjb25zdCBiYXNlVXJsID0gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcm93cy5wdXNoKHsga2V5OiAnJywgdmFsdWU6ICcnIH0pO1xuICAgICAgcmV0dXJuIHsgYmFzZVVybCwgcm93cyB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgYmFzZSBVUkwgKHdpdGhvdXQgcXVlcnkvZnJhZ21lbnQpIGZvciBidWlsZGluZyBVUkwgZnJvbSBwYXJhbXMuIFByZXNlcnZlcyByZWxhdGl2ZSBVUkxzIGFuZCBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzLiAqL1xuICBwcml2YXRlIGdldEJhc2VVcmwodXJsU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsU3RyIHx8ICF1cmxTdHIudHJpbSgpKSByZXR1cm4gdXJsU3RyO1xuICAgIGlmIChBcGlFZGl0U3RlcENvbXBvbmVudC5pc1BhcmFtZXRlclVybCh1cmxTdHIpKSByZXR1cm4gdXJsU3RyLnRyaW0oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsU3RyLnRyaW0oKSk7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHVybFN0ciwgJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgICAgIHJldHVybiBpc0Fic29sdXRlID8gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSA6IHVybC5wYXRobmFtZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1cmxTdHI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGF5bG9hZCBmb3JtYXQgZHJvcGRvd24gdXNpbmcgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZmlyc3QsIHRoZW5cbiAgICogZmFsbCBiYWNrIHRvIGluc3BlY3RpbmcgdGhlIGJvZHkgY29udGVudCAoSlNPTiBicmFjZXMsIFhNTCB0YWdzLCBIVE1MIGRvY3R5cGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUJvZHlGb3JtYXQoYm9keTogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybWF0VmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEZvcm1hdEZvcm0gfHwgZm9ybWF0VmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGN0ID0gKGNvbnRlbnRUeXBlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNldEZtdCA9IChmbXQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZvcm1hdFZhbHVlcy5pbmNsdWRlcyhmbXQpKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZtdCB9KTtcbiAgICB9O1xuICAgIC8vIENvbnRlbnQtVHlwZSB0YWtlcyBwcmlvcml0eVxuICAgIGlmIChjdC5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L2pzb24nKSkgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgnanNvbicpO1xuICAgIGlmIChjdC5pbmNsdWRlcygnYXBwbGljYXRpb24veG1sJykgfHwgY3QuaW5jbHVkZXMoJ3RleHQveG1sJykgfHwgY3QuaW5jbHVkZXMoJ3hodG1sJykpIHJldHVybiBzZXRGbXQoJ3htbCcpO1xuICAgIGlmIChjdC5pbmNsdWRlcygndGV4dC9odG1sJykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0Rm10KCdodG1sJyk7XG4gICAgaWYgKGN0LmluY2x1ZGVzKCd0ZXh0L3BsYWluJykgfHwgY3QuaW5jbHVkZXMoJ3RleHQvY3N2JykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgndGV4dCcpO1xuICAgIC8vIEZhbGwgYmFjayB0byBib2R5LWNvbnRlbnQgaW5zcGVjdGlvblxuICAgIGNvbnN0IHQgPSAoYm9keSA/PyAnJykudHJpbSgpO1xuICAgIGlmICgodC5zdGFydHNXaXRoKCd7JykgJiYgdC5lbmRzV2l0aCgnfScpKSB8fCAodC5zdGFydHNXaXRoKCdbJykgJiYgdC5lbmRzV2l0aCgnXScpKSkgIHJldHVybiBzZXRGbXQoJ2pzb24nKTtcbiAgICBpZiAodC5zdGFydHNXaXRoKCc8P3htbCcpIHx8ICh0LnN0YXJ0c1dpdGgoJzwnKSAmJiAhdC5zdGFydHNXaXRoKCc8IScpICYmICF0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnPCFkb2N0eXBlJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0Rm10KCd4bWwnKTtcbiAgICBpZiAodC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzwhZG9jdHlwZSBodG1sJykgfHwgdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzxodG1sJykpIHJldHVybiBzZXRGbXQoJ2h0bWwnKTtcbiAgfVxuXG4gIC8qKiBQYXJzZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSAoa2V5PXZhbHVlJi4uLikgaW50byBrZXktdmFsdWUgcm93cy4gKi9cbiAgcHJpdmF0ZSBwYXJzZUZvcm1VcmxFbmNvZGVkQm9keShib2R5OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IChib2R5ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModHJpbW1lZCk7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGZvcm0gYm9keSBoYXMgYSBzaW5nbGUga2V5IHdob3NlIHZhbHVlIGlzIFVSTC1kZWNvZGVkIEpTT04sIHJldHVybiBpdCBwcmV0dHktcHJpbnRlZCBmb3IgUmF3IGJvZHkuXG4gICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCAoY2FsbGVyIGtlZXBzIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCB2aWV3KS5cbiAgICovXG4gIHByaXZhdGUgdHJ5Rm9ybUJvZHlWYWx1ZUFzUmF3SnNvbihyb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gMSB8fCAhcm93c1swXS52YWx1ZT8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd3NbMF0udmFsdWUudHJpbSgpO1xuICAgIGlmICghKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdbJykpKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVcGRhdGUgUGFyYW1zIHRhYmxlIGZyb20gY3VycmVudCBVUkwgcXVlcnkgc3RyaW5nIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgcHJpdmF0ZSBzeW5jUGFyYW1zRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJhc2VVcmw6IF9iLCByb3dzIH0gPSB0aGlzLnBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHRoaXMuX3VybCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheShyb3dzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIFBhcmFtcyB0YWJsZSAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1VybEZyb21QYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgfHwgIXRoaXMucGFyYW1zRm9ybUFycmF5KSByZXR1cm47XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QmFzZVVybCh0aGlzLl91cmwpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5wYXJhbXNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGtleSA9ICgoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmIChrZXkgIT09ICcnKSBwYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIGNvbnN0IG5ld1VybCA9IHF1ZXJ5U3RyaW5nID8gYCR7YmFzZVVybH0/JHtxdWVyeVN0cmluZ31gIDogYmFzZVVybDtcbiAgICBpZiAodGhpcy5fdXJsICE9PSBuZXdVcmwpIHtcbiAgICAgIHRoaXMuX3VybCA9IG5ld1VybDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsganNvblBhdGg6IHN0cmluZzsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGRhdGFUeXBlOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBqc29uUGF0aDogJycsIHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFtyLmpzb25QYXRoXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBkYXRhVHlwZTogW3IuZGF0YVR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnNGb3JtQXJyYXkocm93czogQXBpRWRpdEhlYWRlclJvd1tdKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gcm93cy5tYXAoKGgpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2gubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbaC52YWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCB0aHJlZSBzdGVwcyBhbmQgYWxsIGVudGVyZWQgZGF0YSB0byBpbml0aWFsL2RlZmF1bHQgc3RhdGUuIFVzZWQgd2hlbiB1c2VyIGNhbmNlbHMgb24gc3RlcCAxLiAqL1xuICBwcml2YXRlIHJlc2V0QWxsU3RlcHNBbmREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAxO1xuXG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWwgPz8gJyc7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICBjb25zdCBmaXJzdEVudlZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdEVudlZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgY29uc3QgZW52VmFsID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZW52VmFsID8/ICcnO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSkgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBkZWZhdWx0RW52IH0pO1xuXG4gICAgdGhpcy51cmwgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5kZWNvZGVVcmxGb3JEaXNwbGF5KHRoaXMuaW5pdGlhbFVybCA/PyAnJykgfHwgJyc7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkodGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF0gPz8gJ2pzb24nO1xuICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQgfSk7XG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcblxuICAgIHRoaXMudmFyaWFibGVOYW1lID0gJyc7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc3VtbWFyeSA9IHRoaXMuaW5pdGlhbFN1bW1hcnkgPz8gJyc7XG5cbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPSAncmVzcG9uc2UtYm9keSc7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBpbXBvcnQgY1VSTCBwYW5lbCAoY2FsbGVkIHdoZW4gdXNlciBjbGlja3MgXCJJbXBvcnQgQVBJIGNVUkxcIikuIFJlc2V0cyB0ZXh0YXJlYSBzbyBpdCBpcyBjbGVhcmVkIGVhY2ggdGltZS4gKi9cbiAgb3BlbkltcG9ydEN1cmxQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2ltcG9ydC1jdXJsJztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUmVzZXQgVVJMLCBtZXRob2QsIGhlYWRlcnMsIGJvZHksIGFuZCBwYXJhbXMgdG8gZW1wdHkvZGVmYXVsdCBiZWZvcmUgYXBwbHlpbmcgaW1wb3J0ZWQgY1VSTC4gKi9cbiAgcHJpdmF0ZSByZXNldFJlcXVlc3RGaWVsZHNCZWZvcmVDdXJsSW1wb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLnNlbGVjdGVkTWV0aG9kID0gdHlwZW9mIGRlZmF1bHRNZXRob2QgPT09ICdzdHJpbmcnID8gZGVmYXVsdE1ldGhvZCA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0TWV0aG9kIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRNZXRob2Q7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICB0aGlzLnVybCA9ICcnO1xuXG4gICAgLy8gUmVzZXQgYXV0aCBzbyBhIHByZXZpb3VzIEJlYXJlciB0b2tlbiBkb2Vzbid0IHBlcnNpc3Qgd2hlbiByZS1pbXBvcnRpbmdcbiAgICBjb25zdCBmaXJzdEF1dGhWYWx1ZSA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKVswXSA/PyAnbm8tYXV0aCc7XG4gICAgaWYgKHRoaXMuYXV0aFR5cGVGb3JtKSB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IGZpcnN0QXV0aFZhbHVlIH0pO1xuICAgIHRoaXMuYmVhcmVyVG9rZW4gPSAnJztcblxuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXSA/PyAnanNvbic7XG4gICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZGVmYXVsdEZvcm1hdCB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogcGFyc2UgY1VSTCBmcm9tIGNvbnRyb2wsIGJpbmQgdG8gZm9ybSBmaWVsZHMsIGVtaXQgYW5kIGNsb3NlIHBhbmVsLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjdXJsU3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG4gICAgdGhpcy5pbXBvcnRDdXJsLmVtaXQoY3VybFN0cik7XG5cbiAgICB0aGlzLnJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3VybChjdXJsU3RyKTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICAvLyDilIDilIAgTWV0aG9kIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgbWV0aG9kVmFsdWUgPSBwYXJzZWQubWV0aG9kICYmIHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCkuaW5jbHVkZXMocGFyc2VkLm1ldGhvZClcbiAgICAgICAgPyBwYXJzZWQubWV0aG9kXG4gICAgICAgIDogcGFyc2VkLm1ldGhvZCB8fCAnR0VUJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZXRob2QgPSBtZXRob2RWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gbWV0aG9kVmFsdWU7XG5cbiAgICAgIC8vIOKUgOKUgCBVUkwgKGFsc28gc3luY3MgUGFyYW1zIHRhYiBmcm9tIHF1ZXJ5IHN0cmluZykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAocGFyc2VkLnVybCkgdGhpcy51cmwgPSBwYXJzZWQudXJsO1xuXG4gICAgICAvLyDilIDilIAgQXV0aG9yaXphdGlvbiBoZWFkZXIg4oaSIEJlYXJlciBUb2tlbiAvIGF1dGggdHlwZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxldCBoZWFkZXJSb3dzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBwYXJzZWQuaGVhZGVycztcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBoZWFkZXJSb3dzLmZpbmQoaCA9PiBoLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKTtcbiAgICAgIGlmIChhdXRoSGVhZGVyPy52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IGJlYXJlck1hdGNoID0gL15CZWFyZXJcXHMrKC4rKSQvaS5leGVjKGF1dGhIZWFkZXIudmFsdWUudHJpbSgpKTtcbiAgICAgICAgaWYgKGJlYXJlck1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBiZWFyZXJNYXRjaFsxXS50cmltKCk7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKS5pbmNsdWRlcygnYmVhcmVyJykgJiYgdGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogJ2JlYXJlcicgfSk7XG4gICAgICAgICAgICB0aGlzLmJlYXJlclRva2VuID0gdG9rZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlbW92ZSBBdXRob3JpemF0aW9uIGZyb20gaGVhZGVycyB0YWJsZSAoaXQgbGl2ZXMgaW4gdGhlIEF1dGggdGFiKVxuICAgICAgICAgIGhlYWRlclJvd3MgPSBoZWFkZXJSb3dzLmZpbHRlcihoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBIZWFkZXJzIHRhYmxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgaGVhZGVyUm93cyA9IGhlYWRlclJvd3MubGVuZ3RoID4gMCA/IGhlYWRlclJvd3MgOiBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XTtcbiAgICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KGhlYWRlclJvd3MpO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgICAvLyDilIDilIAgRGV0ZXJtaW5lIENvbnRlbnQtVHlwZSBmb3IgYm9keS9mb3JtYXQgZGVjaXNpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBwYXJzZWQuaGVhZGVyc1xuICAgICAgICAuZmluZChoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJylcbiAgICAgICAgPy52YWx1ZT8udG9Mb3dlckNhc2UoKSA/PyAnJztcblxuICAgICAgLy8g4pSA4pSAIEJvZHkgLyBGb3JtLWRhdGEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBsZXQgdGFiVG9BY3RpdmF0ZTogQXBpRWRpdFBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG5cbiAgICAgIGlmIChwYXJzZWQuZm9ybURhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBNdWx0aXBhcnQgZm9ybS1kYXRhICgtRiAvIC0tZm9ybSBlbnRyaWVzKVxuICAgICAgICB0aGlzLnBheWxvYWRUeXBlID0gJ2Zvcm0tZGF0YSc7XG4gICAgICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoXG4gICAgICAgICAgcGFyc2VkLmZvcm1EYXRhLm1hcChlID0+ICh7IGtleTogZS5rZXksIHR5cGU6IGUudHlwZSwgdmFsdWU6IGUudmFsdWUgfSkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGFiVG9BY3RpdmF0ZSA9ICdib2R5JztcblxuICAgICAgfSBlbHNlIGlmIChwYXJzZWQuYm9keSkge1xuICAgICAgICBjb25zdCBpc0Zvcm1VcmxFbmNvZGVkID0gY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuXG4gICAgICAgIGlmIChpc0Zvcm1VcmxFbmNvZGVkKSB7XG4gICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VGb3JtVXJsRW5jb2RlZEJvZHkocGFyc2VkLmJvZHkpO1xuICAgICAgICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShyb3dzLmxlbmd0aCA+IDAgPyByb3dzIDogW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkQXNKc29uID0gdGhpcy50cnlGb3JtQm9keVZhbHVlQXNSYXdKc29uKHJvd3MpO1xuICAgICAgICAgIGlmIChkZWNvZGVkQXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBkZWNvZGVkQXNKc29uO1xuICAgICAgICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogJ2pzb24nIH0pO1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBheWxvYWRUZXh0ID0gcGFyc2VkLmJvZHk7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgICAgICAgdGhpcy5hcHBseUJvZHlGb3JtYXQocGFyc2VkLmJvZHksIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJUb0FjdGl2YXRlID0gJ2JvZHknO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgQXV0by1zd2l0Y2ggdG8gdGhlIG1vc3QgcmVsZXZhbnQgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgaWYgKHRhYlRvQWN0aXZhdGUgPT09ICdib2R5Jykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnYm9keSc7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2F1dGhvcml6YXRpb24nO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IGVtaXQgY2FuY2VsIGFuZCBjbG9zZSBwYW5lbC4gQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgQ2FuY2VsIGluIGltcG9ydCBjVVJMIHBhbmVsLiAqL1xuICBvbkNhbmNlbEltcG9ydEN1cmwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlSW1wb3J0Q3VybFBhbmVsKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBoZWFkZXJzIHNlY3Rpb24gKGNhbGxlZCBmcm9tIENhbmNlbCBvciBhZnRlciBJbXBvcnQgaW4gaW1wb3J0IHBhbmVsKS4gKi9cbiAgY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdoZWFkZXJzJztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMOiBtdXN0IGJlIHJlcXVpcmVkIGFuZCBtYXRjaCBodHRwL2h0dHBzIHBhdHRlcm5cbiAgICogQWxzbyBhbGxvd3MgcGFyYW1ldGVyIHBsYWNlaG9sZGVycyBsaWtlIEB8cGFyYW1OYW1lfFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVybCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB1cmxWYWx1ZSA9IHRoaXMudXJsPy50cmltKCkgfHwgJyc7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgVVJMIGlzIGVtcHR5XG4gICAgaWYgKCF1cmxWYWx1ZSkge1xuICAgICAgdGhpcy51cmxFcnJvciA9ICdVUkwgaXMgcmVxdWlyZWQnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcGFyYW1ldGVyIHBsYWNlaG9sZGVyIChmb3JtYXQ6IEB8cGFyYW1OYW1lfClcbiAgICBjb25zdCBpc1BhcmFtZXRlclBsYWNlaG9sZGVyID0gL15AXFx8W158XStcXHwkLy50ZXN0KHVybFZhbHVlKTtcbiAgICBpZiAoaXNQYXJhbWV0ZXJQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy51cmxFcnJvciA9ICcnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCwgc2tpcCB0aGUgaHR0cC9odHRwcyB2YWxpZGF0aW9uXG4gICAgLy8gYmVjYXVzZSB0aGUgVVJMIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgcGFyYW1ldGVyIHRoYXQgZ2V0cyByZXNvbHZlZCBhZ2FpbnN0IHRoZSBlbnZpcm9ubWVudCBiYXNlIFVSTC5cbiAgICBjb25zdCBoYXNFbnZpcm9ubWVudCA9IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT0gbnVsbFxuICAgICAgJiYgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSAhPT0gJydcbiAgICAgICYmIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICdub25lJztcblxuICAgIGlmICghaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIFVSTCBtYXRjaGVzIGh0dHAgb3IgaHR0cHMgcGF0dGVyblxuICAgICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgICBpZiAoIXVybFBhdHRlcm4udGVzdCh1cmxWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy51cmxFcnJvciA9ICdVUkwgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbjogdHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKHVybFZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLnVybEVycm9yID0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgVVJMIGlzIHZhbGlkIChmb3IgYnV0dG9uIGRpc2FibGVkIHN0YXRlKVxuICAgKi9cbiAgZ2V0IGlzVXJsVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXJsVmFsdWUgPSB0aGlzLnVybD8udHJpbSgpIHx8ICcnO1xuICAgIFxuICAgIC8vIEVtcHR5IFVSTCBpcyBpbnZhbGlkXG4gICAgaWYgKCF1cmxWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBQYXJhbWV0ZXIgcGxhY2Vob2xkZXIgaXMgdmFsaWRcbiAgICBjb25zdCBpc1BhcmFtZXRlclBsYWNlaG9sZGVyID0gL15AXFx8W158XStcXHwkLy50ZXN0KHVybFZhbHVlKTtcbiAgICBpZiAoaXNQYXJhbWV0ZXJQbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCwgc2tpcCB0aGUgaHR0cC9odHRwcyB2YWxpZGF0aW9uXG4gICAgY29uc3QgaGFzRW52aXJvbm1lbnQgPSB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9IG51bGxcbiAgICAgICYmIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICcnXG4gICAgICAmJiB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9PSAnbm9uZSc7XG5cbiAgICBpZiAoaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE11c3QgbWF0Y2ggaHR0cC9odHRwcyBwYXR0ZXJuXG4gICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgaWYgKCF1cmxQYXR0ZXJuLnRlc3QodXJsVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsVmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25TZW5kUmVxdWVzdCgpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBVUkwgYmVmb3JlIHNlbmRpbmcgcmVxdWVzdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVVybCgpKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQgIT0gbnVsbCA/IFN0cmluZyh0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQpIDogJyc7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpIDogJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ZXAxID0gdGhpcy5nZXRDcmVhdGVQYXlsb2FkKCkuc3RlcDE7XG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgICBlbnZpcm9ubWVudDogc3RlcDEuZW52aXJvbm1lbnQgPz8gZW52aXJvbm1lbnQsXG4gICAgICAgIG1ldGhvZDogc3RlcDEubWV0aG9kID8/IG1ldGhvZCxcbiAgICAgICAgdXJsOiBzdGVwMS51cmwgPz8gKHRoaXMudXJsID8/ICcnKSxcbiAgICAgICAgaGVhZGVyczogc3RlcDEuaGVhZGVycyA/PyB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlOiBzdGVwMS5hdXRoVHlwZSxcbiAgICAgICAgYmVhcmVyVG9rZW46IHN0ZXAxLmJlYXJlclRva2VuLFxuICAgICAgICBvYXV0aDI6IHN0ZXAxLm9hdXRoMixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHN0ZXAxLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiBzdGVwMS5wYXlsb2FkRm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogc3RlcDEucGF5bG9hZFRleHQsXG4gICAgICAgIGtleVZhbHVlUm93czogc3RlcDEua2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzOiBzdGVwMS5rZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgICBwYXJhbXNSb3dzOiBzdGVwMS5wYXJhbXNSb3dzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlOiB0aGlzLnNlbGVjdGVkQXV0aFR5cGUsXG4gICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmJlYXJlclRva2VuID8/ICcnLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWUgPz8gJycsXG4gICAgICAgIHBheWxvYWRUZXh0OiB0aGlzLnBheWxvYWRUZXh0ID8/ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgVVJMIG9uIHN0ZXAgMVxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAxKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVVcmwoKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZSBuYW1lIG9uIHN0ZXAgMlxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAyICYmICF0aGlzLnZhcmlhYmxlTmFtZT8udHJpbSgpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJ1ZhcmlhYmxlIE5hbWUgaXMgcmVxdWlyZWQuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgdGhpcy5zdGVwTGFiZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXh0LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQYXlsb2FkVGFiKHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IHZhbHVlO1xuICB9XG5cbiAgc2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9IHZhbHVlO1xuICB9XG5cbiAgYWRkSGVhZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7IG5hbWU6IFsnJ10sIHZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUhlYWRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgYWRkcyBhIGN1c3RvbSBoZWFkZXIgbmFtZSB2aWEgdGhlIGRyb3Bkb3duIFwiQWRkICfigKYnXCIgb3B0aW9uLCBzZXQgdGhlIGNvbnRyb2wgdmFsdWUuICovXG4gIG9uSGVhZGVyTmFtZUFkZEN1c3RvbVZhbHVlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0sIHJvdzogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHJvdy5nZXQoZXZlbnQua2V5KTtcbiAgICBpZiAoY29udHJvbCAmJiBldmVudC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGV2ZW50LnZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUhlYWRlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRLZXlWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlS2V5VmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVZhbHVlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVR5cGVWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFsnJ10sIHR5cGU6IFsndGV4dCddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlUeXBlVmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlLZXlUeXBlVmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkUGFyYW1zUm93KCk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlUGFyYW1zUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5UGFyYW1zKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZFZlcmlmaWNhdGlvblJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbJyddLFxuICAgICAgICB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKV0sXG4gICAgICAgIGRhdGFUeXBlOiBbdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFsnJ10sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVWZXJpZmljYXRpb25Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlWZXJpZmljYXRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIFdoZW4gRGF0YSBUeXBlIGNoYW5nZXMgaW4gUmVzcG9uc2UgQm9keSB2ZXJpZmljYXRpb24sIHJlc2V0IEV4cGVjdGVkIFZhbHVlIGZvciB0aGF0IHJvdy4gKi9cbiAgb25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3c6IEZvcm1Hcm91cCwgZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnZGF0YVR5cGUnKSB7XG4gICAgICByb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgdmVyaWZpY2F0aW9uOiBbdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCldLCBleHBlY3RlZFZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gY2hhbmdlcyBhbmQga2VlcCBib3RoIGRhdGEgYW5kIGZvcm0gaW4gc3luYy5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub24tYm9vbGVhbiBhZHZhbmNlZCB2YWx1ZXMgKGtlcHQgZm9yIEFQSSBjb21wYXRpYmlsaXR5OyBjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXQgYWxsIGVudGVyZWQgZGV0YWlscyAoZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHksIHN0ZXAyIHZhcmlhYmxlLCBzdGVwMyB2ZXJpZmljYXRpb25zKSB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZS4gKi9cbiAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJzk5OTk5OTknKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZCgpO1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgcGF5bG9hZCcsIHBheWxvYWQpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdChwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwaUVkaXRTdGVwIGdldENyZWF0ZVBheWxvYWQgZXJyb3I6JywgZXJyKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQodGhpcy5nZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1pbmltYWwgcGF5bG9hZCB3aGVuIGdldENyZWF0ZVBheWxvYWQgdGhyb3dzIChzbyBjcmVhdGUgYWx3YXlzIGVtaXRzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgc3VtbWFyeTogdGhpcy5zdW1tYXJ5Py50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgICBlbnZpcm9ubWVudDogJycsXG4gICAgICAgIG1ldGhvZDogJycsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IFtdLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgLi4uKGJlYXJlclRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBiZWFyZXJUb2tlbiB9KSxcbiAgICAgICAgLi4uKG9hdXRoMiAhPT0gdW5kZWZpbmVkICYmIHsgb2F1dGgyIH0pLFxuICAgICAgICBhY3RpdmVQYXlsb2FkVGFiOiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIsXG4gICAgICAgIHBheWxvYWRUeXBlOiB0aGlzLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiAnJyxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93czogW10sXG4gICAgICAgIGtleVR5cGVWYWx1ZVJvd3M6IFtdLFxuICAgICAgICBwYXJhbXNSb3dzOiBbXSxcbiAgICAgIH0sXG4gICAgICBzdGVwMjogeyB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnIH0sXG4gICAgICBzdGVwMzoge1xuICAgICAgICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYixcbiAgICAgICAgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uczogW10sXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2wgdmFsdWUgdG8gc3RyaW5nIChoYW5kbGVzIG9iamVjdCBvciBzdHJpbmcpLiAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRDb250cm9sVmFsdWUoY29udHJvbDogeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IGNvbnRyb2w/LnZhbHVlO1xuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpIDogU3RyaW5nKHYpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZ1bGwgY3JlYXRlIHBheWxvYWQ6IGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5IChzdGVwMSksIHZhcmlhYmxlIG5hbWUgKHN0ZXAyKSwgdmVyaWZpY2F0aW9ucyAoc3RlcDMpLiAqL1xuICBwcml2YXRlIGdldENyZWF0ZVBheWxvYWQoKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGVudkZyb21Gb3JtID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50JykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPVxuICAgICAgZW52RnJvbUZvcm0gIT09ICcnID8gZW52RnJvbUZvcm0gOiAodGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlIDogdGhpcy5zZWxlY3RlZEVudmlyb25tZW50KTtcbiAgICBjb25zdCBtZXRob2RGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm1ldGhvZEZvcm0/LmdldCgnbWV0aG9kJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgbWV0aG9kID1cbiAgICAgIG1ldGhvZEZyb21Gb3JtICE9PSAnJyA/IG1ldGhvZEZyb21Gb3JtIDogKHRoaXMuY3VycmVudE1ldGhvZFZhbHVlICE9PSAnJyA/IHRoaXMuY3VycmVudE1ldGhvZFZhbHVlIDogdGhpcy5zZWxlY3RlZE1ldGhvZCk7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3Qga2V5VmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVZhbHVlUm93cyA9IChrZXlWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZUZvcm1BcnJheSA9IHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZVJvd3MgPSAoa2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3R5cGUnKT8udmFsdWUgPz8gJ3RleHQnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1zRm9ybUFycmF5ID0gdGhpcy5wYXJhbXNGb3JtQXJyYXk7XG4gICAgY29uc3QgcGFyYW1zUm93cyA9IChwYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCB2ZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheTtcbiAgICBjb25zdCByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zID0gKHZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGpzb25QYXRoOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnanNvblBhdGgnKT8udmFsdWUgPz8gJycsXG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBkYXRhVHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbnMgPSAoc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAgdmVyaWZpY2F0aW9uOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgc3VtbWFyeTogdGhpcy5zdW1tYXJ5Py50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAuLi4oYmVhcmVyVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGJlYXJlclRva2VuIH0pLFxuICAgICAgICAuLi4ob2F1dGgyICE9PSB1bmRlZmluZWQgJiYgeyBvYXV0aDIgfSksXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93cyxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93cyxcbiAgICAgICAgcGFyYW1zUm93cyxcbiAgICAgIH0sXG4gICAgICBzdGVwMjoge1xuICAgICAgICB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaGVhZGVyIHJvd3MgZnJvbSBmb3JtIChmb3IgY29uc3VtZXJzIHRoYXQgcmVhZCBoZWFkZXJzKSAqL1xuICBnZXQgaGVhZGVycygpOiBBcGlFZGl0SGVhZGVyUm93W10ge1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5KSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scy5tYXAoKGMpID0+ICh7XG4gICAgICBuYW1lOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxNZXRob2QnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5tZXRob2RGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaHR0cE1ldGhvZE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLm1ldGhvZEZvcm0gJiYgdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gZmlyc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuZW52aXJvbm1lbnRGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnRGb3JtICYmIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZW52aXJvbm1lbnRGb3JtLmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RW52aXJvbm1lbnRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsQXV0aFR5cGUnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsQXV0aFR5cGUnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZCA9XG4gICAgICAgIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpO1xuICAgICAgaWYgKHJlc29sdmVkICE9IG51bGwpIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2F1dGhUeXBlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUF1dGhUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpO1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5hdXRoVHlwZUZvcm0uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsID1cbiAgICAgICAgICAgIGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50ICE9PSAnJ1xuICAgICAgICAgICAgICA/IHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoY3VycmVudCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKGN1cnJlbnQpXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBjb25zdCB2YWxpZCA9IGN1cnJlbnRWYWwgIT0gbnVsbCAmJiB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudFZhbCk7XG4gICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXSkge1xuICAgICAgdGhpcy5hcHBseUluaXRpYWxTdGVwKGNoYW5nZXNbJ2luaXRpYWxTdGVwJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxVcmwnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXJsID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZGVjb2RlVXJsRm9yRGlzcGxheShjaGFuZ2VzWydpbml0aWFsVXJsJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSBjaGFuZ2VzWydpbml0aWFsUGF5bG9hZFRhYiddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlYWRlck5hbWVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KGNoYW5nZXNbJ2luaXRpYWxIZWFkZXJzJ10uY3VycmVudFZhbHVlIGFzIEFwaUVkaXRIZWFkZXJSb3dbXSk7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5IGluaXRpYWxSZXNwb25zZVByZXZpZXcnLCB0aGlzLmluaXRpYWxSZXNwb25zZVByZXZpZXcpO1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXcgPSBjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gV2hlbiBhIG5ldyByZXNwb25zZSBwcmV2aWV3IGlzIHByb3ZpZGVkIChhZnRlciBTZW5kIFJlcXVlc3QpLCBzY3JvbGwgcHJldmlldyBzZWN0aW9uIGludG8gdmlld1xuICAgICAgdGhpcy5zY3JvbGxQcmV2aWV3SW50b1ZpZXcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkge1xuICAgICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBjaGFuZ2VzWydpbml0aWFsRm9ybWF0J10uY3VycmVudFZhbHVlIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFZhcmlhYmxlTmFtZSddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWUgPSBjaGFuZ2VzWydpbml0aWFsVmFyaWFibGVOYW1lJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFN1bW1hcnknXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VtbWFyeSA9IGNoYW5nZXNbJ2luaXRpYWxTdW1tYXJ5J10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZm9ybWF0T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2ZXJpZmljYXRpb25PcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldERhdGFUeXBlVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0RGF0YVR5cGUgPSB0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpO1xuICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IGRhdGFUeXBlOiBkZWZhdWx0RGF0YVR5cGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3N0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbW9vdGhseSBzY3JvbGxzIHRoZSByZXNwb25zZSBwcmV2aWV3IHNlY3Rpb24gaW50byB2aWV3IHdpdGhpbiB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIuXG4gICAqIENhbGxlZCB3aGVuIGEgZnJlc2ggcmVzcG9uc2UgcHJldmlldyB2YWx1ZSBpcyBzZXQgZnJvbSB0aGUgcGFyZW50IChBUEkgYnVpbGRlcikuXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbFByZXZpZXdJbnRvVmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzcG9uc2VQcmV2aWV3UmVmIHx8ICF0aGlzLnJlc3BvbnNlUHJldmlld1JlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIGJsb2NrOiAnc3RhcnQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgYWRqdXN0IGNsb3Nlc3Qgc2Nyb2xsYWJsZSBwYXJlbnQgaWYgbmVlZGVkXG4gICAgICBjb25zdCBlbCA9IHRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBzY3JvbGxQYXJlbnQgPSBlbC5jbG9zZXN0KCcuY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSBlbC5vZmZzZXRUb3AgLSAxNjsgLy8gc21hbGwgcGFkZGluZ1xuICAgICAgICBzY3JvbGxQYXJlbnQuc2Nyb2xsVG8oeyB0b3A6IG9mZnNldFRvcCA8IDAgPyAwIDogb2Zmc2V0VG9wLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyIGNxYS1iZy1bI2ZmZmZmZl0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtcC1bMTZweF0gY3FhLWdhcC1bMTJweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLWJveC1ib3JkZXJcIj5cblxuICA8aDIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10aXRsZSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLXRleHQtWyMwMDAwMDBdIGNxYS1tLTBcIj5cbiAgICB7eyBlZGl0TW9kZSA/ICdVcGRhdGUgQVBJIFRlc3QgU3RlcCcgOiAnQ3JlYXRlIEFQSSBUZXN0IFN0ZXAnIH19XG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvciBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMCBjcWEtbWF4LVs3NjdweF06Y3FhLWZsZXgtd3JhcCBjcWEtbWF4LVs3NjdweF06Y3FhLWdhcC0yIGNxYS1tYXgtWzc2N3B4XTpjcWEtanVzdGlmeS1zdGFydFwiXG4gICAgW2NsYXNzLmNxYS1qdXN0aWZ5LXN0YXJ0XT1cInN0ZXBMYWJlbHMubGVuZ3RoID09PSAxXCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktYmV0d2Vlbl09XCJzdGVwTGFiZWxzLmxlbmd0aCAhPT0gMVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcExhYmVsczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbSBjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbS0tY2xpY2thYmxlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMTBweF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1mb250LWluaGVyaXQgY3FhLXRleHQtaW5oZXJpdCBjcWEtdGV4dC1sZWZ0ICFjcWEtYmctdHJhbnNwYXJlbnRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTdGVwICcgKyBzdGVwLmluZGV4ICsgJzogJyArIHN0ZXAubGFiZWxcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXBcIlxuICAgICAgICAoY2xpY2tlZCk9XCJzZXRTdGVwKHN0ZXAuaW5kZXgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWNpcmNsZSBjcWEtdy04IGNxYS1oLTggY3FhLXJvdW5kZWQtZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJvcmRlci1ub25lIGNxYS1zaHJpbmstMFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXAgPyAnY3FhLWJnLVsjNEY0NkU1XSBjcWEtdGV4dC13aGl0ZScgOiAnY3FhLWJnLVsjRTBFMEUwXSBjcWEtdGV4dC1bIzY2NjY2Nl0nXCI+XG4gICAgICAgICAge3sgc3RlcC5pbmRleCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxhYmVsIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLW1heC1bNzY3cHhdOmNxYS10ZXh0LXhzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtdGV4dC1bIzRGNDZFNV0nIDogJ2NxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmxhYmVsIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImkgPCBzdGVwTGFiZWxzLmxlbmd0aCAtIDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1saW5lIGNxYS13LVs5NnB4XSBjcWEtaC1bMnB4XSBjcWEtYmctWyNFMEUwRTBdIGNxYS1teS0wIGNxYS1teC1bNnB4XSBjcWEtc2hyaW5rLTAgY3FhLXNlbGYtY2VudGVyIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1bMjRweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1teC0xXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBjb250ZW50IHZpZXdwb3J0OiBvbmx5IHRoZSBhY3RpdmUgc3RlcCBib2R5IGlzIHNob3duICgqbmdJZikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12aWV3cG9ydCBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBTdGVwIDE6IEVudmlyb25tZW50LCByZXF1ZXN0LCBib2R5LCByZXNwb25zZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFN0ZXAgPT09IDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTYgY3FhLWJveC1ib3JkZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8IS0tIFN1bW1hcnkgZmllbGQ6IGxhYmVsIG9uIHRvcCwgaW5wdXQgYmVsb3cgKGFib3ZlIEVudmlyb25tZW50KSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN1bW1hcnktcm93IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtaXRlbXMtc3RyZXRjaFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN1bW1hcnktbGFiZWwgY3FhLW0tMCBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWxcIj5TdW1tYXJ5PC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbKHZhbHVlKV09XCJzdW1tYXJ5XCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgUmVxdWVzdCBzdW1tYXJ5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgIGFyaWFMYWJlbD1cIlN1bW1hcnlcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEVudmlyb25tZW50IHJvdzogbGFiZWwgb24gdG9wLCBzZWxlY3QgYmVsb3cgKGFsaWduZWQgcmlnaHQgb24gZGVza3RvcCkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1pdGVtcy1lbmQgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtbGFiZWwgY3FhLW0tMCBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWxcIj5FbnZpcm9ubWVudHM8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJlbnZpcm9ubWVudEZvcm1cIlxuICAgICAgICAgICAgW2Zvcm1dPVwiZW52aXJvbm1lbnRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZW52aXJvbm1lbnRTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1zZWxlY3QgY3FhLXNocmluay0wIGNxYS13LWF1dG8gY3FhLW1pbi13LVszMTVweF0gY3FhLW1heC13LVszMTVweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWF4LXctZnVsbCBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBbJl8ubWF0LWZvcm0tZmllbGQtd3JhcHBlcl06Y3FhLXBiLTBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVudmlyb25tZW50XCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBSZXF1ZXN0IHJvdzogbWV0aG9kLCBVUkwsIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXF1ZXN0LXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1heC1bNzY3cHhdOmNxYS1mbGV4LWNvbCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLW1heC1bNzY3cHhdOmNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm1ldGhvZEZvcm1cIiBbZm9ybV09XCJtZXRob2RGb3JtXCIgW2NvbmZpZ109XCJtZXRob2RTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1tZXRob2Qtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMTUycHhdIGNxYS1tYXgtdy1bMTUycHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICBbdmFsdWVdPVwidXJsXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInVybCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInVybE9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidXJsUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFbnRlciBVUkwgb3Igc2VsZWN0IFBhcmFtZXRlclwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25VcmxPcHRpb25TZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVybEVycm9yXCIgY2xhc3M9XCJjcWEtdGV4dC1yZWQtNjAwIGNxYS10ZXh0LXNtIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgIHt7IHVybEVycm9yIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdHJpZ2dlciBjcWEtY29udGVudHMgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOiFjcWEtZmxleFwiIChjbGljayk9XCJvcGVuSW1wb3J0Q3VybFBhbmVsKClcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiSW1wb3J0IEFQSSBjVVJMXCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tb3V0bGluZSAhY3FhLWJnLXdoaXRlICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjNkI3MjgwXSBjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtdHJhY2tpbmctbm9ybWFsIGhvdmVyOiFjcWEtYmctWyNGOUZBRkJdIGhvdmVyOiFjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgY3FhLW10LTFcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIlNlbmQgUmVxdWVzdFwiIChjbGlja2VkKT1cIm9uU2VuZFJlcXVlc3QoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVXJsVmFsaWRcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBjcWEtbXQtMVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7JyFjcWEtb3BhY2l0eS01MCAhY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6ICFpc1VybFZhbGlkfVwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtbm90ZSBjcWEtcHgtNSBjcWEtcHQtM1wiPlxuICAgICAgICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiY1VSTCBpcyBzdXBwb3J0ZWQgaW4gQmFzaCBmb3JtYXQgb25seS5cIiBpY29uPVwiaW5mb1wiIHZhcmlhbnQ9XCJpbmZvXCIgc2l6ZT1cInNtYWxsXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1ib2R5XCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFt2YWx1ZV09XCJpbXBvcnRDdXJsQ29udHJvbC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGFzdGUgeW91ciBjVVJMIGNvbW1hbmQgaGVyZSAoZS5nLiwgY3VybCAtWCBQT1NUIGh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzKVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3Jvd3NdPVwiOFwiIHJlc2l6ZT1cInZlcnRpY2FsXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRleHRhcmVhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLWZvb3RlclwiPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1idG4tY2FuY2VsXCIgKGNsaWNrZWQpPVwib25DYW5jZWxJbXBvcnRDdXJsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkltcG9ydFwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1idG4taW1wb3J0XCIgKGNsaWNrZWQpPVwib25JbXBvcnRDdXJsQ29uZmlybSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJib2R5VmlldyA9PT0gJ2hlYWRlcnMnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnMtd3JhcHBlciBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFic1wiPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHBheWxvYWRUYWJzXCIgdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW3RleHRdPVwidGFiLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLXRhYicgKyAoYWN0aXZlUGF5bG9hZFRhYiA9PT0gdGFiLnZhbHVlID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWFjdGl2ZScgOiAnJykgKyAoaXNNZXRob2RXaXRob3V0Qm9keSAmJiAodGFiLnZhbHVlID09PSAnYm9keScgfHwgdGFiLnZhbHVlID09PSAncGFyYW1zJykgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tZGlzYWJsZWQnIDogJycpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNZXRob2RXaXRob3V0Qm9keSAmJiAodGFiLnZhbHVlID09PSAnYm9keScgfHwgdGFiLnZhbHVlID09PSAncGFyYW1zJylcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFBheWxvYWRUYWIodGFiLnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKEF1dGhvcml6YXRpb24pIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdhdXRob3JpemF0aW9uJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidwYWRkaW5nOiAyMHB4OyBtaW4taGVpZ2h0OiAyMDBweDsnXCI+XG4gICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMjBweDsnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7IHdpZHRoOiBmaXQtY29udGVudDsnXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXdlaWdodDogNjAwOyBsZXR0ZXItc3BhY2luZzogMC4wMmVtOyBjb2xvcjogIzZCNzI4MDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkFVVEggVFlQRTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJhdXRoVHlwZUZvcm1cIiBbZm9ybV09XCJhdXRoVHlwZUZvcm1cIiBbY29uZmlnXT1cImF1dGhUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLXR5cGUtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIkF1dGggdHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDE2MHB4OydcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gTm8gQXV0aDogY2VudGVyZWQgbWVzc2FnZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRBdXRoVHlwZSA9PT0gJ25vLWF1dGgnXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxMnB4OyBtaW4td2lkdGg6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyOiAxcHggc29saWQgI0U1RTdFQjsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nLXRvcDogMTZweDsgcGFkZGluZy1ib3R0b206IDE2cHg7J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogI0YzRjRGNjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIxMVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCIgZmlsbD1cIiM5Q0EzQUZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPk5vIEF1dGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiA2cHg7IGZsZXgtd3JhcDogd3JhcDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiAjOUNBM0FGOyBsaW5lLWhlaWdodDogMS40OydcIj5UaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJNb3JlIGluZm9ybWF0aW9uXCIgdGl0bGU9XCJUaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICM5Q0EzQUY7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA3djRNOCA1di41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gQmVhcmVyIFRva2VuOiBUb2tlbiBsYWJlbCArIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnYmVhcmVyJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMHB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5Ub2tlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFsodmFsdWUpXT1cImJlYXJlclRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBiZWFyZXIgdG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI2XCIgcmVzaXplPVwidmVydGljYWxcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdG9rZW4tdGV4dGFyZWFcIiBhcmlhTGFiZWw9XCJCZWFyZXIgdG9rZW5cIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE9BdXRoIDIuMDogR3JhbnQgVHlwZSwgQWNjZXNzIFRva2VuIFVSTCwgQ2xpZW50IElELCBDbGllbnQgU2VjcmV0LCBTY29wZSwgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiBvYXV0aDJGb3JtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtb2F1dGgyLWdyaWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxNnB4IDI0cHg7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkdyYW50IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJvYXV0aDJGb3JtXCIgW2Zvcm1dPVwib2F1dGgyRm9ybVwiIFtjb25maWddPVwib2F1dGgyR3JhbnRUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIk9BdXRoIGdyYW50IHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGdyYW50IHR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkFjY2VzcyBUb2tlbiBVUkw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCB0b2tlbiBlbmRwb2ludFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWNjZXNzIFRva2VuIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIHRva2VuIGVuZHBvaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgaWRlbnRpZmllclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQ2xpZW50IElEXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IGlkZW50aWZpZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBTZWNyZXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIGNsaWVudCBzZWNyZXRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBTZWNyZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBjbGllbnQgc2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5TY29wZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHNwYWNlLXNlcGFyYXRlZCBzY29wZXNcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNjb3BlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+U3BhY2Utc2VwYXJhdGVkIHNjb3Blczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IEF1dGhlbnRpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC1vYXV0aC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQ2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+Q2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoSGVhZGVycykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2hlYWRlcnMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBoZWFkZXJSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SGVhZGVyXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJoZWFkZXJOYW1lU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkhlYWRlck5hbWVBZGRDdXN0b21WYWx1ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJIZWFkZXIgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIGhlYWRlcidcIiAoY2xpY2tlZCk9XCJyZW1vdmVIZWFkZXIoaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWRkLWhlYWRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIisgQWRkIEhlYWRlclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItbGluaydcIiAoY2xpY2tlZCk9XCJhZGRIZWFkZXIoKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKFBhcmFtcyk6IEtleeKAk1ZhbHVlIHRhYmxlIHdpdGggYWRkL2RlbGV0ZSByb3dzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdwYXJhbXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBwYXJhbXNSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5UGFyYW1zXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJLZXlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlUGFyYW1zUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIisgQWRkIFJvd1wiXG4gICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkUGFyYW1zUm93KClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChCb2R5IG9ubHkpOiB0eXBlLCBmb3JtYXQsIHRleHQgYXJlYSwgQmFjay9OZXh0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5J1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZCBjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgW3ZhbHVlXT1cInBheWxvYWRUeXBlXCIgW3NlZ21lbnRzXT1cInBheWxvYWRUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXlsb2FkVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ3JhdydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1mb3JtYXQtbGFiZWxcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cInBheWxvYWRGb3JtYXRGb3JtXCIgW2Zvcm1dPVwicGF5bG9hZEZvcm1hdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBheWxvYWRGb3JtYXRTZWxlY3RDb25maWdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb3JtYXRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBSYXc6IHRleHQgYXJlYSB3aXRoIGxpbmUgbnVtYmVycyAoUG9zdG1hbi1zdHlsZSBwYXlsb2FkIGJvZHkpIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWJvZHlcIiAjcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3Itd2l0aC1saW5lc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBuIG9mIHBheWxvYWRMaW5lTnVtYmVyc1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bG9hZEpzb25FcnJvciAmJiBwYXlsb2FkSnNvbkVycm9yLmxpbmUgPT09IG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtZXJyb3ItaWNvblwiIFt0aXRsZV09XCJwYXlsb2FkSnNvbkVycm9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFyc2UgZXJyb3Igb24gdGhpcyBsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIGZpbGw9XCIjRUY0NDQ0XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNGw2IDZNMTAgNGwtNiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bS10ZXh0XCI+e3sgbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgI3BheWxvYWRUZXh0YXJlYVJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0IGNxYS13LWZ1bGwgY3FhLW91dGxpbmUtbm9uZSBjcWEtYm94LWJvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtaW5wdXQtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBheWxvYWRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BheWxvYWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXBheWxvYWRKc29uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUGF5bG9hZElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QYXlsb2FkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInBheWxvYWRKc29uRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtanNvbi1lcnJvci1tc2dcIj5cbiAgICAgICAgICAgICAgICAgIEludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0geC13d3ctZm9ybS11cmxlbmNvZGVkOiBLZXnigJNWYWx1ZSByb3dzLCBhZGQvcmVtb3ZlIGR5bmFtaWNhbGx5IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VmFsdWVSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5S2V5VmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIktleVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlS2V5VmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEZvcm0gRGF0YTogS2V54oCTVHlwZeKAk1ZhbHVlIHJvd3M7IFR5cGUgaXMgYSBkcm9wZG93biAoVGV4dC9GaWxlKSwgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAnZm9ybS1kYXRhJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VHlwZVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVR5cGVWYWx1ZVwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwia2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC1idG5cIiAoY2xpY2tlZCk9XCJhZGRLZXlUeXBlVmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFkdmFuY2VkIHNldHRpbmdzIChzdGVwLWxldmVsKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tdC00XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMlwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMzogUmVzcG9uc2UgQm9keSAvIFN0YXR1cyB0YWJzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gM1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gdGFiLnZhbHVlID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWFjdGl2ZScgOiAnJylcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJlc3BvbnNlIEJvZHkgdGFiIGNvbnRlbnQ6IHZlcmlmaWNhdGlvbiBncmlkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3Jlc3BvbnNlLWJvZHknXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3cgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtY2VudGVyIGNxYS1wdC0wIGNxYS1wci0wIGNxYS1wYi0yIGNxYS1wbC0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5KU09OIFBhdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5EYXRhIFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiB2ZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmVyaWZpY2F0aW9uXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSnNvbiBQYXRoXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiSlNPTiBQYXRoXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWU6IHRleHQgZm9yIFN0cmluZy9BcnJheS9PYmplY3QsIG51bWJlciBmb3IgTnVtYmVyLCBkcm9wZG93biBmb3IgQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCIgW2Zvcm1dPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSAobnVtYmVyKVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaERlZmF1bHQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBTdHJpbmdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN0YXR1cyB0YWIgY29udGVudDogUy5ubywgVmVyaWZpY2F0aW9uIGRyb3Bkb3duLCBFeHBlY3RlZCBWYWx1ZSwgYWRkL3JlbW92ZSByb3dzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3N0YXR1cydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvdyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTAgY3FhLXByLTAgY3FhLXBiLTIgY3FhLXBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN0YXR1c1ZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGF0dXNWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicm93XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSZXNwb25zZSBQcmV2aWV3IC0tPlxuICA8ZGl2ICNyZXNwb25zZVByZXZpZXdSZWYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZVwiPlxuICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLXRpdGxlIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1ib2xkIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtbWItWzEycHhdIGNxYS1zaHJpbmstMFwiPlJlc3BvbnNlIFByZXZpZXc8L2gzPlxuICAgIDxwcmUgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS1jb250ZW50XCI+e3sgcmVzcG9uc2VQcmV2aWV3IH19PC9wcmU+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBhY3Rpb25zOiBvbmUgcm93LCBmdWxsIHdpZHRoLiBTdGVwIDE6IENhbmNlbCArIE5leHQ7IFN0ZXAgMjogQmFjayArIE5leHQ7IFN0ZXAgMzogQmFjayArIENyZWF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnNcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjdXJyZW50U3RlcFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jYW5jZWxcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIyXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjNcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCJlZGl0TW9kZSA/ICdVcGRhdGUnIDogJ0NyZWF0ZSdcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tY3JlYXRlXCIgKGNsaWNrZWQpPVwib25DcmVhdGUoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDwhLS0gTWF0Y2ggY3FhLWJ1dHRvbiBmbGV4OiBhY3Rpb25zIHJvdyBzdHlsZXMgPiBjcWEtYnV0dG9uIHsgZmxleDogMSAxIDAgfSDigJQgbG9hZGVyIGRpdiBtdXN0IGdyb3cgc2FtZSB3aWR0aCBhcyBDcmVhdGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1sb2FkZXIgY3FhLXctZnVsbCBjcWEtbWluLWgtWzM4cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyB3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
2610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFNaEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFVBQVUsRUFBRSxZQUFZO0NBQ2hCLENBQUM7QUF3SFgsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFdkQsOEVBQThFO0FBQzlFLE1BQU0sd0JBQXdCLEdBQTJCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBWXBHLFNBQVMsYUFBYSxDQUFDLEVBQVU7SUFDL0IsT0FBTyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFRLElBQUksRUFBRSxLQUFLLFFBQVEsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsRUFBVTtJQUMvQixPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUks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a0I7c0JBQTFCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQXVESSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBR0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU07Z0JBTUUsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQXlSRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBaUtrQyx5QkFBeUI7c0JBQWhFLFNBQVM7dUJBQUMsMkJBQTJCO2dCQUNMLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBK0N0QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBc0dHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkE4Q0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQWdFRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBOEM4QyxrQkFBa0I7c0JBQXJFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQVd6Qyx5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi4vLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uLCBHcmFwaFFMU2NoZW1hU291cmNlIH0gZnJvbSAnLi9ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXIvZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBBUElfRURJVF9TVEVQX0xBQkVMUyA9IHtcbiAgUkVRVUVTVF9ERVRBSUxTOiAnUmVxdWVzdCBEZXRhaWxzJyxcbiAgU1RPUkVfUkVTUE9OU0U6ICdTdG9yZSBSZXNwb25zZScsXG4gIFZBTElEQVRJT046ICdWYWxpZGF0aW9uJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFwaUVkaXRQYXlsb2FkVGFiID0gJ2hlYWRlcnMnIHwgJ2JvZHknIHwgJ3BhcmFtcycgfCAnYXV0aG9yaXphdGlvbicgfCAnZ3JhcGhxbCc7XG5cbi8qKiBUb3AtbGV2ZWwgQVBJIHR5cGUgdGhlIHN0ZXAgdGFyZ2V0cy4gTmV3IHR5cGVzIGJleW9uZCBSRVNUL0dyYXBoUUwgYXJlIGludGVudGlvbmFsbHkgYSBzdHJpbmcgdW5pb24gKG5vdCBlbnVtKSBzbyBhZGRpbmcgXCJzb2FwXCIvXCJ3ZWJzb2NrZXRcIi9cImdycGNcIiBsYXRlciBpcyBhIG9uZS1saW5lIGNoYW5nZS4gKi9cbmV4cG9ydCB0eXBlIEFwaUVkaXRBcGlUeXBlID0gJ3Jlc3QnIHwgJ2dyYXBocWwnIHwgJ3NvYXAnIHwgJ3dlYnNvY2tldCcgfCAnZ3JwYyc7XG5cbi8qKiBHcmFwaFFMIHJlcXVlc3QgYm9keSBlbWl0dGVkIHRvIHRoZSBwYXJlbnQgKHZhcmlhYmxlcyBhbHJlYWR5IHBhcnNlZCB3aGVuIHZhbGlkIEpTT047IHJhdyBzdHJpbmcgb3RoZXJ3aXNlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdEdyYXBoUUxQYXlsb2FkIHtcbiAgcXVlcnk6IHN0cmluZztcbiAgLyoqIE9iamVjdCB3aGVuIHRoZSB1c2VyIHR5cGVkIHZhbGlkIEpTT04sIHJhdyBzdHJpbmcgb3RoZXJ3aXNlLiBFbmdpbmUgYWNjZXB0cyBib3RoLiAqL1xuICB2YXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHN0cmluZztcbiAgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcbn1cblxuLyoqIFdoaWNoIGJvZHkgY29udGVudCBibG9jayBpcyB2aXNpYmxlOiBoZWFkZXJzICh0YWJzKSwgaW1wb3J0IGNVUkwgdGV4dGFyZWEsIG9yIHRoZSBHcmFwaFFMIG9wZXJhdGlvbiBwaWNrZXIuICovXG5leHBvcnQgdHlwZSBBcGlFZGl0Qm9keVZpZXcgPSAnaGVhZGVycycgfCAnaW1wb3J0LWN1cmwnIHwgJ2dyYXBocWwtc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0SGVhZGVyUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBQYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QgKGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgaGVhZGVycywgYm9keSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgcGF5bG9hZD86IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgcGF5bG9hZFR5cGU/OiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ/OiBzdHJpbmc7XG4gIHBheWxvYWRUZXh0Pzogc3RyaW5nO1xuICBrZXlWYWx1ZVJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93cz86IHsga2V5OiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIHBhcmFtc1Jvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgLyoqIEFQSSB0eXBlIChSRVNUIG9yIEdyYXBoUUwpLiBBYnNlbnQgb24gbGVnYWN5IGNhbGxlcnM7IGNvbnN1bWVyIHRyZWF0cyB1bmRlZmluZWQgYXMgJ3Jlc3QnLiAqL1xuICBhcGlUeXBlPzogQXBpRWRpdEFwaVR5cGU7XG4gIC8qKiBHcmFwaFFMIGJvZHkgd2hlbiBgYXBpVHlwZSA9PT0gJ2dyYXBocWwnYC4gKi9cbiAgZ3JhcGhRTD86IEFwaUVkaXRHcmFwaFFMUGF5bG9hZDtcbn1cblxuLyoqIE9BdXRoIDIuMCBhdXRoIGZpZWxkcyAod2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdE9BdXRoMlBheWxvYWQge1xuICBncmFudFR5cGU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW5Vcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIHN1bW1hcnk/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICAvKiogU2VsZWN0ZWQgYXV0aCB0eXBlOiBlLmcuICduby1hdXRoJywgJ2JlYXJlcicsICdvYXV0aDInLiAqL1xuICBhdXRoVHlwZTogc3RyaW5nO1xuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIHdoZW4gYXV0aFR5cGUgaXMgJ2JlYXJlcicuICovXG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICAvKiogT0F1dGggMi4wIGZpZWxkcyB3aGVuIGF1dGhUeXBlIGlzICdvYXV0aDInLiAqL1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWI7XG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ6IHN0cmluZztcbiAgcGF5bG9hZFRleHQ6IHN0cmluZztcbiAga2V5VmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIC8qKiBBUEkgdHlwZSAoUkVTVCBvciBHcmFwaFFMKS4gRGVmYXVsdHMgdG8gJ3Jlc3QnIHdoZW4gYWJzZW50LiAqL1xuICBhcGlUeXBlPzogQXBpRWRpdEFwaVR5cGU7XG4gIC8qKiBHcmFwaFFMIGJvZHkgd2hlbiBgYXBpVHlwZSA9PT0gJ2dyYXBocWwnYC4gQWx3YXlzIGVtaXR0ZWQgYXMgYSBjb21wbGV0ZSBvYmplY3Qgc28gdGhlIGVuZ2luZSdzIE9iamVjdC5hc3NpZ24gbWVyZ2UgZG9lc24ndCBsb3NlIHVuc2VudCBrZXlzLiAqL1xuICBncmFwaFFMPzogQXBpRWRpdEdyYXBoUUxQYXlsb2FkO1xufVxuXG4vKiogU3RlcCAyIHN0b3JlLXJlc3BvbnNlIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwMlBheWxvYWQge1xuICB2YXJpYWJsZU5hbWU6IHN0cmluZztcbn1cblxuLyoqIFJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvdyB7XG4gIGpzb25QYXRoOiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBkYXRhVHlwZTogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGF0dXMgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvdyB7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDMgdmFsaWRhdGlvbiBwYXlsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RlcDNQYXlsb2FkIHtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnO1xuICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zOiBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93W107XG4gIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IEFwaUVkaXRTdGF0dXNWZXJpZmljYXRpb25Sb3dbXTtcbn1cblxuLyoqIEZ1bGwgcGF5bG9hZCBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIChhbGwgc3RlcHPigJkgZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgc3RlcDE6IEFwaUVkaXRTdGVwMVBheWxvYWQ7XG4gIHN0ZXAyOiBBcGlFZGl0U3RlcDJQYXlsb2FkO1xuICBzdGVwMzogQXBpRWRpdFN0ZXAzUGF5bG9hZDtcbiAgLyoqIEFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBmb3IgdGhpcyBBUEkgc3RlcCAoZS5nLiBpc1N0ZXBPcHRpb25hbCwgc2hvdWxkU2tpcCkuICovXG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuLyoqIEVudmlyb25tZW50IG9wdGlvbjogZWl0aGVyIGEgc3RyaW5nIChkaXNwbGF5ID0gdmFsdWUpIG9yIGFuIG9iamVjdCB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudE9wdGlvbklucHV0ID0gc3RyaW5nIHwgU2VsZWN0T3B0aW9uO1xuXG5jb25zdCBNRVRIT0RTX1dJVEhPVVRfQk9EWSA9IFsnR0VUJywgJ0hFQUQnLCAnREVMRVRFJ107XG5cbi8qKiBBdXRvLWNsb3NlIHBhaXJzIGZvciBwYXlsb2FkIEpTT04gZWRpdG9yOiBvcGVuaW5nIGNoYXIgLT4gY2xvc2luZyBjaGFyLiAqL1xuY29uc3QgUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneyc6ICd9JywgJ1snOiAnXScsICdcIic6ICdcIicsIFwiJ1wiOiBcIidcIiB9O1xuXG4vKiogUmVzdWx0IG9mIHBhcnNpbmcgYSBjVVJMIGNvbW1hbmQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEN1cmwge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgYm9keTogc3RyaW5nO1xuICAvKiogRW50cmllcyBmcm9tIC1GIC8gLS1mb3JtIGZsYWdzIChtdWx0aXBhcnQvZm9ybS1kYXRhKS4gKi9cbiAgZm9ybURhdGE6IHsga2V5OiBzdHJpbmc7IHR5cGU6ICd0ZXh0JyB8ICdmaWxlJzsgdmFsdWU6IHN0cmluZyB9W107XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09IFwiJ1wiIHx8IGNoID09PSAnXFx1MjAxOCcgfHwgY2ggPT09ICdcXHUyMDE5Jztcbn1cbmZ1bmN0aW9uIGlzRG91YmxlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXHUyMDFDJyB8fCBjaCA9PT0gJ1xcdTIwMUQnO1xufVxuZnVuY3Rpb24gaXNDbG9zaW5nUXVvdGUoY2g6IHN0cmluZywgb3BlblF1b3RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzU2luZ2xlUXVvdGUob3BlblF1b3RlKSkgcmV0dXJuIGlzU2luZ2xlUXVvdGUoY2gpO1xuICBpZiAoaXNEb3VibGVRdW90ZShvcGVuUXVvdGUpKSByZXR1cm4gaXNEb3VibGVRdW90ZShjaCk7XG4gIHJldHVybiBjaCA9PT0gb3BlblF1b3RlO1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgY1VSTCBjb21tYW5kIHN0cmluZyBpbnRvIGFyZ3VtZW50IHRva2VucywgbWF0Y2hpbmcgYmFzaCBxdW90aW5nIHJ1bGVzOlxuICogIC0gU2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFyZSBGVUxMWSBMSVRFUkFMIOKAlCBiYWNrc2xhc2ggaGFzIG5vIHNwZWNpYWwgbWVhbmluZy5cbiAqICAgIFRoaXMgcHJlc2VydmVzIEpTT04gZXNjYXBlIHNlcXVlbmNlcyAoZS5nLiBcXFwiKSBpbnNpZGUgJy0tZGF0YS1yYXcnIGJvZGllcy5cbiAqICAtIERvdWJsZS1xdW90ZWQgc3RyaW5ncyB0cmVhdCBiYWNrc2xhc2ggYXMgYW4gZXNjYXBlIGNoYXJhY3RlciAoXFxcIiDihpIgXCIpLlxuICogICAgVGhpcyBoYW5kbGVzIFdpbmRvd3MtQ01ELW5vcm1hbGlzZWQgdmFsdWVzIGFuZCBwbGFpbiAtZCBcIntcXFwia1xcXCI6XFxcInZcXFwifVwiIGJvZGllcy5cbiAqIEFsc28gaGFuZGxlcyBzdHJhaWdodCBhbmQgY3VybHkvc21hcnQgcXVvdGUgY2hhcmFjdGVycy5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVDdXJsTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBuID0gbGluZS5sZW5ndGg7XG4gIHdoaWxlIChpIDwgbikge1xuICAgIHdoaWxlIChpIDwgbiAmJiAvXFxzLy50ZXN0KGxpbmVbaV0pKSBpKys7XG4gICAgaWYgKGkgPj0gbikgYnJlYWs7XG4gICAgY29uc3QgY2ggPSBsaW5lW2ldO1xuICAgIGlmIChpc1NpbmdsZVF1b3RlKGNoKSB8fCBpc0RvdWJsZVF1b3RlKGNoKSkge1xuICAgICAgY29uc3QgcXVvdGUgPSBjaDtcbiAgICAgIGNvbnN0IHNpbmdsZVF1b3RlZCA9IGlzU2luZ2xlUXVvdGUoY2gpO1xuICAgICAgaSsrO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICB3aGlsZSAoaSA8IG4gJiYgIWlzQ2xvc2luZ1F1b3RlKGxpbmVbaV0sIHF1b3RlKSkge1xuICAgICAgICBpZiAoIXNpbmdsZVF1b3RlZCAmJiBsaW5lW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgICAgaWYgKGkgPCBuKSB2YWx1ZSArPSBsaW5lW2krK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKz0gbGluZVtpKytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IG4pIGkrKztcbiAgICAgIHRva2Vucy5wdXNoKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgd29yZCA9ICcnO1xuICAgIHdoaWxlIChpIDwgbiAmJiAhL1xccy8udGVzdChsaW5lW2ldKSAmJiAhaXNTaW5nbGVRdW90ZShsaW5lW2ldKSAmJiAhaXNEb3VibGVRdW90ZShsaW5lW2ldKSkge1xuICAgICAgd29yZCArPSBsaW5lW2krK107XG4gICAgfVxuICAgIGlmICh3b3JkKSB0b2tlbnMucHVzaCh3b3JkKTtcbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKiogU3RyaXAgb25lIGxheWVyIG9mIHN1cnJvdW5kaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh1c2VkIGZvciBpbmxpbmUgLS1kYXRhPSB2YWx1ZXMpLiAqL1xuZnVuY3Rpb24gc3RyaXBTdXJyb3VuZGluZ1F1b3RlcyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocy5sZW5ndGggPj0gMiAmJiAoKHMuc3RhcnRzV2l0aChcIidcIikgJiYgcy5lbmRzV2l0aChcIidcIikpIHx8IChzLnN0YXJ0c1dpdGgoJ1wiJykgJiYgcy5lbmRzV2l0aCgnXCInKSkpKSB7XG4gICAgcmV0dXJuIHMuc2xpY2UoMSwgLTEpO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIEZsYWdzIHRoYXQgdGFrZSBvbmUgYXJndW1lbnQgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIGNvbnN1bWVkIGJ1dCBESVNDQVJERUQuXG4gKiBXaXRob3V0IHRoaXMgbGlzdCwgZmxhZ3MgbGlrZSAtLXJlZmVyZXIgb3IgLS1wcm94eSB3b3VsZCBoYXZlIHRoZWlyIFVSTC1saWtlXG4gKiBhcmd1bWVudCBtaXN0YWtlbmx5IGNhcHR1cmVkIGFzIHRoZSByZXF1ZXN0IFVSTCBieSB0aGUgcGF0dGVybiBtYXRjaGVyIGJlbG93LlxuICovXG5jb25zdCBDVVJMX0ZMQUdTX1dJVEhfSUdOT1JFRF9BUkcgPSBuZXcgU2V0KFtcbiAgJy0tcmVmZXJlcicsICctZScsICctLXJlZmVyJyxcbiAgJy0tcHJveHknLCAnLXgnLCAnLS1zb2NrczUnLCAnLS1zb2NrczQnLCAnLS1zb2NrczRhJywgJy0tc29ja3M1LWhvc3RuYW1lJyxcbiAgJy0tdXNlci1hZ2VudCcsICctQScsXG4gICctLWNvb2tpZScsICctYicsXG4gICctLWNvb2tpZS1qYXInLCAnLWMnLFxuICAnLW8nLCAnLS1vdXRwdXQnLFxuICAnLXUnLCAnLS11c2VyJyxcbiAgJy0tY2VydCcsICctLWtleScsICctLWNhY2VydCcsICctLWNhcGF0aCcsXG4gICctLWNvbm5lY3QtdGltZW91dCcsICctLW1heC10aW1lJywgJy1tJyxcbiAgJy0tcmV0cnknLCAnLS1yZXRyeS1kZWxheScsICctLXJldHJ5LW1heC10aW1lJyxcbiAgJy0tbWF4LXJlZGlycycsICctLWludGVyZmFjZScsICctLWRucy1zZXJ2ZXJzJyxcbiAgJy0tcHJveHktdXNlcicsICctLXByb3h5LWhlYWRlcicsXG4gICctLXJlc29sdmUnLCAnLS1saW1pdC1yYXRlJyxcbiAgJy0tdGxzcGFzc3dvcmQnLCAnLS10bHNhdXRodHlwZScsXG4gICctLXVwbG9hZC1maWxlJywgJy1UJyxcbiAgJy0tcmFuZ2UnLCAnLXInLFxuICAnLS1wYXNzJywgJy0tZW5naW5lJyxcbiAgJy0tcGlubmVkcHVia2V5JywgJy0taG9zdHB1Ym1kNScsXG5dKTtcblxuLyoqIEJvb2xlYW4gZmxhZ3MgdGhhdCB0YWtlIG5vIGFyZ3VtZW50IOKAlCBza2lwIHdpdGhvdXQgY29uc3VtaW5nIHRoZSBuZXh0IHRva2VuLiAqL1xuY29uc3QgQ1VSTF9OT19BUkdfRkxBR1MgPSBuZXcgU2V0KFtcbiAgJy0tY29tcHJlc3NlZCcsICctLWxvY2F0aW9uJywgJy1MJywgJy0taW5zZWN1cmUnLCAnLWsnLFxuICAnLS1zaWxlbnQnLCAnLXMnLCAnLS12ZXJib3NlJywgJy12JywgJy0tZ2V0JywgJy1HJyxcbiAgJy0tZmFpbCcsICctZicsICctLXNob3ctZXJyb3InLCAnLVMnLFxuICAnLS1oZWFkJywgJy1JJywgJy0taW5jbHVkZScsICctaScsXG4gICctLXJlbW90ZS1uYW1lJywgJy1PJywgJy0tcmVtb3RlLW5hbWUtYWxsJyxcbiAgJy0taXB2NCcsICctNCcsICctLWlwdjYnLCAnLTYnLFxuICAnLS1hbnlhdXRoJywgJy0tYmFzaWMnLCAnLS1kaWdlc3QnLCAnLS1udGxtJywgJy0tbmVnb3RpYXRlJyxcbiAgJy0tbm8ta2VlcGFsaXZlJywgJy0tbm8tc2Vzc2lvbmlkJywgJy0tZ2xvYm9mZicsICctZycsXG4gICctLXJlbW90ZS10aW1lJywgJy1SJywgJy0tdGNwLW5vZGVsYXknLFxuICAnLS1odHRwMS4wJywgJy0wJywgJy0taHR0cDEuMScsICctLWh0dHAyJywgJy0taHR0cDItcHJpb3Ita25vd2xlZGdlJyxcbiAgJy0taHR0cDMnLCAnLS1uby1idWZmZXInLCAnLU4nLFxuICAnLS10cmFjZS10aW1lJywgJy0tY2VydC1zdGF0dXMnLCAnLS1mYWxzZS1zdGFydCcsXG4gICctLXBhdGgtYXMtaXMnLCAnLS1saXN0LW9ubHknLCAnLWwnLFxuICAnLS1hcHBlbmQnLCAnLWEnLCAnLS11c2UtYXNjaWknLCAnLUInLFxuICAnLS1oYXByb3h5LXByb3RvY29sJywgJy0tbmV0cmMnLCAnLW4nLCAnLS1uZXRyYy1vcHRpb25hbCcsXG5dKTtcblxuLyoqIFBhcnNlIGEgc2luZ2xlIC1GLy0tZm9ybSB2YWx1ZSAoa2V5PXZhbHVlIHwga2V5PUBmaWxlIHwga2V5PTxmaWxlKSBpbnRvIGEgZm9ybURhdGEgZW50cnkuICovXG5mdW5jdGlvbiBwYXJzZUZvcm1FbnRyeShyYXc6IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IHR5cGU6ICd0ZXh0JyB8ICdmaWxlJzsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGNvbnN0IGVxID0gcmF3LmluZGV4T2YoJz0nKTtcbiAgaWYgKGVxID09PSAtMSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGtleSA9IHJhdy5zbGljZSgwLCBlcSkudHJpbSgpO1xuICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJlc3QgPSByYXcuc2xpY2UoZXEgKyAxKTtcbiAgLy8gU3RyaXAgb3B0aW9uYWwgO3R5cGU9Li4uIHN1ZmZpeFxuICBjb25zdCBzZW1pID0gcmVzdC5pbmRleE9mKCc7Jyk7XG4gIGNvbnN0IHZhbCA9IChzZW1pICE9PSAtMSA/IHJlc3Quc2xpY2UoMCwgc2VtaSkgOiByZXN0KS50cmltKCk7XG4gIGlmICh2YWwuc3RhcnRzV2l0aCgnQCcpIHx8IHZhbC5zdGFydHNXaXRoKCc8JykpIHtcbiAgICByZXR1cm4geyBrZXksIHR5cGU6ICdmaWxlJywgdmFsdWU6IHZhbC5zbGljZSgxKSB9O1xuICB9XG4gIHJldHVybiB7IGtleSwgdHlwZTogJ3RleHQnLCB2YWx1ZTogdmFsIH07XG59XG5cbi8qKlxuICogUGFyc2UgYW55IGNVUkwgY29tbWFuZCBzdHJpbmcgYW5kIHJldHVybiBtZXRob2QsIHVybCwgaGVhZGVycywgYm9keSwgYW5kIGZvcm1EYXRhLlxuICpcbiAqIFN1cHBvcnRlZCBmb3JtYXRzIC8gZmVhdHVyZXM6XG4gKiAg4oCiIFVuaXgvTWFjICA6IHNpbmdsZS1xdW90ZSBhcmdzLCBiYWNrc2xhc2ggKFxcKSBsaW5lIGNvbnRpbnVhdGlvblxuICogIOKAoiBQb3dlclNoZWxsOiBiYWNrdGljayAoYCkgbGluZSBjb250aW51YXRpb25cbiAqICDigKIgV2luZG93cyBDTUQ6IF5cIiBxdW90ZSBkZWxpbWl0ZXJzLCBeXFxeXCIgaW5uZXIgZXNjYXBlZCBxdW90ZSwgXiBsaW5lIGNvbnRpbnVhdGlvblxuICogIOKAoiBIVFRQIG1ldGhvZCAgOiAtWCBQT1NUIHwgLS1yZXF1ZXN0IFBPU1QgfCAtLXJlcXVlc3Q9UE9TVCB8IC1YUE9TVFxuICogIOKAoiBIZWFkZXJzICAgICAgOiAtSCAvIC0taGVhZGVyIC8gLS1oZWFkZXI9J+KApicgLyAtSD0n4oCmJyBpbmxpbmUtPSBmb3JtXG4gKiAg4oCiIEJvZHkgICAgICAgICA6IC1kIC8gLS1kYXRhIC8gLS1kYXRhLXJhdyAvIC0tZGF0YS1iaW5hcnkgLyAtLWRhdGEtYXNjaWkgL1xuICogICAgICAgICAgICAgICAgICAgaW5saW5lIC0tZGF0YT0n4oCmJyAvIG11bHRpcGxlIC1kIGZsYWdzIChjb25jYXRlbmF0ZWQgd2l0aCAmKSAvXG4gKiAgICAgICAgICAgICAgICAgICAtLWRhdGEtdXJsZW5jb2RlIC8gLS1qc29uIChjVVJMIDcuODIrKVxuICogIOKAoiBGb3JtLWRhdGEgICAgOiAtRiAvIC0tZm9ybSAvIC0tZm9ybS1zdHJpbmcgKG11bHRpcGFydC9mb3JtLWRhdGEpXG4gKiAg4oCiIFVSTCAgICAgICAgICA6IGJhcmUgaHR0cHM/Oi8vIHRva2VuIG9yIGV4cGxpY2l0IC0tdXJsIGZsYWdcbiAqICDigKIgQXV0aCBpbmZlciAgIDogQmVhcmVyIHRva2VuIGV4dHJhY3RlZCBmcm9tIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gKiAg4oCiIE1ldGhvZCBpbmZlciA6IEdFVOKGklBPU1Qgd2hlbiBib2R5L2Zvcm0tZGF0YSBwcmVzZW50IGFuZCBubyBleHBsaWNpdCAtWFxuICovXG5mdW5jdGlvbiBwYXJzZUN1cmwoY3VybFN0cmluZzogc3RyaW5nKTogUGFyc2VkQ3VybCB8IG51bGwge1xuICBjb25zdCByYXcgPSAoY3VybFN0cmluZyA/PyAnJykudHJpbSgpO1xuICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG5cbiAgbGV0IHMgPSByYXc7XG5cbiAgLy8g4pSA4pSAIFdpbmRvd3MgQ01EIGZvcm1hdCAoQ2hyb21lIERldlRvb2xzIFwiQ29weSBhcyBjVVJMIChjbWQpXCIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXRlY3RlZCBieSBwcmVzZW5jZSBvZiBeXCIgKGNhcmV0ICsgZG91YmxlLXF1b3RlKSBhcyBxdW90ZSBkZWxpbWl0ZXIuXG4gIC8vIE9ubHkgYXBwbGllZCB3aGVuIHRoZSBjVVJMIGlzIE5PVCBhbHJlYWR5IHVzaW5nIHNpbmdsZS1xdW90ZXMgYXMgdGhlIHByaW1hcnlcbiAgLy8gcXVvdGluZyBtZWNoYW5pc20gKGkuZS4gbm90IGEgVW5peCBjVVJMIHRoYXQgbWVyZWx5IGNvbnRhaW5zIF5cIiBpbiBhIGJvZHkpLlxuICBpZiAoL1xcXlwiLy50ZXN0KHMpICYmICEvKD86XnxcXHMpJy8udGVzdChzKSkge1xuICAgIHMgPSBzLnJlcGxhY2UoL1xccypcXF5cXHMqXFxyP1xcblxccyovZywgJyAnKTsgIC8vIF4gbGluZS1jb250aW51YXRpb25cbiAgICBzID0gcy5yZXBsYWNlKC9cXF5cXFxcXFxeXCIvZywgJ1xcXFxcIicpOyAgICAgICAgICAgLy8gXlxcXlwiIOKGkiBcXFwiIChpbm5lciBlc2NhcGVkIHF1b3RlKVxuICAgIHMgPSBzLnJlcGxhY2UoL1xcXlwiL2csICdcIicpOyAgICAgICAgICAgICAgICAgLy8gXlwiICDihpIgXCIgIChxdW90ZSBkZWxpbWl0ZXIpXG4gIH1cblxuICAvLyDilIDilIAgUG93ZXJTaGVsbCBiYWNrdGljayBsaW5lIGNvbnRpbnVhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcyA9IHMucmVwbGFjZSgvYFxccypcXHI/XFxuXFxzKi9nLCAnICcpO1xuXG4gIC8vIOKUgOKUgCBVbml4L01hYyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHMgPSBzLnJlcGxhY2UoL1xcXFxcXHMqXFxyP1xcblxccyovZywgJyAnKTtcblxuICAvLyBDb2xsYXBzZSByZW1haW5pbmcgbGl0ZXJhbCBuZXdsaW5lcyBhbmQgcmVkdW5kYW50IHNwYWNlc1xuICBjb25zdCBub3JtYWxpemVkID0gcy5yZXBsYWNlKC9cXHI/XFxuL2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUN1cmxMaW5lKG5vcm1hbGl6ZWQpO1xuXG4gIGxldCBtZXRob2QgPSAnJztcbiAgbGV0IHVybCA9ICcnO1xuICBjb25zdCBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBbXTtcbiAgbGV0IGJvZHkgPSAnJztcbiAgY29uc3QgZm9ybURhdGE6IHsga2V5OiBzdHJpbmc7IHR5cGU6ICd0ZXh0JyB8ICdmaWxlJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy9pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdCA9IHRva2Vuc1tpXTtcbiAgICBjb25zdCBjb25zdW1lTmV4dCA9ICgpOiBzdHJpbmcgPT4gdG9rZW5zWysraV0gPz8gJyc7XG5cbiAgICAvLyDilIDilIAgU2tpcCBib29sZWFuIG5vLWFyZyBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAoQ1VSTF9OT19BUkdfRkxBR1MuaGFzKHQpKSBjb250aW51ZTtcblxuICAgIC8vIOKUgOKUgCBDb25zdW1lLWFuZC1kaXNjYXJkIGZsYWdzICh0aGVpciBhcmcgbXVzdCBub3QgYmUgbWlzdGFrZW4gZm9yIHRoZSBVUkwpIOKUgOKUgFxuICAgIGlmIChDVVJMX0ZMQUdTX1dJVEhfSUdOT1JFRF9BUkcuaGFzKHQpKSB7IGNvbnN1bWVOZXh0KCk7IGNvbnRpbnVlOyB9XG5cbiAgICAvLyDilIDilIAgSFRUUCBtZXRob2Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctWCcgfHwgdCA9PT0gJy0tcmVxdWVzdCcpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpOyBpZiAodikgbWV0aG9kID0gdi50b1VwcGVyQ2FzZSgpOyBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1yZXF1ZXN0PScpKSB7XG4gICAgICBjb25zdCB2ID0gdC5zbGljZSgxMCk7IGlmICh2KSBtZXRob2QgPSB2LnRvVXBwZXJDYXNlKCk7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctWCcpICYmIHQubGVuZ3RoID4gMikge1xuICAgICAgbWV0aG9kID0gdC5zbGljZSgyKS50b1VwcGVyQ2FzZSgpOyBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgSGVhZGVyczogLUggLyAtLWhlYWRlciAvIGlubGluZSAtLWhlYWRlcj0n4oCmJyAvIC1IPSfigKYnIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmICh0ID09PSAnLUgnIHx8IHQgPT09ICctLWhlYWRlcicpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgY29uc3QgY29sb24gPSB2LmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChjb2xvbiAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHYuc2xpY2UoMCwgY29sb24pLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsICA9IHYuc2xpY2UoY29sb24gKyAxKS50cmltKCk7XG4gICAgICAgIGlmIChuYW1lKSBoZWFkZXJzLnB1c2goeyBuYW1lLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6IHZhbCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbmxpbmUgLS1oZWFkZXI9J05hbWU6IFZhbHVlJyDigJQgdG9rZW5pemVyIHNwbGl0cyBpbnRvIFsnLS1oZWFkZXI9JywgJ05hbWU6IFZhbHVlJ11cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWhlYWRlcj0nKSB8fCB0LnN0YXJ0c1dpdGgoJy1IPScpKSB7XG4gICAgICBjb25zdCBwcmVmaXhMZW4gPSB0LnN0YXJ0c1dpdGgoJy0taGVhZGVyPScpID8gOSA6IDM7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0LnNsaWNlKHByZWZpeExlbikgfHwgY29uc3VtZU5leHQoKTtcbiAgICAgIGNvbnN0IGNvbG9uICA9IGlubGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb24gIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBpbmxpbmUuc2xpY2UoMCwgY29sb24pLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsICA9IGlubGluZS5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUpIGhlYWRlcnMucHVzaCh7IG5hbWUsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogdmFsIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFJlcXVlc3QgYm9keSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBjVVJMIGNvbmNhdGVuYXRlcyBtdWx0aXBsZSAtZCBmbGFncyB3aXRoICcmJzsgcmVwbGljYXRlIHRoYXQgYmVoYXZpb3VyLlxuICAgIGlmICh0ID09PSAnLWQnIHx8IHQgPT09ICctLWRhdGEnIHx8IHQgPT09ICctLWRhdGEtcmF3JyB8fFxuICAgICAgICB0ID09PSAnLS1kYXRhLWJpbmFyeScgfHwgdCA9PT0gJy0tZGF0YS1hc2NpaScpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHYgJiYgIXYuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2KTtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2NodW5rfWAgOiBjaHVuaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyAtLWpzb24gZmxhZyAoY1VSTCA3LjgyKyk6IHNldHMgQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24gKyBib2R5XG4gICAgaWYgKHQgPT09ICctLWpzb24nKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2ICYmICF2LnN0YXJ0c1dpdGgoJ0AnKSkgYm9keSA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gSW5saW5lIC0tZGF0YT0n4oCmJyAvIC0tZGF0YS1yYXc9J+KApicg4oCUIHRva2VuaXplciBzcGxpdHMgaW50byBbJy0tZGF0YT0nLCB2YWx1ZV1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGE9JykgfHwgdC5zdGFydHNXaXRoKCctLWRhdGEtcmF3PScpIHx8XG4gICAgICAgIHQuc3RhcnRzV2l0aCgnLS1kYXRhLWJpbmFyeT0nKSB8fCB0LnN0YXJ0c1dpdGgoJy0tZGF0YS1hc2NpaT0nKSkge1xuICAgICAgY29uc3QgZXFJZHggPSB0LmluZGV4T2YoJz0nKTtcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UoZXFJZHggKyAxKSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKGlubGluZSAmJiAhU3RyaW5nKGlubGluZSkuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gc3RyaXBTdXJyb3VuZGluZ1F1b3RlcyhTdHJpbmcoaW5saW5lKSk7XG4gICAgICAgIGJvZHkgPSBib2R5ID8gYCR7Ym9keX0mJHtjaHVua31gIDogY2h1bms7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gSW5saW5lIHNob3J0IGZvcm0gLWRWQUxVRSBvciAtZD1WQUxVRVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy1kJykgJiYgdC5sZW5ndGggPiAyKSB7XG4gICAgICBjb25zdCB2ID0gdC5zdGFydHNXaXRoKCctZD0nKSA/IHQuc2xpY2UoMykgOiB0LnNsaWNlKDIpO1xuICAgICAgaWYgKCF2LnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModik7XG4gICAgICAgIGJvZHkgPSBib2R5ID8gYCR7Ym9keX0mJHtjaHVua31gIDogY2h1bms7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gLS1kYXRhLXVybGVuY29kZSBuYW1lPXZhbHVlICh0cmVhdCBhcyBwbGFpbiBib2R5IGVudHJ5KVxuICAgIGlmICh0ID09PSAnLS1kYXRhLXVybGVuY29kZScpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHYgJiYgIXYuaW5jbHVkZXMoJ0AnKSkgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke3Z9YCA6IHY7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1kYXRhLXVybGVuY29kZT0nKSkge1xuICAgICAgY29uc3QgaW5saW5lID0gdC5zbGljZSgxNykgfHwgY29uc3VtZU5leHQoKTtcbiAgICAgIGlmIChpbmxpbmUgJiYgIVN0cmluZyhpbmxpbmUpLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2lubGluZX1gIDogU3RyaW5nKGlubGluZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgTXVsdGlwYXJ0IGZvcm0tZGF0YTogLUYgLyAtLWZvcm0gLyAtLWZvcm0tc3RyaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmICh0ID09PSAnLUYnIHx8IHQgPT09ICctLWZvcm0nIHx8IHQgPT09ICctLWZvcm0tc3RyaW5nJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodikgeyBjb25zdCBlID0gcGFyc2VGb3JtRW50cnkodik7IGlmIChlKSBmb3JtRGF0YS5wdXNoKGUpOyB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1mb3JtPScpIHx8IHQuc3RhcnRzV2l0aCgnLUY9JykpIHtcbiAgICAgIGNvbnN0IHByZWZpeExlbiA9IHQuc3RhcnRzV2l0aCgnLS1mb3JtPScpID8gNyA6IDM7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0LnNsaWNlKHByZWZpeExlbikgfHwgY29uc3VtZU5leHQoKTtcbiAgICAgIGlmIChpbmxpbmUpIHsgY29uc3QgZSA9IHBhcnNlRm9ybUVudHJ5KFN0cmluZyhpbmxpbmUpKTsgaWYgKGUpIGZvcm1EYXRhLnB1c2goZSk7IH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBVUkwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctLXVybCcpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpOyBpZiAodiAmJiAhdXJsKSB1cmwgPSB2OyBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS11cmw9JykpIHtcbiAgICAgIGNvbnN0IHYgPSB0LnNsaWNlKDYpIHx8IGNvbnN1bWVOZXh0KCk7IGlmICh2ICYmICF1cmwpIHVybCA9IHY7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXJsUGF0dGVybi50ZXN0KHQpICYmICF1cmwpIHsgdXJsID0gdDsgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHNjYW4gYWxsIHRva2VucyBmb3IgdGhlIGZpcnN0IFVSTC1saWtlIHZhbHVlXG4gIGlmICghdXJsKSB7XG4gICAgdXJsID0gdG9rZW5zLmZpbmQodG9rID0+IHVybFBhdHRlcm4udGVzdCh0b2spKSA/PyAnJztcbiAgfVxuXG4gIC8vIEluZmVyIG1ldGhvZDogaWYgYSBib2R5L2Zvcm0tZGF0YSBpcyBwcmVzZW50IGJ1dCBubyBleHBsaWNpdCAtWCB3YXMgZ2l2ZW4sXG4gIC8vIHVzZSBQT1NUIChtYW55IGJyb3dzZXIgRGV2VG9vbHMgY1VSTHMgb21pdCAtWCBQT1NUKS5cbiAgY29uc3QgZmluYWxNZXRob2QgPSAobWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBpZiAoKGJvZHkgfHwgZm9ybURhdGEubGVuZ3RoID4gMCkgJiYgKGZpbmFsTWV0aG9kID09PSAnR0VUJyB8fCBmaW5hbE1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuICAgIHJldHVybiB7IG1ldGhvZDogJ1BPU1QnLCB1cmwsIGhlYWRlcnMsIGJvZHksIGZvcm1EYXRhIH07XG4gIH1cbiAgcmV0dXJuIHsgbWV0aG9kOiBmaW5hbE1ldGhvZCwgdXJsLCBoZWFkZXJzLCBib2R5LCBmb3JtRGF0YSB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtYXBpLWVkaXQtc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcGktZWRpdC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG59KVxuZXhwb3J0IGNsYXNzIEFwaUVkaXRTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGluaXRpYWxNZXRob2Q/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxFbnZpcm9ubWVudD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFN0ZXA/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGluaXRpYWxVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxQYXlsb2FkVGFiPzogQXBpRWRpdFBheWxvYWRUYWI7XG4gIC8qKiBJbml0aWFsIHBheWxvYWQgdHlwZSAocmF3LCB4LXd3dy1mb3JtLXVybGVuY29kZWQsIGZvcm0tZGF0YSkgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxQYXlsb2FkVHlwZT86ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgLyoqIEluaXRpYWwgcGF5bG9hZCB0ZXh0IChib2R5KSB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUZXh0Pzogc3RyaW5nO1xuICAvKiogSW5pdGlhbCBzdW1tYXJ5IHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwIChtYXBzIHRvIHN0ZXAgZGVzY3JpcHRpb24pLiAqL1xuICBASW5wdXQoKSBpbml0aWFsU3VtbWFyeT86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbEhlYWRlcnM/OiBBcGlFZGl0SGVhZGVyUm93W107XG4gIEBJbnB1dCgpIGluaXRpYWxSZXNwb25zZVByZXZpZXc/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxWYXJpYWJsZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBJbml0aWFsIHJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9ucyB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM/OiBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93W107XG4gIC8qKiBJbml0aWFsIHN0YXR1cyB2ZXJpZmljYXRpb25zIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9ucz86IEFwaUVkaXRTdGF0dXNWZXJpZmljYXRpb25Sb3dbXTtcbiAgLyoqIEluaXRpYWwgYWN0aXZlIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWIgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYj86ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnO1xuICBASW5wdXQoKSBlZGl0TW9kZT86IGJvb2xlYW47XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBidXR0b24gKi9cbiAgQElucHV0KCkgaXNDcmVhdGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSW5pdGlhbCBBUEkgdHlwZSAoJ3Jlc3QnIGRlZmF1bHQsICdncmFwaHFsJyBmb3IgR3JhcGhRTCBzdGVwcykuIENvbWVzIGZyb20gYGV2ZW50LnR5cGVgIG9uIHRoZSBzYXZlZCBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsQXBpVHlwZT86IEFwaUVkaXRBcGlUeXBlO1xuICAvKiogSW5pdGlhbCBHcmFwaFFMIGJvZHkgd2hlbiBlZGl0aW5nIGEgR3JhcGhRTCBzdGVwLiBgdmFyaWFibGVzYCBtYXkgYmUgYW4gb2JqZWN0IChwcmVmZXJyZWQpIG9yIGEgSlNPTiBzdHJpbmcuICovXG4gIEBJbnB1dCgpIGluaXRpYWxHcmFwaFFMPzogQXBpRWRpdEdyYXBoUUxQYXlsb2FkO1xuICAvKiogU2NoZW1hIHNvdXJjZSBmb3IgdGhlIEdyYXBoUUwgb3BlcmF0aW9uIHBpY2tlciAoVVJMICsgY291bnRzKS4gUGFyZW50IHByb3ZpZGVzIHRoaXMgYWZ0ZXIgYGxvYWRTY2hlbWFgIHJlc29sdmVzLiAqL1xuICBASW5wdXQoKSBncmFwaFFMU2NoZW1hU291cmNlPzogR3JhcGhRTFNjaGVtYVNvdXJjZTtcbiAgLyoqIE9wZXJhdGlvbnMgbGlzdCBmb3IgdGhlIHBpY2tlci4gRW1wdHkgdW50aWwgcGFyZW50IGxvYWRzL2ludHJvc3BlY3RzIHRoZSBzY2hlbWEuICovXG4gIEBJbnB1dCgpIGdyYXBoUUxPcGVyYXRpb25zOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uW10gPSBbXTtcbiAgLyoqIFRydWUgd2hpbGUgdGhlIHBhcmVudCBpcyBpbnRyb3NwZWN0aW5nOyB0aGUgcGlja2VyIHN3YXBzIGl0cyBlbXB0eSBzdGF0ZSBmb3IgYSBzcGlubmVyLiAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdHcmFwaFFMU2NoZW1hID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIHRoZSBjVVJMIHN0cmluZyB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydCAodmFsdWUgZnJvbSB0aGUgdGV4dGFyZWEgY29udHJvbCkuICovXG4gIEBPdXRwdXQoKSBpbXBvcnRDdXJsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2FuY2VscyB0aGUgSW1wb3J0IGNVUkwgcGFuZWwgKGNsaWNrcyBDYW5jZWwpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0LCB3aXRoIGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgYW5kIGhlYWRlcnMuICovXG4gIEBPdXRwdXQoKSBzZW5kUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdFNlbmRSZXF1ZXN0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uIChzdGVwIDEpLiAqL1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIHdpdGggYWxsIGVudGVyZWQgZGV0YWlsczogc3RlcDEgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5KSwgc3RlcDIgKHZhcmlhYmxlIG5hbWUpLCBzdGVwMyAodmVyaWZpY2F0aW9ucykuICovXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRDcmVhdGVQYXlsb2FkPigpO1xuICAvKiogRW1pdHMgd2hlbmV2ZXIgaGVhZGVycyBjaGFuZ2UgKGFkZCwgcmVtb3ZlLCBvciBlZGl0KSBzbyB0aGUgcGFyZW50IGNhbiByZWZsZWN0IHRoZW0gaW4gdGhlIGNhbnZhcy9jb250cm9scy4gKi9cbiAgQE91dHB1dCgpIGhlYWRlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRIZWFkZXJSb3dbXT4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGVudmlyb25tZW50IGRyb3Bkb3duIHNlbGVjdGlvbiBjaGFuZ2VzIChzZWxlY3RlZCB2YWx1ZS9pZCBvciBudWxsIGZvciBOb25lKSBzbyB0aGUgcGFyZW50IGNhbiBwcm92aWRlIHVybE9wdGlvbnMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKiogRm9ybSBjb250cm9sIGZvciBJbXBvcnQgY1VSTCB0ZXh0YXJlYTsgdmFsdWUgaXMgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydC4gKi9cbiAgcmVhZG9ubHkgaW1wb3J0Q3VybENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gIHZhcmlhYmxlTmFtZSA9ICcnO1xuICB2YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB1cmxFcnJvciA9ICcnO1xuICAvKiogU3RlcCBzdW1tYXJ5IChkaXNwbGF5ZWQgaW4gQVBJIHN0ZXAgdGl0bGU7IG1hcHMgdG8gc3RlcCBkZXNjcmlwdGlvbikuICovXG4gIHN1bW1hcnkgPSAnJztcblxuICAvKiogQ29udHJvbHMgd2hpY2ggYm9keSBjb250ZW50IGlzIHZpc2libGU6IGhlYWRlcnMgKGRlZmF1bHQpIG9yIGltcG9ydC1jdXJsLiAqL1xuICBib2R5VmlldzogQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuXG4gIHJlYWRvbmx5IHN0ZXBMYWJlbHMgPSBbXG4gICAgeyBpbmRleDogMSwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlJFUVVFU1RfREVUQUlMUyB9LFxuICAgIHsgaW5kZXg6IDIsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5TVE9SRV9SRVNQT05TRSB9LFxuICAgIHsgaW5kZXg6IDMsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5WQUxJREFUSU9OIH0sXG4gIF07XG4gIGN1cnJlbnRTdGVwID0gMTtcblxuICAvKiogVGhlIGxhYmVsIGZvciB0aGUgY3VycmVudCBzdGVwIG9ubHkgKHVzZWQgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIGluZGljYXRvcikuICovXG4gIGdldCBhY3RpdmVTdGVwTGFiZWwoKTogeyBpbmRleDogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0ZXBMYWJlbHNbdGhpcy5jdXJyZW50U3RlcCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtaW5TdGVwID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTdGVwID0gMztcblxuICAvKiogUGVyY2VudGFnZSB0byB0cmFuc2xhdGUgdGhlIHN0ZXAgc3RyaXAgKDAsIC0zMy4zMzMsIC02Ni42NjYpIGZvciBDU1MgdHJhbnNpdGlvbi4gKi9cbiAgZ2V0IHN0cmlwVHJhbnNsYXRlUGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50U3RlcCAtIDEpICogLTMzLjMzMztcbiAgfVxuXG4gIHNldFN0ZXAoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPj0gdGhpcy5taW5TdGVwICYmIHN0ZXAgPD0gdGhpcy5tYXhTdGVwKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBjdXJyZW50IHN0ZXAgYmVmb3JlIGFsbG93aW5nIGZvcndhcmQgbmF2aWdhdGlvblxuICAgICAgaWYgKHN0ZXAgPiB0aGlzLmN1cnJlbnRTdGVwKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIFVSTCBiZWZvcmUgYWxsb3dpbmcgbmF2aWdhdGlvbiBhd2F5IGZyb20gc3RlcCAxXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAxKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZSBuYW1lIGJlZm9yZSBhbGxvd2luZyBuYXZpZ2F0aW9uIGF3YXkgZnJvbSBzdGVwIDJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPT09IDIgJiYgIXRoaXMudmFyaWFibGVOYW1lPy50cmltKCkpIHtcbiAgICAgICAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJ1ZhcmlhYmxlIE5hbWUgaXMgcmVxdWlyZWQuJztcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHN0ZXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUluaXRpYWxTdGVwKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCh0aGlzLm1pblN0ZXAsIE1hdGgubWluKHRoaXMubWF4U3RlcCwgTWF0aC5mbG9vcih2YWx1ZSkpKTtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gY2xhbXBlZDtcbiAgfVxuXG4gIC8qKiBIVFRQIG1ldGhvZCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBodHRwTWV0aG9kT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIEZvcm0gZm9yIEhUVFAgbWV0aG9kIHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBtZXRob2RGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDb25maWcgZm9yIG1ldGhvZCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGh0dHBNZXRob2RPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgbWV0aG9kU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbWV0aG9kJyxcbiAgICBwbGFjZWhvbGRlcjogJ01ldGhvZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmh0dHBNZXRob2RPcHRpb25zID8/IFtdKS5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG0pKTtcbiAgICB0aGlzLm1ldGhvZFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubWV0aG9kU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRob2RWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG0pKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IChjcWEtZHluYW1pYy1zZWxlY3QpICovXG4gIGVudmlyb25tZW50Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRW52aXJvbm1lbnQgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsIChwcm92aWRlZCBieSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVVJMIGZpZWxkIG9wdGlvbnMgd2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCAoYmFzZSBVUkwgKyBwYXJhbWV0ZXJzIGFzICp8a2V5fCkuIFBhcmVudCBmaWxscyB0aGlzIHdoZW4gZW52aXJvbm1lbnRDaGFuZ2UgZmlyZXMuICovXG4gIEBJbnB1dCgpIHVybE9wdGlvbnM6IENxYUF1dG9jb21wbGV0ZU9wdGlvbltdID0gW107XG5cbiAgLyoqIENvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBlbnZpcm9ubWVudE9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBlbnZpcm9ubWVudFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Vudmlyb25tZW50JyxcbiAgICBwbGFjZWhvbGRlcjogJ0Vudmlyb25tZW50JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyB0b1NlbGVjdE9wdGlvbihpdGVtOiBFbnZpcm9ubWVudE9wdGlvbklucHV0KTogU2VsZWN0T3B0aW9uIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBpZDogaXRlbSwgdmFsdWU6IGl0ZW0sIG5hbWU6IGl0ZW0sIGxhYmVsOiBpdGVtIH07XG4gICAgfVxuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG8uaWQgPz8gby52YWx1ZSxcbiAgICAgIHZhbHVlOiBvLnZhbHVlID8/IG8uaWQsXG4gICAgICBuYW1lOiBvLm5hbWUgPz8gby5sYWJlbCA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICAgIGxhYmVsOiBvLmxhYmVsID8/IG8ubmFtZSA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3B0aW9uVmFsdWUoaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgcmV0dXJuIGl0ZW07XG4gICAgY29uc3QgbyA9IGl0ZW0gYXMgU2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHYgPSBvLnZhbHVlID8/IG8uaWQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IFN0cmluZyh2KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkubWFwKChlKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihlKSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZUVudmlyb25tZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbnZpcm9ubWVudHMsXG4gICAgICBvbkxvYWRNb3JlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRMb2FkTW9yZS5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2guZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEVudmlyb25tZW50VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zID8/IFtdKVxuICAgICAgLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZSkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBlbnZpcm9ubWVudHMgZnJvbSB0aGUgZHJvcGRvd24uICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudExvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gdXNlciBjbGlja3MgXCJMb2FkIFNjaGVtYVwiIGluIEdyYXBoUUwgbW9kZS4gUGFyZW50IGhhbmRsZXMgdGhlIHNjaGVtYSBmZXRjaCAob3Igc2hvd3MgYSBcImNvbWluZyBzb29uXCIgdG9hc3QgZm9yIG5vdykuICovXG4gIEBPdXRwdXQoKSBsb2FkU2NoZW1hID0gbmV3IEV2ZW50RW1pdHRlcjx7IHVybDogc3RyaW5nOyBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W10gfT4oKTtcblxuICAvKiogRm9ybSBmb3IgQXV0aCBUeXBlIHNlbGVjdCAoQXV0aG9yaXphdGlvbiB0YWIpICovXG4gIGF1dGhUeXBlRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQXV0aCB0eXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBhdXRoVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBJbml0aWFsIGF1dGggdHlwZSAoc3RyaW5nIG9yIG9wdGlvbiBvYmplY3QpLiBXaGVuIG5vdCBzZXQsIGZpcnN0IG9mIGF1dGhUeXBlT3B0aW9ucyBvciBkZWZhdWx0IFwiTm8gQXV0aFwiIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBdXRoVHlwZT86IHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9uSW5wdXQ7XG5cbiAgLyoqIERlZmF1bHQgb3B0aW9ucyB3aGVuIGF1dGhUeXBlT3B0aW9ucyBpcyBlbXB0eSAoc2FtZSBzaGFwZSBhcyBlbnZpcm9ubWVudCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ25vLWF1dGgnLCB2YWx1ZTogJ25vLWF1dGgnLCBuYW1lOiAnTm8gQXV0aCcsIGxhYmVsOiAnTm8gQXV0aCcgfSxcbiAgICB7IGlkOiAnYmVhcmVyJywgdmFsdWU6ICdiZWFyZXInLCBuYW1lOiAnQmVhcmVyIFRva2VuJywgbGFiZWw6ICdCZWFyZXIgVG9rZW4nIH0sXG4gICAgeyBpZDogJ29hdXRoMicsIHZhbHVlOiAnb2F1dGgyJywgbmFtZTogJ09BdXRoIDIuMCcsIGxhYmVsOiAnT0F1dGggMi4wJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEF1dGggVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGF1dGhUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIGVudmlyb25tZW50KSAqL1xuICBhdXRoVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2F1dGhUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vIEF1dGgnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oYSkpXG4gICAgICAgIDogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlNdO1xuICAgIHRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGEgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGF1dGggdHlwZSB2YWx1ZSAoZS5nLiAnbm8tYXV0aCcpIGZvciB0ZW1wbGF0ZSAqL1xuICBnZXQgc2VsZWN0ZWRBdXRoVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmF1dGhUeXBlRm9ybT8uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJ25vLWF1dGgnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAodj8udmFsdWUgPz8gdj8uaWQgPz8gJ25vLWF1dGgnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgKEF1dGhvcml6YXRpb24gdGFiLCB3aGVuIGF1dGggdHlwZSBpcyBCZWFyZXIgVG9rZW4pLiAqL1xuICBiZWFyZXJUb2tlbiA9ICcnO1xuXG4gIC8qKiBGb3JtIGZvciBPQXV0aCAyLjAgZmllbGRzIChBdXRob3JpemF0aW9uIHRhYiB3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuICBvYXV0aDJGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBHcmFudCB0eXBlIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9HUkFOVF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdjbGllbnRfY3JlZGVudGlhbHMnLCB2YWx1ZTogJ2NsaWVudF9jcmVkZW50aWFscycsIG5hbWU6ICdDbGllbnQgQ3JlZGVudGlhbHMnLCBsYWJlbDogJ0NsaWVudCBDcmVkZW50aWFscycgfSxcbiAgICB7IGlkOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgdmFsdWU6ICdhdXRob3JpemF0aW9uX2NvZGUnLCBuYW1lOiAnQXV0aG9yaXphdGlvbiBDb2RlJywgbGFiZWw6ICdBdXRob3JpemF0aW9uIENvZGUnIH0sXG4gICAgeyBpZDogJ3Bhc3N3b3JkJywgdmFsdWU6ICdwYXNzd29yZCcsIG5hbWU6ICdQYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnIH0sXG4gICAgeyBpZDogJ2ltcGxpY2l0JywgdmFsdWU6ICdpbXBsaWNpdCcsIG5hbWU6ICdJbXBsaWNpdCcsIGxhYmVsOiAnSW1wbGljaXQnIH0sXG4gIF07XG5cbiAgLyoqIENsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Qgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdiYXNpYycsIHZhbHVlOiAnYmFzaWMnLCBuYW1lOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicsIGxhYmVsOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicgfSxcbiAgICB7IGlkOiAnYm9keScsIHZhbHVlOiAnYm9keScsIG5hbWU6ICdTZW5kIGluIGJvZHknLCBsYWJlbDogJ1NlbmQgaW4gYm9keScgfSxcbiAgXTtcblxuICByZWFkb25seSBvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdncmFudFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGdyYW50IHR5cGUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9HUkFOVF9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHJlYWRvbmx5IG9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdjbGllbnRBdXRoZW50aWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgbWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OU10sXG4gIH07XG5cbiAgLyoqIEN1cnJlbnQgSFRUUCBtZXRob2QgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBodHRwTWV0aG9kT3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZE1ldGhvZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdHRVQnO1xuICB9XG4gIHNldCBzZWxlY3RlZE1ldGhvZCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLm1ldGhvZEZvcm0/LnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzZWxlY3RlZCBIVFRQIG1ldGhvZCBpcyBHRVQsIEhFQUQsIG9yIERFTEVURSAobm8gcmVxdWVzdCBib2R5KS4gKi9cbiAgZ2V0IGlzTWV0aG9kV2l0aG91dEJvZHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICByZXR1cm4gTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgZW52aXJvbm1lbnQgdmFsdWUgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudEVudmlyb25tZW50VmFsdWUgPSAnJztcblxuICAvKiogQ2FjaGVkIEhUVFAgbWV0aG9kIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNZXRob2RWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDdXJyZW50IGVudmlyb25tZW50IChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgZW52aXJvbm1lbnRPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkRW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICB9XG4gIHNldCBzZWxlY3RlZEVudmlyb25tZW50KHY6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtPy5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIGVudmlyb25tZW50OyBrZWVwcyBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSBpbiBzeW5jLCBzZXRzIHJlcXVlc3QgVVJMIGZyb20gZW52aXJvbm1lbnQgd2hlbiBhdmFpbGFibGUsIGFuZCBub3RpZmllcyBwYXJlbnQgZm9yIHVybE9wdGlvbnMuICovXG4gIG9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9XG4gICAgICB2ICE9IG51bGxcbiAgICAgICAgPyB0eXBlb2YgdiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIDogJyc7XG5cbiAgICAvLyBDbGVhciBVUkwgZmllbGQgd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgdGhpcy51cmwgPSAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIEFsc28gY2xlYXIgYW55IFVSTCB2YWxpZGF0aW9uIGVycm9yc1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gTm90aWZ5IHBhcmVudCBzbyBpdCBjYW4gcHJvdmlkZSB1cmxPcHRpb25zIChlbnZpcm9ubWVudCBwYXJhbWV0ZXJzIGZvciBcIkVudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyXCIpXG4gICAgY29uc3QgZW1pdFZhbCA9IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICcnIHx8IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICdub25lJ1xuICAgICAgPyBudWxsXG4gICAgICA6ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgOiB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlKTtcbiAgICB0aGlzLmVudmlyb25tZW50Q2hhbmdlLmVtaXQoZW1pdFZhbCA9PT0gJ25vbmUnID8gbnVsbCA6IChlbWl0VmFsIGFzIHN0cmluZyB8IG51bWJlciB8IG51bGwpKTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgc2VsZWN0cyBhbiBvcHRpb24gZnJvbSB0aGUgVVJMIGF1dG9jb21wbGV0ZSAoZS5nLiBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgKnxrZXl8KSwgc2V0IHRoZSBVUkwgZmllbGQgdG8gdGhhdCB2YWx1ZS4gKi9cbiAgb25VcmxPcHRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnVybCA9IG9wdGlvbi52YWx1ZSA/PyAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIENsZWFyIGVycm9yIHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdCBVUkwgZm9yIHRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBvcHRpb24uXG4gICAqIEVudmlyb25tZW50IG9wdGlvbnMgbWF5IGNhcnJ5IGFuIG9wdGlvbmFsIGB1cmxgIChlLmcuIGZyb20gRW52aXJvbm1lbnQgbW9kZWwpOyBcIk5vbmVcIiBoYXMgbm8gdXJsLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEVudmlyb25tZW50VXJsKHNlbGVjdGVkVmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvYmogPSBzZWxlY3RlZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHVybFByb3AgPSBvYmpbJ3VybCddO1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsUHJvcCA9PT0gJ3N0cmluZycgJiYgdXJsUHJvcC50cmltKCkgIT09ICcnKSB7XG4gICAgICByZXR1cm4gdXJsUHJvcC50cmltKCk7XG4gICAgfVxuICAgIGNvbnN0IGlkT3JWYWx1ZSA9XG4gICAgICB0eXBlb2Ygc2VsZWN0ZWRWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRWYWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgOiBTdHJpbmcoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgaWYgKCFpZE9yVmFsdWUgfHwgaWRPclZhbHVlID09PSAnbm9uZScpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdGlvbiA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkuZmluZChcbiAgICAgIChvcHQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG9wdCkgPT09IGlkT3JWYWx1ZVxuICAgICk7XG4gICAgY29uc3QgdXJsID0gb3B0aW9uICE9IG51bGwgJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgPyAob3B0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsndXJsJ10gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC50cmltKCkgIT09ICcnID8gdXJsLnRyaW0oKSA6IG51bGw7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIEhUVFAgbWV0aG9kOyBrZWVwcyBjdXJyZW50TWV0aG9kVmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3VybCA9ICcnO1xuXG4gIC8qKiBVUkwgZm9yIHRoZSByZXF1ZXN0LiBHZXR0ZXIvc2V0dGVyIHN5bmNzIHF1ZXJ5IHBhcmFtcyB3aXRoIHRoZSBQYXJhbXMgdGFiIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbiAgc2V0IHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLl91cmwgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLl91cmwgPSBuZXh0O1xuICAgIC8vIENsZWFyIGVycm9yIHdoZW4gVVJMIGNoYW5nZXNcbiAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiB0cnVlLCBwYXJhbXMgZm9ybSBjaGFuZ2VzIHNob3VsZCBub3QgdXBkYXRlIHRoZSBVUkwgKHdlJ3JlIHN5bmNpbmcgZnJvbSBVUkwpLiAqL1xuICBwcml2YXRlIHBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG5cbiAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgVVJMIGZpZWxkOiBzaG93IFwiRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXIgKlwiIHdoZW4gdXJsT3B0aW9ucyBhcmUgYXZhaWxhYmxlIChlbnZpcm9ubWVudCBzZWxlY3RlZCkuICovXG4gIGdldCB1cmxQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy51cmxPcHRpb25zPy5sZW5ndGggPz8gMCkgPiAwID8gJ0VudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyIConIDogJ0VudGVyIFVSTCAqJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHdvIHRhYiBhcnJhbmdlbWVudHMuIFJFU1Qga2VlcHMgdGhlIGxlZ2FjeSBmb3VyLXRhYiBsYXlvdXQuIEdyYXBoUUwgZHJvcHMgQm9keSAmIFBhcmFtc1xuICAgKiBiZWNhdXNlIHRoZSBib2R5IGlzIGEgc2luZ2xlIHsgcXVlcnksIHZhcmlhYmxlcywgb3BlcmF0aW9uTmFtZSB9IG9iamVjdCAocmVuZGVyZWQgaW4gdGhlIG5ld1xuICAgKiBHcmFwaFFMIHRhYiBiZWxvdykgYW5kIHF1ZXJ5IHBhcmFtcyBoYXZlIG5vIG1lYW5pbmcgZm9yIGEgR3JhcGhRTCBQT1NULlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVTVF9QQVlMT0FEX1RBQlM6IHsgdmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnYXV0aG9yaXphdGlvbicsIGxhYmVsOiAnQXV0aG9yaXphdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnaGVhZGVycycsIGxhYmVsOiAnSGVhZGVycycgfSxcbiAgICB7IHZhbHVlOiAnYm9keScsIGxhYmVsOiAnQm9keScgfSxcbiAgICB7IHZhbHVlOiAncGFyYW1zJywgbGFiZWw6ICdQYXJhbXMnIH0sXG4gIF07XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdSQVBIUUxfUEFZTE9BRF9UQUJTOiB7IHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcnMnLCBsYWJlbDogJ0hlYWRlcnMnIH0sXG4gICAgeyB2YWx1ZTogJ2dyYXBocWwnLCBsYWJlbDogJ0dyYXBoUUwnIH0sXG4gIF07XG5cbiAgLyoqIFRhYnMgdmlzaWJsZSB1bmRlciB0aGUgcmVxdWVzdCByb3csIHN3YXBwZWQgYmFzZWQgb24gYGFjdGl2ZUFwaVR5cGVgLiAqL1xuICBnZXQgcGF5bG9hZFRhYnMoKTogeyB2YWx1ZTogQXBpRWRpdFBheWxvYWRUYWI7IGxhYmVsOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVBcGlUeXBlID09PSAnZ3JhcGhxbCdcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuR1JBUEhRTF9QQVlMT0FEX1RBQlNcbiAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuUkVTVF9QQVlMT0FEX1RBQlM7XG4gIH1cbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG5cbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBBUEkgdHlwZS4gUkVTVCBpcyB0aGUgZGVmYXVsdCBhbmQgbWF0Y2hlcyB0b2RheSdzIGJlaGF2aW91ciBleGFjdGx5LiAqL1xuICBhY3RpdmVBcGlUeXBlOiBBcGlFZGl0QXBpVHlwZSA9ICdyZXN0JztcblxuICAvKiogU2VnbWVudHMgcmVuZGVyZWQgYWJvdmUgdGhlIE1ldGhvZC9VUkwgcm93LiBTT0FQL1dlYlNvY2tldC9nUlBDIGFyZSBpbnRlbnRpb25hbGx5IGBkaXNhYmxlZGAgZm9yIG5vdy4gKi9cbiAgcmVhZG9ubHkgYXBpVHlwZVNlZ21lbnRzID0gW1xuICAgIHsgbGFiZWw6ICdSRVNUIEFQSScsICB2YWx1ZTogJ3Jlc3QnIGFzIEFwaUVkaXRBcGlUeXBlIH0sXG4gICAgeyBsYWJlbDogJ0dyYXBoUUwnLCAgIHZhbHVlOiAnZ3JhcGhxbCcgYXMgQXBpRWRpdEFwaVR5cGUgfSxcbiAgICB7IGxhYmVsOiAnU09BUCcsICAgICAgdmFsdWU6ICdzb2FwJyBhcyBBcGlFZGl0QXBpVHlwZSwgICAgICBkaXNhYmxlZDogdHJ1ZSwgdG9vbHRpcDogJ0NvbWluZyBzb29uJyB9LFxuICAgIHsgbGFiZWw6ICdXZWJTb2NrZXQnLCB2YWx1ZTogJ3dlYnNvY2tldCcgYXMgQXBpRWRpdEFwaVR5cGUsIGRpc2FibGVkOiB0cnVlLCB0b29sdGlwOiAnQ29taW5nIHNvb24nIH0sXG4gICAgeyBsYWJlbDogJ2dSUEMnLCAgICAgIHZhbHVlOiAnZ3JwYycgYXMgQXBpRWRpdEFwaVR5cGUsICAgICAgZGlzYWJsZWQ6IHRydWUsIHRvb2x0aXA6ICdDb21pbmcgc29vbicgfSxcbiAgXTtcblxuICAvKiogR3JhcGhRTCBmaWVsZHMgYmFja2luZyB0aGUgbmV3IHRhYiBjb250ZW50LiBWYXJpYWJsZXMgYXJlIHN0b3JlZCBhcyBhIEpTT04gc3RyaW5nIGluIHRoZSBmb3JtIGZvciB0aGUgdGV4dGFyZWEgcm91bmQtdHJpcDsgcGFyc2VkIG9uIGVtaXQuICovXG4gIGdyYXBoUUxGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBJbmxpbmUgZXJyb3IgZGlzcGxheWVkIHVuZGVyIHRoZSBRdWVyeSB0ZXh0YXJlYSB3aGVuIGVtcHR5L2JsYW5rIG9uIFNhdmUuIENsZWFyZWQgYXMgdGhlIHVzZXIgdHlwZXMuICovXG4gIGdyYXBoUUxRdWVyeUVycm9yID0gJyc7XG5cbiAgLyoqIElubGluZSBlcnJvciBkaXNwbGF5ZWQgdW5kZXIgdGhlIFZhcmlhYmxlcyB0ZXh0YXJlYSB3aGVuIEpTT04gaXMgbWFsZm9ybWVkLiAqL1xuICBncmFwaFFMVmFyaWFibGVzRXJyb3IgPSAnJztcblxuICAvKiogTm9uLWJsb2NraW5nIHdhcm5pbmcgc2hvd24gdW5kZXIgdGhlIE9wZXJhdGlvbiBOYW1lIGZpZWxkIHdoZW4gdGhlIHF1ZXJ5IGRlY2xhcmVzIDIrIG9wZXJhdGlvbnMuICovXG4gIGdyYXBoUUxPcGVyYXRpb25XYXJuaW5nID0gJyc7XG5cbiAgLyoqIFN0ZXAgMzogUmVzcG9uc2UgdmVyaWZpY2F0aW9uIHRhYnMgKi9cbiAgcmVhZG9ubHkgcmVzcG9uc2VWZXJpZmljYXRpb25UYWJzOiB7IHZhbHVlOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknLCBsYWJlbDogJ1Jlc3BvbnNlIEJvZHknIH0sXG4gICAgeyB2YWx1ZTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9LFxuICBdO1xuICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cycgPSAncmVzcG9uc2UtYm9keSc7XG5cbiAgLyoqIFBheWxvYWQgdHlwZSBmb3IgQm9keS9QYXJhbXMvQXV0aG9yaXphdGlvbjogcmF3LCB4LXd3dy1mb3JtLXVybGVuY29kZWQsIGZvcm0tZGF0YSAqL1xuICBwYXlsb2FkVHlwZTogJ3JhdycgfCAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdmb3JtLWRhdGEnID0gJ3Jhdyc7XG5cbiAgLyoqIFNlZ21lbnQgb3B0aW9ucyBmb3IgcGF5bG9hZCB0eXBlICh1c2VkIGJ5IGNxYS1zZWdtZW50LWNvbnRyb2wpICovXG4gIHJlYWRvbmx5IHBheWxvYWRUeXBlU2VnbWVudHMgPSBbXG4gICAgeyBsYWJlbDogJ1JhdycsIHZhbHVlOiAncmF3JyB9LFxuICAgIHsgbGFiZWw6ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnLCB2YWx1ZTogJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICB7IGxhYmVsOiAnRm9ybSBEYXRhJywgdmFsdWU6ICdmb3JtLWRhdGEnIH0sXG4gIF07XG5cbiAgb25QYXlsb2FkVHlwZUNoYW5nZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSB2YWwgYXMgJ3JhdycgfCAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdmb3JtLWRhdGEnO1xuICB9XG5cbiAgLyoqIEZvcm0gZm9yIEZvcm1hdCBzZWxlY3QgKEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb24pICovXG4gIHBheWxvYWRGb3JtYXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBGb3JtYXQgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIEpTT04sIFhNTCwgSFRNTCwgVGV4dCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBmb3JtYXRPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBASW5wdXQoKSBpbml0aWFsRm9ybWF0Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRk9STUFUX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdqc29uJywgdmFsdWU6ICdqc29uJywgbmFtZTogJ0pTT04nLCBsYWJlbDogJ0pTT04nIH0sXG4gICAgeyBpZDogJ3htbCcsIHZhbHVlOiAneG1sJywgbmFtZTogJ1hNTCcsIGxhYmVsOiAnWE1MJyB9LFxuICAgIHsgaWQ6ICdodG1sJywgdmFsdWU6ICdodG1sJywgbmFtZTogJ0hUTUwnLCBsYWJlbDogJ0hUTUwnIH0sXG4gICAgeyBpZDogJ3RleHQnLCB2YWx1ZTogJ3RleHQnLCBuYW1lOiAnVGV4dCcsIGxhYmVsOiAnVGV4dCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBGb3JtYXQgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBmb3JtYXRPcHRpb25zIGNoYW5nZXMsIGxpa2UgTWV0aG9kIGRyb3Bkb3duKSAqL1xuICBwYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZm9ybWF0JyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfRk9STUFUX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuZm9ybWF0T3B0aW9ucy5tYXAoKGYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGYpKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfRk9STUFUX09QVElPTlM7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5wYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JtYXRWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLmZvcm1hdE9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZvcm1hdE9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBQYXlsb2FkIHRleHQgYXJlYSB2YWx1ZSBmb3IgQm9keS9QYXJhbXMvQXV0aG9yaXphdGlvbiAqL1xuICBwYXlsb2FkVGV4dCA9ICcnO1xuXG4gIC8qKiBKU09OIHBhcnNlIGVycm9yIHdoZW4gZm9ybWF0IGlzIEpTT04gYW5kIHBheWxvYWQgaXMgaW52YWxpZDsgbnVsbCB3aGVuIHZhbGlkIG9yIG5vdCBKU09OLiAqL1xuICBwYXlsb2FkSnNvbkVycm9yOiB7XG4gICAgbGluZTogbnVtYmVyO1xuICAgIGNvbHVtbjogbnVtYmVyO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBleGNlcnB0OiBzdHJpbmc7XG4gICAgY2FyZXRPZmZzZXQ6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBMaW5lIG51bWJlcnMgZm9yIHBheWxvYWQgdGV4dGFyZWEgKDEsIDIsIDMsIC4uLikgYmFzZWQgb24gY3VycmVudCBsaW5lIGNvdW50LiAqL1xuICBnZXQgcGF5bG9hZExpbmVOdW1iZXJzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgKHRoaXMucGF5bG9hZFRleHQgfHwgJycpLnNwbGl0KC9cXHI/XFxuLykubGVuZ3RoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gaSArIDEpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgY3VycmVudCBwYXlsb2FkIGZvcm1hdCBpcyBKU09OIChzbyB3ZSB2YWxpZGF0ZSBhbmQgc2hvdyBKU09OIGVkaXRvciBiZWhhdmlvcikuICovXG4gIGdldCBpc1BheWxvYWRGb3JtYXRKc29uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0/LmdldCgnZm9ybWF0Jyk/LnZhbHVlO1xuICAgIHJldHVybiBmb3JtYXQgPT09ICdqc29uJztcbiAgfVxuXG4gIC8qKiBFcnJvciBtZXNzYWdlcyBmb3IgdGhlIHBheWxvYWQgdGV4dGFyZWEgKHJlZCBib3JkZXIgKyBib3R0b20gbGluZSkuICovXG4gIGdldCBwYXlsb2FkSnNvbkVycm9ycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucGF5bG9hZEpzb25FcnJvciA/IFsnSW52YWxpZCBKU09OIGZvcm1hdC4gUGxlYXNlIGNoZWNrIHlvdXIgc3ludGF4LiddIDogW107XG4gIH1cblxuICAvKiogVG9vbHRpcCBjb250ZW50IGZvciB0aGUgbGluZS1sZXZlbCBlcnJvciBpY29uIChwYXJzZSBlcnJvciBvbiBsaW5lIFgsIGV4Y2VycHQsIGNhcmV0LCBtZXNzYWdlKS4gKi9cbiAgZ2V0IHBheWxvYWRKc29uRXJyb3JUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnBheWxvYWRKc29uRXJyb3IpIHJldHVybiAnJztcbiAgICBjb25zdCBlID0gdGhpcy5wYXlsb2FkSnNvbkVycm9yO1xuICAgIGNvbnN0IGNhcmV0ID0gJyAnLnJlcGVhdChlLmNhcmV0T2Zmc2V0KSArICdeJztcbiAgICByZXR1cm4gYFBhcnNlIGVycm9yIG9uIGxpbmUgJHtlLmxpbmV9OlxcblxcbiR7ZS5leGNlcnB0fVxcbiR7Y2FyZXR9XFxuXFxuJHtlLm1lc3NhZ2V9YDtcbiAgfVxuXG4gIG9uUGF5bG9hZFRleHRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgfVxuXG4gIG9uUGF5bG9hZElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICB0aGlzLm9uUGF5bG9hZFRleHRDaGFuZ2UodGFyZ2V0Py52YWx1ZSA/PyAnJyk7XG4gIH1cblxuICBvblBheWxvYWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGF5bG9hZEZvcm1hdEpzb24pIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgY2xvc2UgPSBQQVlMT0FEX0FVVE9fQ0xPU0VfUEFJUlNba2V5XTtcbiAgICBpZiAoIWNsb3NlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCA/PyAwO1xuICAgIGNvbnN0IGVuZCA9IHRhcmdldC5zZWxlY3Rpb25FbmQgPz8gc3RhcnQ7XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5wYXlsb2FkVGV4dC5zbGljZSgwLCBzdGFydCk7XG4gICAgY29uc3QgYWZ0ZXIgPSB0aGlzLnBheWxvYWRUZXh0LnNsaWNlKGVuZCk7XG4gICAgY29uc3QgaW5zZXJ0UG9zID0gc3RhcnQgKyAxO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gYmVmb3JlICsga2V5ICsgY2xvc2UgKyBhZnRlcjtcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gbmV3VmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnBheWxvYWRUZXh0YXJlYVJlZj8ubmF0aXZlRWxlbWVudD8uc2V0U2VsZWN0aW9uUmFuZ2UoaW5zZXJ0UG9zLCBpbnNlcnRQb3MpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIHBheWxvYWQgd2hlbiBmb3JtYXQgaXMgSlNPTjsgc2V0cyBwYXlsb2FkSnNvbkVycm9yIG9yIGNsZWFycyBpdC4gKi9cbiAgdmFsaWRhdGVQYXlsb2FkSnNvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQYXlsb2FkRm9ybWF0SnNvbikge1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucGF5bG9hZFRleHQgPz8gJyc7XG4gICAgaWYgKHRleHQudHJpbSgpID09PSAnJykge1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5leHRyYWN0UG9zaXRpb25Gcm9tSnNvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgY29uc3QgeyBsaW5lLCBjb2x1bW4gfSA9IHRoaXMucG9zaXRpb25Ub0xpbmVDb2x1bW4odGV4dCwgcG9zaXRpb24pO1xuICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBjb25zdCBsaW5lSW5kZXggPSBNYXRoLm1heCgwLCBsaW5lIC0gMSk7XG4gICAgICBjb25zdCBsaW5lQ29udGVudCA9IGxpbmVzW2xpbmVJbmRleF0gPz8gJyc7XG4gICAgICBjb25zdCBleGNlcnB0ID0gbGluZUNvbnRlbnQgfHwgJyAnO1xuICAgICAgY29uc3QgY2FyZXRPZmZzZXQgPSBsaW5lSW5kZXggPT09IGxpbmUgLSAxID8gTWF0aC5taW4oY29sdW1uIC0gMSwgbGluZUNvbnRlbnQubGVuZ3RoKSA6IDA7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSB7XG4gICAgICAgIGxpbmUsXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgbWVzc2FnZTogdGhpcy5ub3JtYWxpemVKc29uRXJyb3JNZXNzYWdlKG1lc3NhZ2UpLFxuICAgICAgICBleGNlcnB0LFxuICAgICAgICBjYXJldE9mZnNldCxcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0UG9zaXRpb25Gcm9tSnNvbkVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgbWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC9wb3NpdGlvblxccysoXFxkKykvaSkgfHwgbWVzc2FnZS5tYXRjaCgvYXRcXHMrcG9zaXRpb25cXHMrKFxcZCspL2kpO1xuICAgIHJldHVybiBtYXRjaCA/IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvblRvTGluZUNvbHVtbih0ZXh0OiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB7IGxpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXIgfSB7XG4gICAgY29uc3QgYmVmb3JlID0gdGV4dC5zbGljZSgwLCBNYXRoLm1pbihwb3NpdGlvbiwgdGV4dC5sZW5ndGgpKTtcbiAgICBjb25zdCBsaW5lcyA9IGJlZm9yZS5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lcy5sZW5ndGg7XG4gICAgY29uc3QgbGFzdExpbmUgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA/PyAnJztcbiAgICByZXR1cm4geyBsaW5lLCBjb2x1bW46IGxhc3RMaW5lLmxlbmd0aCArIDEgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplSnNvbkVycm9yTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdFeHBlY3RpbmcnKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCdleHBlY3RpbmcnKSkgcmV0dXJuIG1lc3NhZ2U7XG4gICAgY29uc3QgdG9rZW5NYXRjaCA9IG1lc3NhZ2UubWF0Y2goL1VuZXhwZWN0ZWQgdG9rZW5cXHMrWydcIl0/KFteJ1wiXSspWydcIl0/L2kpXG4gICAgICB8fCBtZXNzYWdlLm1hdGNoKC91bmV4cGVjdGVkIGNoYXJhY3Rlci4qPyhbXlxcc10rKS9pKTtcbiAgICBjb25zdCB0b2tlbiA9IHRva2VuTWF0Y2ggPyB0b2tlbk1hdGNoWzFdLnRyaW0oKSA6ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiBgRXhwZWN0aW5nICdTVFJJTkcnLCAnTlVNQkVSJywgJ05VTEwnLCAnVFJVRScsICdGQUxTRScsICd7JywgJ1snLCBnb3QgJyR7dG9rZW59J2A7XG4gIH1cblxuICBAVmlld0NoaWxkKCdwYXlsb2FkRWRpdG9yV2l0aExpbmVzUmVmJykgcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdwYXlsb2FkVGV4dGFyZWFSZWYnKSBwYXlsb2FkVGV4dGFyZWFSZWY/OiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSEVBREVSX05BTUVfT1BUSU9OUzogc3RyaW5nW10gPSBbXG4gICAgJ0FjY2VwdCcsXG4gICAgJ0FjY2VwdC1DaGFyc2V0JyxcbiAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAnQWNjZXB0LUxhbmd1YWdlJyxcbiAgICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzJyxcbiAgICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QnLFxuICAgICdTY3JpcHRzJyxcbiAgICAnQ2FjaGUtQ29udHJvbCcsXG4gICAgJ0NvbnRlbnQtTUQ1JyxcbiAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJyxcbiAgICAnQ29udGVudC1UeXBlJyxcbiAgICAnQ29va2llJyxcbiAgICAnRGF0ZScsXG4gICAgJ0V4cGVjdCcsXG4gICAgJ0Zyb20nLFxuICAgICdIb3N0JyxcbiAgICAnSWYtTWF0Y2gnLFxuICAgICdJZi1Nb2RpZmllZC1TaW5jZScsXG4gICAgJ0lmLU5vbmUtTWF0Y2gnLFxuICAgICdJZi1Vbm1vZGlmaWVkLVNpbmNlJyxcbiAgICAnSWYtUmFuZ2UnLFxuICAgICdLZWVwLUFsaXZlJyxcbiAgICAnTWF4LUZvcndhcmRzJyxcbiAgICAnT3JpZ2luJyxcbiAgICAnUHJhZ21hJyxcbiAgICAnUHJveHktQXV0aG9yaXphdGlvbicsXG4gICAgJ1JhbmdlJyxcbiAgICAnUmVmZXJlcicsXG4gICAgJ1RFJyxcbiAgICAnVHJhaWxlcicsXG4gICAgJ1RyYW5zZmVyLUVuY29kaW5nJyxcbiAgICAnVXBncmFkZScsXG4gICAgJ1VzZXItQWdlbnQnLFxuICAgICdWaWEnLFxuICAgICdXYXJuaW5nJyxcbiAgICAnWC1SZXF1ZXN0ZWQtV2l0aCcsXG4gICAgJ1gtRG8tTm90LVRyYWNrJyxcbiAgICAnRE5UJyxcbiAgICAneC1hcGkta2V5JyxcbiAgICAnQ29ubmVjdGlvbicsXG4gIF07XG5cbiAgLyoqIEhlYWRlciBuYW1lIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBoZWFkZXJOYW1lT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIGhlYWRlciByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsgbmFtZSwgdmFsdWUgfSkgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBhbmQgdmFsdWUgaW5wdXQgKi9cbiAgaGVhZGVyc0Zvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICAvKiogVHlwZWQgYWNjZXNzb3IgZm9yIHRlbXBsYXRlIChGb3JtQXJyYXkuY29udHJvbHMgaXMgQWJzdHJhY3RDb250cm9sW10pICovXG4gIGdldCBoZWFkZXJSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgaGVhZGVyIG5hbWUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBoZWFkZXJOYW1lT3B0aW9ucyBjaGFuZ2VzIHRvIGF2b2lkIG5ldyByZWZlcmVuY2UgZXZlcnkgQ0QpICovXG4gIGhlYWRlck5hbWVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICduYW1lJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBoZWFkZXInLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgYWxsb3dDdXN0b21WYWx1ZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmhlYWRlck5hbWVPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfSEVBREVSX05BTUVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIGNvbnN0IGJhc2VPcHRpb25zID0gc291cmNlLm1hcCgoaCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oaCkpO1xuICAgIGNvbnN0IGJhc2VWYWx1ZXMgPSBuZXcgU2V0KGJhc2VPcHRpb25zLm1hcCgobykgPT4gU3RyaW5nKG8udmFsdWUgPz8gby5pZCA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIGNvbnN0IGN1cnJlbnROYW1lc0Zyb21Gb3JtID0gdGhpcy5nZXRDdXJyZW50SGVhZGVyTmFtZXNGcm9tRm9ybSgpO1xuICAgIGNvbnN0IGV4dHJhT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY3VycmVudE5hbWVzRnJvbUZvcm0pIHtcbiAgICAgIGNvbnN0IGtleSA9IG5hbWUudHJpbSgpO1xuICAgICAgaWYgKGtleSAmJiAhYmFzZVZhbHVlcy5oYXMoa2V5KSkge1xuICAgICAgICBiYXNlVmFsdWVzLmFkZChrZXkpO1xuICAgICAgICBleHRyYU9wdGlvbnMucHVzaCh7IGlkOiBrZXksIHZhbHVlOiBrZXksIG5hbWU6IGtleSwgbGFiZWw6IGtleSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IFsuLi5iYXNlT3B0aW9ucywgLi4uZXh0cmFPcHRpb25zXTtcbiAgICB0aGlzLmhlYWRlck5hbWVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmhlYWRlck5hbWVTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29sbGVjdHMgZGlzdGluY3Qgbm9uLWVtcHR5IGhlYWRlciBuYW1lcyBjdXJyZW50bHkgaW4gdGhlIGhlYWRlcnMgZm9ybSAoZm9yIGR5bmFtaWMgb3B0aW9ucykuICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudEhlYWRlck5hbWVzRnJvbUZvcm0oKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBpZiAoIXRoaXMuaGVhZGVyc0Zvcm1BcnJheT8uY29udHJvbHM/Lmxlbmd0aCkgcmV0dXJuIG5hbWVzO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmhlYWRlcnNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZTtcbiAgICAgIGNvbnN0IHN0ciA9IG5hbWUgIT0gbnVsbCA/IFN0cmluZyhuYW1lKS50cmltKCkgOiAnJztcbiAgICAgIGlmIChzdHIgJiYgIXNlZW4uaGFzKHN0cikpIHtcbiAgICAgICAgc2Vlbi5hZGQoc3RyKTtcbiAgICAgICAgbmFtZXMucHVzaChzdHIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRIZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBbXG4gICAgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgXTtcblxuICAvKiogRm9ybSBhcnJheSBmb3Iga2V5LXZhbHVlIHJvd3MgKEJvZHkgcGF5bG9hZCk7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBrZXksIHZhbHVlIH0pICovXG4gIGtleVZhbHVlRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBrZXlWYWx1ZVJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5rZXlWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIGtleS10eXBlLXZhbHVlIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBrZXksIHR5cGUsIHZhbHVlIH0pICovXG4gIGtleVR5cGVWYWx1ZUZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQga2V5VHlwZVZhbHVlUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIFBhcmFtcyB0YWIga2V5LXZhbHVlIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBrZXksIHZhbHVlIH0pICovXG4gIHBhcmFtc0Zvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQgcGFyYW1zUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLnBhcmFtc0Zvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgVHlwZSBkcm9wZG93biBpbiBrZXktdHlwZS12YWx1ZSByb3dzIChUZXh0LCBGaWxlKSAqL1xuICByZWFkb25seSBrZXlUeXBlVmFsdWVUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXh0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IGlkOiAndGV4dCcsIHZhbHVlOiAndGV4dCcsIG5hbWU6ICdUZXh0JywgbGFiZWw6ICdUZXh0JyB9LFxuICAgICAgeyBpZDogJ2ZpbGUnLCB2YWx1ZTogJ2ZpbGUnLCBuYW1lOiAnRmlsZScsIGxhYmVsOiAnRmlsZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciByZXNwb25zZSBib2R5IHZlcmlmaWNhdGlvbiByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsganNvblBhdGgsIHZlcmlmaWNhdGlvbiwgZGF0YVR5cGUsIGV4cGVjdGVkVmFsdWUgfSkgKi9cbiAgdmVyaWZpY2F0aW9uRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCB2ZXJpZmljYXRpb25Sb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogVmVyaWZpY2F0aW9uIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHZlcmlmaWNhdGlvbk9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdFcXVhbHMnLCBsYWJlbDogJ0VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90LWVxdWFsJywgdmFsdWU6ICdub3QtZXF1YWwnLCBuYW1lOiAnTm90IGVxdWFsJywgbGFiZWw6ICdOb3QgZXF1YWwnIH0sXG4gICAgeyBpZDogJ2xlc3MtdGhhbicsIHZhbHVlOiAnbGVzcy10aGFuJywgbmFtZTogJ0xlc3MgdGhhbicsIGxhYmVsOiAnTGVzcyB0aGFuJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyLXRoYW4nLCB2YWx1ZTogJ2dyZWF0ZXItdGhhbicsIG5hbWU6ICdHcmVhdGVyIHRoYW4nLCBsYWJlbDogJ0dyZWF0ZXIgdGhhbicgfSxcbiAgICB7IGlkOiAnaXMtbnVsbCcsIHZhbHVlOiAnaXMtbnVsbCcsIG5hbWU6ICdJcyBudWxsJywgbGFiZWw6ICdJcyBudWxsJyB9LFxuICAgIHsgaWQ6ICdpcy1ub3QtbnVsbCcsIHZhbHVlOiAnaXMtbm90LW51bGwnLCBuYW1lOiAnSXMgbm90IG51bGwnLCBsYWJlbDogJ0lzIG5vdCBudWxsJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIFZlcmlmaWNhdGlvbiBkcm9wZG93biAodXBkYXRlZCB3aGVuIHZlcmlmaWNhdGlvbk9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHZlcmlmaWNhdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdFcXVhbHMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uT3B0aW9ucy5tYXAoKHYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKHYpKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlM7XG4gICAgdGhpcy52ZXJpZmljYXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25PcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKCh2KSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWZXJpZmljYXRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdlcXVhbHMnO1xuICB9XG5cbiAgLyoqIERhdGEgVHlwZSBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSB2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfREFUQV9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdzdHJpbmcnLCB2YWx1ZTogJ3N0cmluZycsIG5hbWU6ICdTdHJpbmcnLCBsYWJlbDogJ1N0cmluZycgfSxcbiAgICB7IGlkOiAnbnVtYmVyJywgdmFsdWU6ICdudW1iZXInLCBuYW1lOiAnTnVtYmVyJywgbGFiZWw6ICdOdW1iZXInIH0sXG4gICAgeyBpZDogJ2Jvb2xlYW4nLCB2YWx1ZTogJ2Jvb2xlYW4nLCBuYW1lOiAnQm9vbGVhbicsIGxhYmVsOiAnQm9vbGVhbicgfSxcbiAgICB7IGlkOiAnYXJyYXknLCB2YWx1ZTogJ2FycmF5JywgbmFtZTogJ0FycmF5JywgbGFiZWw6ICdBcnJheScgfSxcbiAgICB7IGlkOiAnb2JqZWN0JywgdmFsdWU6ICdvYmplY3QnLCBuYW1lOiAnT2JqZWN0JywgbGFiZWw6ICdPYmplY3QnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgRGF0YSBUeXBlIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gdmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zIGNoYW5nZXMsIGxpa2UgTWV0aG9kIGRyb3Bkb3duKSAqL1xuICB2ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RhdGFUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1N0cmluZycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfREFUQV9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zLm1hcCgoZCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZCkpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUztcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YVR5cGVWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfREFUQV9UWVBFX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChkKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHREYXRhVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVR5cGVWYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiAnc3RyaW5nJztcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIEV4cGVjdGVkIFZhbHVlIHdoZW4gRGF0YSBUeXBlIGlzIEJvb2xlYW4gKHRydWUvZmFsc2UgZHJvcGRvd24pICovXG4gIHJlYWRvbmx5IHZlcmlmaWNhdGlvbkV4cGVjdGVkVmFsdWVCb29sZWFuU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZXhwZWN0ZWRWYWx1ZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgaWQ6ICd0cnVlJywgdmFsdWU6ICd0cnVlJywgbmFtZTogJ3RydWUnLCBsYWJlbDogJ3RydWUnIH0sXG4gICAgICB7IGlkOiAnZmFsc2UnLCB2YWx1ZTogJ2ZhbHNlJywgbmFtZTogJ2ZhbHNlJywgbGFiZWw6ICdmYWxzZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBTdGF0dXMgdGFiIHZlcmlmaWNhdGlvbiByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsgdmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlIH0pICovXG4gIHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQgc3RhdHVzVmVyaWZpY2F0aW9uUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gZHJvcGRvd24gKEVxdWFscywgTm90IGVxdWFsLCBMZXNzIHRoYW4sIEdyZWF0ZXIgdGhhbikgKi9cbiAgLyoqIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIG9wdGlvbnMgKEVxdWFscywgTm90IGVxdWFsLCBldGMuKS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRXF1YWxzJywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgeyBpZDogJ25vdC1lcXVhbCcsIHZhbHVlOiAnbm90LWVxdWFsJywgbmFtZTogJ05vdCBlcXVhbCcsIGxhYmVsOiAnTm90IGVxdWFsJyB9LFxuICAgIHsgaWQ6ICdsZXNzLXRoYW4nLCB2YWx1ZTogJ2xlc3MtdGhhbicsIG5hbWU6ICdMZXNzIHRoYW4nLCBsYWJlbDogJ0xlc3MgdGhhbicgfSxcbiAgICB7IGlkOiAnZ3JlYXRlci10aGFuJywgdmFsdWU6ICdncmVhdGVyLXRoYW4nLCBuYW1lOiAnR3JlYXRlciB0aGFuJywgbGFiZWw6ICdHcmVhdGVyIHRoYW4nIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zIGNoYW5nZXMpLiAqL1xuICBzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2ZXJpZmljYXRpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnRXF1YWxzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5zdGF0dXNWZXJpZmljYXRpb25PcHRpb25zLm1hcCgobykgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24obykpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlM7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5zdGF0dXNWZXJpZmljYXRpb25PcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgobykgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUobyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiAnZXF1YWxzJztcbiAgfVxuXG4gIHJlc3BvbnNlUHJldmlldyA9IGBgO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJlc3BvbnNlIHByZXZpZXcgc2VjdGlvbiwgdXNlZCB0byBzY3JvbGwgaW50byB2aWV3IGFmdGVyIFNlbmQgUmVxdWVzdCBjb21wbGV0ZXMuICovXG4gIEBWaWV3Q2hpbGQoJ3Jlc3BvbnNlUHJldmlld1JlZicsIHsgc3RhdGljOiBmYWxzZSB9KSByZXNwb25zZVByZXZpZXdSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIG1ldGhvZENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybWF0Q2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBoZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBtZXRob2RGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8vIEFkdmFuY2VkIHNldHRpbmdzOiBnZW5lcmljIGFkdmFuY2VkIHZhcmlhYmxlcyBmb3IgdGhpcyBBUEkgc3RlcCAoY2FuIGJlIHByb3ZpZGVkIGJ5IHBhcmVudClcbiAgYWR2YW5jZWRFeHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIGFkdmFuY2VkVmFyaWFibGVzRm9ybTogRm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUluaXRpYWxTdGVwKHRoaXMuaW5pdGlhbFN0ZXApO1xuICAgIHRoaXMudXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIGRlZmF1bHRNZXRob2QgPT09ICdzdHJpbmcnID8gZGVmYXVsdE1ldGhvZCA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0TWV0aG9kIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLm1ldGhvZEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG1ldGhvZDogW2RlZmF1bHRNZXRob2RdLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdEVudiA9IHRoaXMuaW5pdGlhbEVudmlyb25tZW50ID8/IGZpcnN0VmFsdWUgPz8gJ0RldmVsb3BtZW50JztcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZW52aXJvbm1lbnQ6IFtkZWZhdWx0RW52XSxcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUF1dGhUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3QgZmlyc3RBdXRoVmFsdWUgPSB0aGlzLmdldEF1dGhUeXBlVmFsdWVzKClbMF07XG4gICAgY29uc3QgZGVmYXVsdEF1dGhUeXBlID0gdGhpcy5pbml0aWFsQXV0aFR5cGUgPz8gZmlyc3RBdXRoVmFsdWUgPz8gJ25vLWF1dGgnO1xuICAgIHRoaXMuYXV0aFR5cGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBhdXRoVHlwZTogW2RlZmF1bHRBdXRoVHlwZV0sXG4gICAgfSk7XG4gICAgdGhpcy5vYXV0aDJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncmFudFR5cGU6IFsnY2xpZW50X2NyZWRlbnRpYWxzJ10sXG4gICAgICBhY2Nlc3NUb2tlblVybDogWycnXSxcbiAgICAgIGNsaWVudElkOiBbJyddLFxuICAgICAgY2xpZW50U2VjcmV0OiBbJyddLFxuICAgICAgc2NvcGU6IFsnJ10sXG4gICAgICBjbGllbnRBdXRoZW50aWNhdGlvbjogWydiYXNpYyddLFxuICAgIH0pO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1YiA9IHRoaXMuZW52aXJvbm1lbnRGb3JtLmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKHY6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHMgPSB2ICE9IG51bGwgJiYgdiAhPT0gJycgPyAodHlwZW9mIHYgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2KSkgOiAnJztcbiAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSBzID8/ICcnO1xuICAgIH0pO1xuICAgIHRoaXMubWV0aG9kRm9ybUNoYW5nZXNTdWIgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKHY6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHMgPSB2ICE9IG51bGwgJiYgdiAhPT0gJycgPyAodHlwZW9mIHYgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2KSkgOiAnJztcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShcbiAgICAgIHRoaXMuaW5pdGlhbEhlYWRlcnMgPz8gW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV1cbiAgICApO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViID0gdGhpcy5oZWFkZXJzRm9ybUFycmF5Py52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcbiAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3QgZmlyc3RGb3JtYXRWYWx1ZSA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF07XG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHRoaXMuaW5pdGlhbEZvcm1hdCA/PyBmaXJzdEZvcm1hdFZhbHVlID8/ICdqc29uJztcbiAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtID0gdGhpcy5mYi5ncm91cCh7IGZvcm1hdDogW2RlZmF1bHRGb3JtYXRdIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwYXlsb2FkIHR5cGUgYW5kIHRleHQgZnJvbSBpbnB1dHMgd2hlbiBlZGl0aW5nXG4gICAgaWYgKHRoaXMuaW5pdGlhbFBheWxvYWRUeXBlKSB7XG4gICAgICB0aGlzLnBheWxvYWRUeXBlID0gdGhpcy5pbml0aWFsUGF5bG9hZFR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxQYXlsb2FkVGV4dCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnBheWxvYWRUZXh0ID0gdGhpcy5pbml0aWFsUGF5bG9hZFRleHQ7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheUNoYW5nZXNTdWIgPSB0aGlzLnBhcmFtc0Zvcm1BcnJheS52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmNVcmxGcm9tUGFyYW1zKCkpO1xuICAgIGlmICh0aGlzLmluaXRpYWxVcmwgIT0gbnVsbCAmJiB0aGlzLmluaXRpYWxVcmwgIT09ICcnKSB7XG4gICAgICB0aGlzLl91cmwgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5kZWNvZGVVcmxGb3JEaXNwbGF5KHRoaXMuaW5pdGlhbFVybCk7XG4gICAgICB0aGlzLnN5bmNQYXJhbXNGcm9tVXJsKCk7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVOYW1lIGZyb20gaW5pdGlhbFZhcmlhYmxlTmFtZVxuICAgIGlmICh0aGlzLmluaXRpYWxWYXJpYWJsZU5hbWUgIT0gbnVsbCAmJiB0aGlzLmluaXRpYWxWYXJpYWJsZU5hbWUgIT09ICcnKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBzdW1tYXJ5IGZyb20gaW5pdGlhbFN1bW1hcnkgKHN0ZXAgZGVzY3JpcHRpb24pXG4gICAgaWYgKHRoaXMuaW5pdGlhbFN1bW1hcnkgIT0gbnVsbCAmJiB0aGlzLmluaXRpYWxTdW1tYXJ5ICE9PSAnJykge1xuICAgICAgdGhpcy5zdW1tYXJ5ID0gdGhpcy5pbml0aWFsU3VtbWFyeTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZlcmlmaWNhdGlvbiByb3dzIGZyb20gaW5wdXRzIHdoZW4gcHJvdmlkZWQ7IG90aGVyd2lzZSBidWlsZCBkZWZhdWx0c1xuICAgIGNvbnN0IGJvZHlSb3dzID1cbiAgICAgIHRoaXMuaW5pdGlhbFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMgJiYgdGhpcy5pbml0aWFsUmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5pbml0aWFsUmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KGJvZHlSb3dzKTtcblxuICAgIHRoaXMudXBkYXRlU3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3Qgc3RhdHVzUm93cyA9XG4gICAgICB0aGlzLmluaXRpYWxTdGF0dXNWZXJpZmljYXRpb25zICYmIHRoaXMuaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5idWlsZFN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheShzdGF0dXNSb3dzKTtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWIgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICAgIGlmIChNRVRIT0RTX1dJVEhPVVRfQk9EWS5pbmNsdWRlcyhtZXRob2QpICYmIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiAhPT0gJ2hlYWRlcnMnKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybWF0Q2hhbmdlc1N1YiA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0uZ2V0KCdmb3JtYXQnKT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjdGl2ZSByZXNwb25zZSB2ZXJpZmljYXRpb24gdGFiIGZyb20gaW5wdXQgd2hlbiBwcm92aWRlZFxuICAgIGlmICh0aGlzLmluaXRpYWxBY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYikge1xuICAgICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9IHRoaXMuaW5pdGlhbEFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGFkdmFuY2VkIHNldHRpbmdzIGZvcm0gb25seSBmcm9tIGlucHV0IHZhcmlhYmxlcyAobm8gbG9jYWwgaW5pdGlhbGl6YXRpb24pXG4gICAgaWYgKHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyAmJiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgIH1cblxuICAgIC8vIEdyYXBoUUwgZm9ybSArIGluaXRpYWwgc3RhdGUuIEh5ZHJhdGUgZnJvbSBgaW5pdGlhbEFwaVR5cGVgIC8gYGluaXRpYWxHcmFwaFFMYCBpZiB0aGUgcGFyZW50XG4gICAgLy8gaXMgZWRpdGluZyBhIEdyYXBoUUwgc3RlcC4gVmFyaWFibGVzIGNvbWUgaW4gYXMgZWl0aGVyIGFuIG9iamVjdCAocHJlZmVycmVkKSBvciBhIEpTT04gc3RyaW5nIOKAlFxuICAgIC8vIHdlIGFsd2F5cyBzdG9yZSB0aGUgZm9ybSB2YWx1ZSBhcyBhIHByZXR0eS1wcmludGVkIEpTT04gc3RyaW5nIHNvIHRoZSB0ZXh0YXJlYSByb3VuZC10cmlwcyBjbGVhbmx5LlxuICAgIHRoaXMuYWN0aXZlQXBpVHlwZSA9IHRoaXMuaW5pdGlhbEFwaVR5cGUgPT09ICdncmFwaHFsJyA/ICdncmFwaHFsJyA6ICdyZXN0JztcbiAgICBjb25zdCBpbml0aWFsUXVlcnkgPSB0aGlzLmluaXRpYWxHcmFwaFFMPy5xdWVyeSA/PyAnJztcbiAgICBjb25zdCBpbml0aWFsVmFyc1JhdyA9IHRoaXMuaW5pdGlhbEdyYXBoUUw/LnZhcmlhYmxlcztcbiAgICBsZXQgaW5pdGlhbFZhcmlhYmxlc1N0cmluZyA9ICcnO1xuICAgIGlmIChpbml0aWFsVmFyc1JhdyAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGluaXRpYWxWYXJzUmF3ID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbml0aWFsVmFyaWFibGVzU3RyaW5nID0gaW5pdGlhbFZhcnNSYXc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGluaXRpYWxWYXJpYWJsZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShpbml0aWFsVmFyc1JhdywgbnVsbCwgMik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGluaXRpYWxWYXJpYWJsZXNTdHJpbmcgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbml0aWFsT3BlcmF0aW9uTmFtZSA9IHRoaXMuaW5pdGlhbEdyYXBoUUw/Lm9wZXJhdGlvbk5hbWUgPz8gJyc7XG4gICAgdGhpcy5ncmFwaFFMRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgcXVlcnk6IFtpbml0aWFsUXVlcnldLFxuICAgICAgdmFyaWFibGVzOiBbaW5pdGlhbFZhcmlhYmxlc1N0cmluZ10sXG4gICAgICBvcGVyYXRpb25OYW1lOiBbaW5pdGlhbE9wZXJhdGlvbk5hbWVdLFxuICAgIH0pO1xuICAgIC8vIFJlLXZhbGlkYXRlIGFzIHRoZSB1c2VyIHR5cGVzIHNvIGlubGluZSBlcnJvcnMgY2xlYXIvcmUtcmVuZGVyIGluIHJlYWwgdGltZS5cbiAgICB0aGlzLmdyYXBoUUxGb3JtLmdldCgncXVlcnknKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5ncmFwaFFMUXVlcnlFcnJvcikgdGhpcy5ncmFwaFFMUXVlcnlFcnJvciA9ICcnO1xuICAgICAgdGhpcy5yZWNvbXB1dGVHcmFwaFFMT3BlcmF0aW9uV2FybmluZygpO1xuICAgIH0pO1xuICAgIHRoaXMuZ3JhcGhRTEZvcm0uZ2V0KCd2YXJpYWJsZXMnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlR3JhcGhRTFZhcmlhYmxlcyhmYWxzZSk7XG4gICAgfSk7XG4gICAgdGhpcy5ncmFwaFFMRm9ybS5nZXQoJ29wZXJhdGlvbk5hbWUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29tcHV0ZUdyYXBoUUxPcGVyYXRpb25XYXJuaW5nKCk7XG4gICAgfSk7XG4gICAgLy8gRGVmYXVsdCB0aGUgYWN0aXZlIHRhYiB0byBcImdyYXBocWxcIiB3aGVuIHRoZSB1c2VyIGlzIGVkaXRpbmcgYSBHcmFwaFFMIHN0ZXAsXG4gICAgLy8gc28gdGhlIFF1ZXJ5IC8gVmFyaWFibGVzIC8gT3BlcmF0aW9uIE5hbWUgZmllbGRzIGFyZSB2aXNpYmxlIGltbWVkaWF0ZWx5LlxuICAgIGlmICh0aGlzLmFjdGl2ZUFwaVR5cGUgPT09ICdncmFwaHFsJykge1xuICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2dyYXBocWwnO1xuICAgIH1cbiAgICB0aGlzLnJlY29tcHV0ZUdyYXBoUUxPcGVyYXRpb25XYXJuaW5nKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFBheWxvYWRUZXh0YXJlYVNjcm9sbFN5bmMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubWV0aG9kQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWV0aG9kRm9ybUNoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIFN5bmMgbGluZSBudW1iZXJzIGNvbHVtbiBzY3JvbGwgd2l0aCBwYXlsb2FkIHRleHRhcmVhIHNjcm9sbCAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMucGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghaG9zdCkgcmV0dXJuO1xuICAgICAgY29uc3QgbGluZU51bWJlcnNFbCA9IGhvc3QucXVlcnlTZWxlY3RvcignLmNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgY29uc3QgdGV4dGFyZWEgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoIWxpbmVOdW1iZXJzRWwgfHwgIXRleHRhcmVhKSByZXR1cm47XG4gICAgICB0ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wID0gdGV4dGFyZWEuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgICBsaW5lTnVtYmVyc0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgdGV4dGFyZWEuc2Nyb2xsVG9wID0gbGluZU51bWJlcnNFbC5zY3JvbGxUb3A7XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+IHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFtyLmtleV0sIHZhbHVlOiBbci52YWx1ZV0gfSkpO1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdHlwZTogJ3RleHQnLCB2YWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+IHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFtyLmtleV0sIHR5cGU6IFtyLnR5cGVdLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYXJhbXNGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICBpZiAodGhpcy5wYXJhbXNGb3JtQXJyYXkpIHtcbiAgICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5wYXJhbXNGb3JtQXJyYXkucHVzaChnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyYW1zRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUcnVlIGlmIFVSTCBpcyBhIHBhcmFtZXRlciBwbGFjZWhvbGRlciAoZS5nLiAqfHBhcmFtfCk7IG11c3Qgbm90IGJlIHBhcnNlZCB3aXRoIFVSTCgpIHdoaWNoIGVuY29kZXMgfCB0byAlN0MuICovXG4gIHByaXZhdGUgc3RhdGljIGlzUGFyYW1ldGVyVXJsKHVybFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF1cmxTdHIgfHwgdHlwZW9mIHVybFN0ciAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gLyhcXCpcXHxbXFx3LV0rXFx8KFxcKik/fFxcJFxcfFtcXHctXStcXHwoXFwqKT98QFxcfFtcXHctXStcXHwoXFwqKT98XFwkXFx7W159XStcXH0pLy50ZXN0KHVybFN0ci50cmltKCkpO1xuICB9XG5cbiAgLyoqIERlY29kZSBVUkwgZm9yIGRpc3BsYXkvcGF5bG9hZDogc3RyaXAgLyogcHJlZml4IGFuZCBkZWNvZGUgJTdDIHRvIHwgc28gKnxwYXJhbXwgc2hvd3MgY29ycmVjdGx5LiAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVVcmxGb3JEaXNwbGF5KHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICAgIGxldCBzID0gcmF3LnRyaW0oKTtcbiAgICBpZiAoIXMpIHJldHVybiAnJztcbiAgICBpZiAocy5zdGFydHNXaXRoKCcvKicpKSBzID0gcy5zbGljZSgyKS50cmltKCk7XG4gICAgaWYgKHMuaW5jbHVkZXMoJyU3QycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzID0gZGVjb2RlVVJJQ29tcG9uZW50KHMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGxlYXZlIGFzLWlzICovXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqIFBhcnNlIFVSTCBpbnRvIGJhc2UgKHdpdGhvdXQgcXVlcnkvZnJhZ21lbnQpIGFuZCBxdWVyeSBrZXktdmFsdWUgcGFpcnMuIFByZXNlcnZlcyByZWxhdGl2ZSBVUkxzIGFuZCBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzLiAqL1xuICBwcml2YXRlIHBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHVybFN0cjogc3RyaW5nKTogeyBiYXNlVXJsOiBzdHJpbmc7IHJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIH0ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB1cmxTdHI/LnRyaW0oKSA/PyAnJztcbiAgICBjb25zdCBlbXB0eSA9IHsgYmFzZVVybDogdHJpbW1lZCB8fCB1cmxTdHIsIHJvd3M6IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSB9O1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIGVtcHR5O1xuICAgIGlmIChBcGlFZGl0U3RlcENvbXBvbmVudC5pc1BhcmFtZXRlclVybCh1cmxTdHIpKSByZXR1cm4gZW1wdHk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHRyaW1tZWQpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICBjb25zdCBiYXNlVXJsID0gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcm93cy5wdXNoKHsga2V5OiAnJywgdmFsdWU6ICcnIH0pO1xuICAgICAgcmV0dXJuIHsgYmFzZVVybCwgcm93cyB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgYmFzZSBVUkwgKHdpdGhvdXQgcXVlcnkvZnJhZ21lbnQpIGZvciBidWlsZGluZyBVUkwgZnJvbSBwYXJhbXMuIFByZXNlcnZlcyByZWxhdGl2ZSBVUkxzIGFuZCBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzLiAqL1xuICBwcml2YXRlIGdldEJhc2VVcmwodXJsU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsU3RyIHx8ICF1cmxTdHIudHJpbSgpKSByZXR1cm4gdXJsU3RyO1xuICAgIGlmIChBcGlFZGl0U3RlcENvbXBvbmVudC5pc1BhcmFtZXRlclVybCh1cmxTdHIpKSByZXR1cm4gdXJsU3RyLnRyaW0oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsU3RyLnRyaW0oKSk7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHVybFN0ciwgJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgICAgIHJldHVybiBpc0Fic29sdXRlID8gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSA6IHVybC5wYXRobmFtZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1cmxTdHI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGF5bG9hZCBmb3JtYXQgZHJvcGRvd24gdXNpbmcgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZmlyc3QsIHRoZW5cbiAgICogZmFsbCBiYWNrIHRvIGluc3BlY3RpbmcgdGhlIGJvZHkgY29udGVudCAoSlNPTiBicmFjZXMsIFhNTCB0YWdzLCBIVE1MIGRvY3R5cGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUJvZHlGb3JtYXQoYm9keTogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybWF0VmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEZvcm1hdEZvcm0gfHwgZm9ybWF0VmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGN0ID0gKGNvbnRlbnRUeXBlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNldEZtdCA9IChmbXQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZvcm1hdFZhbHVlcy5pbmNsdWRlcyhmbXQpKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZtdCB9KTtcbiAgICB9O1xuICAgIC8vIENvbnRlbnQtVHlwZSB0YWtlcyBwcmlvcml0eVxuICAgIGlmIChjdC5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L2pzb24nKSkgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgnanNvbicpO1xuICAgIGlmIChjdC5pbmNsdWRlcygnYXBwbGljYXRpb24veG1sJykgfHwgY3QuaW5jbHVkZXMoJ3RleHQveG1sJykgfHwgY3QuaW5jbHVkZXMoJ3hodG1sJykpIHJldHVybiBzZXRGbXQoJ3htbCcpO1xuICAgIGlmIChjdC5pbmNsdWRlcygndGV4dC9odG1sJykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0Rm10KCdodG1sJyk7XG4gICAgaWYgKGN0LmluY2x1ZGVzKCd0ZXh0L3BsYWluJykgfHwgY3QuaW5jbHVkZXMoJ3RleHQvY3N2JykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgndGV4dCcpO1xuICAgIC8vIEZhbGwgYmFjayB0byBib2R5LWNvbnRlbnQgaW5zcGVjdGlvblxuICAgIGNvbnN0IHQgPSAoYm9keSA/PyAnJykudHJpbSgpO1xuICAgIGlmICgodC5zdGFydHNXaXRoKCd7JykgJiYgdC5lbmRzV2l0aCgnfScpKSB8fCAodC5zdGFydHNXaXRoKCdbJykgJiYgdC5lbmRzV2l0aCgnXScpKSkgIHJldHVybiBzZXRGbXQoJ2pzb24nKTtcbiAgICBpZiAodC5zdGFydHNXaXRoKCc8P3htbCcpIHx8ICh0LnN0YXJ0c1dpdGgoJzwnKSAmJiAhdC5zdGFydHNXaXRoKCc8IScpICYmICF0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnPCFkb2N0eXBlJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0Rm10KCd4bWwnKTtcbiAgICBpZiAodC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzwhZG9jdHlwZSBodG1sJykgfHwgdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzxodG1sJykpIHJldHVybiBzZXRGbXQoJ2h0bWwnKTtcbiAgfVxuXG4gIC8qKiBQYXJzZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSAoa2V5PXZhbHVlJi4uLikgaW50byBrZXktdmFsdWUgcm93cy4gKi9cbiAgcHJpdmF0ZSBwYXJzZUZvcm1VcmxFbmNvZGVkQm9keShib2R5OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IChib2R5ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModHJpbW1lZCk7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGZvcm0gYm9keSBoYXMgYSBzaW5nbGUga2V5IHdob3NlIHZhbHVlIGlzIFVSTC1kZWNvZGVkIEpTT04sIHJldHVybiBpdCBwcmV0dHktcHJpbnRlZCBmb3IgUmF3IGJvZHkuXG4gICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCAoY2FsbGVyIGtlZXBzIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCB2aWV3KS5cbiAgICovXG4gIHByaXZhdGUgdHJ5Rm9ybUJvZHlWYWx1ZUFzUmF3SnNvbihyb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gMSB8fCAhcm93c1swXS52YWx1ZT8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd3NbMF0udmFsdWUudHJpbSgpO1xuICAgIGlmICghKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdbJykpKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVcGRhdGUgUGFyYW1zIHRhYmxlIGZyb20gY3VycmVudCBVUkwgcXVlcnkgc3RyaW5nIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgcHJpdmF0ZSBzeW5jUGFyYW1zRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJhc2VVcmw6IF9iLCByb3dzIH0gPSB0aGlzLnBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHRoaXMuX3VybCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheShyb3dzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIFBhcmFtcyB0YWJsZSAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1VybEZyb21QYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgfHwgIXRoaXMucGFyYW1zRm9ybUFycmF5KSByZXR1cm47XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QmFzZVVybCh0aGlzLl91cmwpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5wYXJhbXNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGtleSA9ICgoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmIChrZXkgIT09ICcnKSBwYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIGNvbnN0IG5ld1VybCA9IHF1ZXJ5U3RyaW5nID8gYCR7YmFzZVVybH0/JHtxdWVyeVN0cmluZ31gIDogYmFzZVVybDtcbiAgICBpZiAodGhpcy5fdXJsICE9PSBuZXdVcmwpIHtcbiAgICAgIHRoaXMuX3VybCA9IG5ld1VybDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsganNvblBhdGg6IHN0cmluZzsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGRhdGFUeXBlOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBqc29uUGF0aDogJycsIHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFtyLmpzb25QYXRoXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBkYXRhVHlwZTogW3IuZGF0YVR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnNGb3JtQXJyYXkocm93czogQXBpRWRpdEhlYWRlclJvd1tdKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gcm93cy5tYXAoKGgpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2gubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbaC52YWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCB0aHJlZSBzdGVwcyBhbmQgYWxsIGVudGVyZWQgZGF0YSB0byBpbml0aWFsL2RlZmF1bHQgc3RhdGUuIFVzZWQgd2hlbiB1c2VyIGNhbmNlbHMgb24gc3RlcCAxLiAqL1xuICBwcml2YXRlIHJlc2V0QWxsU3RlcHNBbmREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAxO1xuXG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWwgPz8gJyc7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICBjb25zdCBmaXJzdEVudlZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdEVudlZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgY29uc3QgZW52VmFsID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZW52VmFsID8/ICcnO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSkgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBkZWZhdWx0RW52IH0pO1xuXG4gICAgdGhpcy51cmwgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5kZWNvZGVVcmxGb3JEaXNwbGF5KHRoaXMuaW5pdGlhbFVybCA/PyAnJykgfHwgJyc7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkodGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF0gPz8gJ2pzb24nO1xuICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQgfSk7XG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcblxuICAgIHRoaXMudmFyaWFibGVOYW1lID0gJyc7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc3VtbWFyeSA9IHRoaXMuaW5pdGlhbFN1bW1hcnkgPz8gJyc7XG5cbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPSAncmVzcG9uc2UtYm9keSc7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBpbXBvcnQgY1VSTCBwYW5lbCAoY2FsbGVkIHdoZW4gdXNlciBjbGlja3MgXCJJbXBvcnQgQVBJIGNVUkxcIikuIFJlc2V0cyB0ZXh0YXJlYSBzbyBpdCBpcyBjbGVhcmVkIGVhY2ggdGltZS4gKi9cbiAgb3BlbkltcG9ydEN1cmxQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2ltcG9ydC1jdXJsJztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUmVzZXQgVVJMLCBtZXRob2QsIGhlYWRlcnMsIGJvZHksIGFuZCBwYXJhbXMgdG8gZW1wdHkvZGVmYXVsdCBiZWZvcmUgYXBwbHlpbmcgaW1wb3J0ZWQgY1VSTC4gKi9cbiAgcHJpdmF0ZSByZXNldFJlcXVlc3RGaWVsZHNCZWZvcmVDdXJsSW1wb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLnNlbGVjdGVkTWV0aG9kID0gdHlwZW9mIGRlZmF1bHRNZXRob2QgPT09ICdzdHJpbmcnID8gZGVmYXVsdE1ldGhvZCA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0TWV0aG9kIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRNZXRob2Q7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICB0aGlzLnVybCA9ICcnO1xuXG4gICAgLy8gUmVzZXQgYXV0aCBzbyBhIHByZXZpb3VzIEJlYXJlciB0b2tlbiBkb2Vzbid0IHBlcnNpc3Qgd2hlbiByZS1pbXBvcnRpbmdcbiAgICBjb25zdCBmaXJzdEF1dGhWYWx1ZSA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKVswXSA/PyAnbm8tYXV0aCc7XG4gICAgaWYgKHRoaXMuYXV0aFR5cGVGb3JtKSB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IGZpcnN0QXV0aFZhbHVlIH0pO1xuICAgIHRoaXMuYmVhcmVyVG9rZW4gPSAnJztcblxuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXSA/PyAnanNvbic7XG4gICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZGVmYXVsdEZvcm1hdCB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogcGFyc2UgY1VSTCBmcm9tIGNvbnRyb2wsIGJpbmQgdG8gZm9ybSBmaWVsZHMsIGVtaXQgYW5kIGNsb3NlIHBhbmVsLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjdXJsU3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG4gICAgdGhpcy5pbXBvcnRDdXJsLmVtaXQoY3VybFN0cik7XG5cbiAgICB0aGlzLnJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3VybChjdXJsU3RyKTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICAvLyDilIDilIAgTWV0aG9kIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgbWV0aG9kVmFsdWUgPSBwYXJzZWQubWV0aG9kICYmIHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCkuaW5jbHVkZXMocGFyc2VkLm1ldGhvZClcbiAgICAgICAgPyBwYXJzZWQubWV0aG9kXG4gICAgICAgIDogcGFyc2VkLm1ldGhvZCB8fCAnR0VUJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZXRob2QgPSBtZXRob2RWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gbWV0aG9kVmFsdWU7XG5cbiAgICAgIC8vIOKUgOKUgCBVUkwgKGFsc28gc3luY3MgUGFyYW1zIHRhYiBmcm9tIHF1ZXJ5IHN0cmluZykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAocGFyc2VkLnVybCkgdGhpcy51cmwgPSBwYXJzZWQudXJsO1xuXG4gICAgICAvLyDilIDilIAgQXV0aG9yaXphdGlvbiBoZWFkZXIg4oaSIEJlYXJlciBUb2tlbiAvIGF1dGggdHlwZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxldCBoZWFkZXJSb3dzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBwYXJzZWQuaGVhZGVycztcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBoZWFkZXJSb3dzLmZpbmQoaCA9PiBoLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKTtcbiAgICAgIGlmIChhdXRoSGVhZGVyPy52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IGJlYXJlck1hdGNoID0gL15CZWFyZXJcXHMrKC4rKSQvaS5leGVjKGF1dGhIZWFkZXIudmFsdWUudHJpbSgpKTtcbiAgICAgICAgaWYgKGJlYXJlck1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBiZWFyZXJNYXRjaFsxXS50cmltKCk7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKS5pbmNsdWRlcygnYmVhcmVyJykgJiYgdGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogJ2JlYXJlcicgfSk7XG4gICAgICAgICAgICB0aGlzLmJlYXJlclRva2VuID0gdG9rZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlbW92ZSBBdXRob3JpemF0aW9uIGZyb20gaGVhZGVycyB0YWJsZSAoaXQgbGl2ZXMgaW4gdGhlIEF1dGggdGFiKVxuICAgICAgICAgIGhlYWRlclJvd3MgPSBoZWFkZXJSb3dzLmZpbHRlcihoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBIZWFkZXJzIHRhYmxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgaGVhZGVyUm93cyA9IGhlYWRlclJvd3MubGVuZ3RoID4gMCA/IGhlYWRlclJvd3MgOiBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XTtcbiAgICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KGhlYWRlclJvd3MpO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgICAvLyDilIDilIAgRGV0ZXJtaW5lIENvbnRlbnQtVHlwZSBmb3IgYm9keS9mb3JtYXQgZGVjaXNpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBwYXJzZWQuaGVhZGVyc1xuICAgICAgICAuZmluZChoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJylcbiAgICAgICAgPy52YWx1ZT8udG9Mb3dlckNhc2UoKSA/PyAnJztcblxuICAgICAgLy8g4pSA4pSAIEJvZHkgLyBGb3JtLWRhdGEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBsZXQgdGFiVG9BY3RpdmF0ZTogQXBpRWRpdFBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG5cbiAgICAgIGlmIChwYXJzZWQuZm9ybURhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBNdWx0aXBhcnQgZm9ybS1kYXRhICgtRiAvIC0tZm9ybSBlbnRyaWVzKVxuICAgICAgICB0aGlzLnBheWxvYWRUeXBlID0gJ2Zvcm0tZGF0YSc7XG4gICAgICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoXG4gICAgICAgICAgcGFyc2VkLmZvcm1EYXRhLm1hcChlID0+ICh7IGtleTogZS5rZXksIHR5cGU6IGUudHlwZSwgdmFsdWU6IGUudmFsdWUgfSkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGFiVG9BY3RpdmF0ZSA9ICdib2R5JztcblxuICAgICAgfSBlbHNlIGlmIChwYXJzZWQuYm9keSkge1xuICAgICAgICBjb25zdCBpc0Zvcm1VcmxFbmNvZGVkID0gY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuXG4gICAgICAgIGlmIChpc0Zvcm1VcmxFbmNvZGVkKSB7XG4gICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VGb3JtVXJsRW5jb2RlZEJvZHkocGFyc2VkLmJvZHkpO1xuICAgICAgICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShyb3dzLmxlbmd0aCA+IDAgPyByb3dzIDogW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkQXNKc29uID0gdGhpcy50cnlGb3JtQm9keVZhbHVlQXNSYXdKc29uKHJvd3MpO1xuICAgICAgICAgIGlmIChkZWNvZGVkQXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBkZWNvZGVkQXNKc29uO1xuICAgICAgICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogJ2pzb24nIH0pO1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBheWxvYWRUZXh0ID0gcGFyc2VkLmJvZHk7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgICAgICAgdGhpcy5hcHBseUJvZHlGb3JtYXQocGFyc2VkLmJvZHksIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJUb0FjdGl2YXRlID0gJ2JvZHknO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgQXV0by1zd2l0Y2ggdG8gdGhlIG1vc3QgcmVsZXZhbnQgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgaWYgKHRhYlRvQWN0aXZhdGUgPT09ICdib2R5Jykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnYm9keSc7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2F1dGhvcml6YXRpb24nO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IGVtaXQgY2FuY2VsIGFuZCBjbG9zZSBwYW5lbC4gQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgQ2FuY2VsIGluIGltcG9ydCBjVVJMIHBhbmVsLiAqL1xuICBvbkNhbmNlbEltcG9ydEN1cmwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlSW1wb3J0Q3VybFBhbmVsKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBoZWFkZXJzIHNlY3Rpb24gKGNhbGxlZCBmcm9tIENhbmNlbCBvciBhZnRlciBJbXBvcnQgaW4gaW1wb3J0IHBhbmVsKS4gKi9cbiAgY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdoZWFkZXJzJztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMOiBtdXN0IGJlIHJlcXVpcmVkIGFuZCBtYXRjaCBodHRwL2h0dHBzIHBhdHRlcm5cbiAgICogQWxzbyBhbGxvd3MgcGFyYW1ldGVyIHBsYWNlaG9sZGVycyBsaWtlIEB8cGFyYW1OYW1lfFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVybCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB1cmxWYWx1ZSA9IHRoaXMudXJsPy50cmltKCkgfHwgJyc7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgVVJMIGlzIGVtcHR5XG4gICAgaWYgKCF1cmxWYWx1ZSkge1xuICAgICAgdGhpcy51cmxFcnJvciA9ICdVUkwgaXMgcmVxdWlyZWQnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcGFyYW1ldGVyIHBsYWNlaG9sZGVyIChmb3JtYXQ6IEB8cGFyYW1OYW1lfClcbiAgICBjb25zdCBpc1BhcmFtZXRlclBsYWNlaG9sZGVyID0gL15AXFx8W158XStcXHwkLy50ZXN0KHVybFZhbHVlKTtcbiAgICBpZiAoaXNQYXJhbWV0ZXJQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy51cmxFcnJvciA9ICcnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCwgc2tpcCB0aGUgaHR0cC9odHRwcyB2YWxpZGF0aW9uXG4gICAgLy8gYmVjYXVzZSB0aGUgVVJMIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgcGFyYW1ldGVyIHRoYXQgZ2V0cyByZXNvbHZlZCBhZ2FpbnN0IHRoZSBlbnZpcm9ubWVudCBiYXNlIFVSTC5cbiAgICBjb25zdCBoYXNFbnZpcm9ubWVudCA9IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT0gbnVsbFxuICAgICAgJiYgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSAhPT0gJydcbiAgICAgICYmIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICdub25lJztcblxuICAgIGlmICghaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIFVSTCBtYXRjaGVzIGh0dHAgb3IgaHR0cHMgcGF0dGVyblxuICAgICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgICBpZiAoIXVybFBhdHRlcm4udGVzdCh1cmxWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy51cmxFcnJvciA9ICdVUkwgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbjogdHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKHVybFZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLnVybEVycm9yID0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgVVJMIGlzIHZhbGlkIChmb3IgYnV0dG9uIGRpc2FibGVkIHN0YXRlKVxuICAgKi9cbiAgZ2V0IGlzVXJsVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXJsVmFsdWUgPSB0aGlzLnVybD8udHJpbSgpIHx8ICcnO1xuICAgIFxuICAgIC8vIEVtcHR5IFVSTCBpcyBpbnZhbGlkXG4gICAgaWYgKCF1cmxWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBQYXJhbWV0ZXIgcGxhY2Vob2xkZXIgaXMgdmFsaWRcbiAgICBjb25zdCBpc1BhcmFtZXRlclBsYWNlaG9sZGVyID0gL15AXFx8W158XStcXHwkLy50ZXN0KHVybFZhbHVlKTtcbiAgICBpZiAoaXNQYXJhbWV0ZXJQbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCwgc2tpcCB0aGUgaHR0cC9odHRwcyB2YWxpZGF0aW9uXG4gICAgY29uc3QgaGFzRW52aXJvbm1lbnQgPSB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9IG51bGxcbiAgICAgICYmIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICcnXG4gICAgICAmJiB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9PSAnbm9uZSc7XG5cbiAgICBpZiAoaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE11c3QgbWF0Y2ggaHR0cC9odHRwcyBwYXR0ZXJuXG4gICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgaWYgKCF1cmxQYXR0ZXJuLnRlc3QodXJsVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsVmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25TZW5kUmVxdWVzdCgpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBVUkwgYmVmb3JlIHNlbmRpbmcgcmVxdWVzdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVVybCgpKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQgIT0gbnVsbCA/IFN0cmluZyh0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQpIDogJyc7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpIDogJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ZXAxID0gdGhpcy5nZXRDcmVhdGVQYXlsb2FkKCkuc3RlcDE7XG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgICBlbnZpcm9ubWVudDogc3RlcDEuZW52aXJvbm1lbnQgPz8gZW52aXJvbm1lbnQsXG4gICAgICAgIG1ldGhvZDogc3RlcDEubWV0aG9kID8/IG1ldGhvZCxcbiAgICAgICAgdXJsOiBzdGVwMS51cmwgPz8gKHRoaXMudXJsID8/ICcnKSxcbiAgICAgICAgaGVhZGVyczogc3RlcDEuaGVhZGVycyA/PyB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlOiBzdGVwMS5hdXRoVHlwZSxcbiAgICAgICAgYmVhcmVyVG9rZW46IHN0ZXAxLmJlYXJlclRva2VuLFxuICAgICAgICBvYXV0aDI6IHN0ZXAxLm9hdXRoMixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHN0ZXAxLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiBzdGVwMS5wYXlsb2FkRm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogc3RlcDEucGF5bG9hZFRleHQsXG4gICAgICAgIGtleVZhbHVlUm93czogc3RlcDEua2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzOiBzdGVwMS5rZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgICBwYXJhbXNSb3dzOiBzdGVwMS5wYXJhbXNSb3dzLFxuICAgICAgICAuLi4oc3RlcDEuYXBpVHlwZSAmJiB7IGFwaVR5cGU6IHN0ZXAxLmFwaVR5cGUgfSksXG4gICAgICAgIC4uLihzdGVwMS5ncmFwaFFMICYmIHsgZ3JhcGhRTDogc3RlcDEuZ3JhcGhRTCB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5zZW5kUmVxdWVzdC5lbWl0KHtcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICBhdXRoVHlwZTogdGhpcy5zZWxlY3RlZEF1dGhUeXBlLFxuICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5iZWFyZXJUb2tlbiA/PyAnJyxcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0/LmdldCgnZm9ybWF0Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uVmFyaWFibGVOYW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnJztcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA+IDEpIHtcbiAgICAgIHRoaXMuc2V0U3RlcCh0aGlzLmN1cnJlbnRTdGVwIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzZXRBbGxTdGVwc0FuZERhdGEoKTtcbiAgICAgIHRoaXMuYmFjay5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uIChzdGVwIDEpLiBFbWl0cyBjYW5jZWwgdGhlbiBydW5zIG5vcm1hbCBiYWNrIGZsb3cuICovXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLm9uQmFjaygpO1xuICB9XG5cbiAgb25OZXh0KCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIFVSTCBvbiBzdGVwIDFcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gMSkge1xuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVXJsKCkpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgdmFyaWFibGUgbmFtZSBvbiBzdGVwIDJcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gMiAmJiAhdGhpcy52YXJpYWJsZU5hbWU/LnRyaW0oKSkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICdWYXJpYWJsZSBOYW1lIGlzIHJlcXVpcmVkLic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnJztcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA8IHRoaXMuc3RlcExhYmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0U3RlcCh0aGlzLmN1cnJlbnRTdGVwICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV4dC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGF5bG9hZFRhYih2YWx1ZTogQXBpRWRpdFBheWxvYWRUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgQVBJIFR5cGUgc2VnbWVudCB0b2dnbGUgKFJFU1Qg4oaUIEdyYXBoUUwpLiBXaGVuIHN3aXRjaGluZyB0byBHcmFwaFFMIHdlXG4gICAqIGp1bXAgdG8gdGhlIEdyYXBoUUwgdGFiIHNvIHRoZSBRdWVyeSAvIFZhcmlhYmxlcyAvIE9wZXJhdGlvbiBOYW1lIGZpZWxkcyBhcmVcbiAgICogaW1tZWRpYXRlbHkgdmlzaWJsZS4gV2hlbiBzd2l0Y2hpbmcgYmFjayB0byBSRVNUIHdlIGxhbmQgb24gSGVhZGVycyAoUkVTVCBkZWZhdWx0KS5cbiAgICogRGlzYWJsZWQgc2VnbWVudHMgKFNPQVAvV2ViU29ja2V0L2dSUEMpIGNhbm5vdCBmaXJlIGhlcmUg4oCUIGBjcWEtc2VnbWVudC1jb250cm9sYFxuICAgKiBibG9ja3MgdGhlIGNsaWNrIOKAlCBidXQgd2UgZ3VhcmQgYW55d2F5IGluIGNhc2UgYSBmdXR1cmUgY2FsbGVyIGJ5cGFzc2VzIHRoYXQuXG4gICAqL1xuICBvbkFwaVR5cGVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gJ3Jlc3QnICYmIHZhbHVlICE9PSAnZ3JhcGhxbCcpIHJldHVybjtcbiAgICBpZiAodGhpcy5hY3RpdmVBcGlUeXBlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlQXBpVHlwZSA9IHZhbHVlIGFzIEFwaUVkaXRBcGlUeXBlO1xuICAgIGlmICh0aGlzLmFjdGl2ZUFwaVR5cGUgPT09ICdncmFwaHFsJykge1xuICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2dyYXBocWwnO1xuICAgICAgLy8gUmUtdmFsaWRhdGUgdmFyaWFibGVzIG9uIGZpcnN0IHN3aXRjaCDigJQgdGhlIHRleHRhcmVhIG1heSBhbHJlYWR5IGhhdmUgY29udGVudFxuICAgICAgLy8gZnJvbSBhIHByZXZpb3VzIGVkaXQgYW5kIHdlIHdhbnQgdGhlIGlubGluZSBlcnJvciB0byBzdXJmYWNlIGltbWVkaWF0ZWx5LlxuICAgICAgdGhpcy52YWxpZGF0ZUdyYXBoUUxWYXJpYWJsZXMoZmFsc2UpO1xuICAgICAgdGhpcy5yZWNvbXB1dGVHcmFwaFFMT3BlcmF0aW9uV2FybmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXR1cm5pbmcgdG8gUkVTVCDigJQgZHJvcCBhbnkgR3JhcGhRTC1vbmx5IGlubGluZSBzdGF0ZSBzbyBpdCBkb2Vzbid0IGxpbmdlci5cbiAgICAgIHRoaXMuZ3JhcGhRTFF1ZXJ5RXJyb3IgPSAnJztcbiAgICAgIHRoaXMuZ3JhcGhRTFZhcmlhYmxlc0Vycm9yID0gJyc7XG4gICAgICB0aGlzLmdyYXBoUUxPcGVyYXRpb25XYXJuaW5nID0gJyc7XG4gICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBWYXJpYWJsZXMgdGV4dGFyZWEgYXMgSlNPTi4gRW1wdHkgc3RyaW5nIGlzIHZhbGlkICg9IG5vIHZhcmlhYmxlcykuXG4gICAqIFNldHMgYGdyYXBoUUxWYXJpYWJsZXNFcnJvcmAgZm9yIGlubGluZSBkaXNwbGF5OyByZXR1cm5zIHRoZSBwYXJzZWQgb2JqZWN0IG9yXG4gICAqIHRoZSByYXcgc3RyaW5nIHdoZW4gdGhlIHVzZXIgdHlwZWQgc29tZXRoaW5nIG5vbi1lbXB0eSB0aGF0IGRpZG4ndCBwYXJzZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmljdCBXaGVuIHRydWUgKGNhbGxlZCBmcm9tIGBvbkNyZWF0ZWApLCBhbiBpbnZhbGlkIEpTT04gYmxvY2tzIHNhdmVcbiAgICogICAgICAgICAgICAgICDigJQgd2UgbGVhdmUgdGhlIGVycm9yIHZpc2libGUgYW5kIHJldHVybiBgbnVsbGAgdG8gc2lnbmFsIGFib3J0LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUdyYXBoUUxWYXJpYWJsZXMoc3RyaWN0OiBib29sZWFuKTogeyB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBzdHJpbmcgfCB1bmRlZmluZWQ7IHZhbGlkOiBib29sZWFuIH0ge1xuICAgIGNvbnN0IHJhdyA9ICgodGhpcy5ncmFwaFFMRm9ybT8uZ2V0KCd2YXJpYWJsZXMnKT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJykudHJpbSgpO1xuICAgIGlmICghcmF3KSB7XG4gICAgICB0aGlzLmdyYXBoUUxWYXJpYWJsZXNFcnJvciA9ICcnO1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgdmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIHRoaXMuZ3JhcGhRTFZhcmlhYmxlc0Vycm9yID0gJyc7XG4gICAgICByZXR1cm4geyB2YWx1ZTogcGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB2YWxpZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIHRoaXMuZ3JhcGhRTFZhcmlhYmxlc0Vycm9yID0gYEludmFsaWQgSlNPTjogJHttZXNzYWdlfWA7XG4gICAgICAvLyBJbiBub24tc3RyaWN0IG1vZGUgKGxpdmUgdHlwaW5nKSB3ZSBzdGlsbCBlY2hvIGJhY2sgdGhlIHJhdyBzdHJpbmcgc28gdGhlIHBhcmVudFxuICAgICAgLy8gY2FuIGRlY2lkZSB3aGF0IHRvIGRvOyBpbiBzdHJpY3QgbW9kZSB0aGUgY2FsbGVyIGNoZWNrcyBgdmFsaWRgIHRvIGFib3J0IHNhdmUuXG4gICAgICByZXR1cm4geyB2YWx1ZTogc3RyaWN0ID8gdW5kZWZpbmVkIDogcmF3LCB2YWxpZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHdoZW4gdGhlIEdyYXBoUUwgcXVlcnkgZGVjbGFyZXMgMisgbmFtZWQgb3BlcmF0aW9ucy4gR3JhcGhRTCByZXF1aXJlcyB0aGVcbiAgICogY2xpZW50IHRvIHNwZWNpZnkgYG9wZXJhdGlvbk5hbWVgIGluIHRoYXQgY2FzZTsgYWJzZW5jZSBpcyBhIHJ1bnRpbWUgZXJyb3IsIG5vdCBhXG4gICAqIHN5bnRheCBvbmUsIHNvIHdlIHN1cmZhY2UgaXQgYXMgYSBub24tYmxvY2tpbmcgd2FybmluZy5cbiAgICovXG4gIHByaXZhdGUgcmVjb21wdXRlR3JhcGhRTE9wZXJhdGlvbldhcm5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlQXBpVHlwZSAhPT0gJ2dyYXBocWwnIHx8ICF0aGlzLmdyYXBoUUxGb3JtKSB7XG4gICAgICB0aGlzLmdyYXBoUUxPcGVyYXRpb25XYXJuaW5nID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5ID0gKCh0aGlzLmdyYXBoUUxGb3JtLmdldCgncXVlcnknKT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJyk7XG4gICAgY29uc3Qgb3BOYW1lID0gKCh0aGlzLmdyYXBoUUxGb3JtLmdldCgnb3BlcmF0aW9uTmFtZScpPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCFxdWVyeS50cmltKCkgfHwgb3BOYW1lKSB7XG4gICAgICB0aGlzLmdyYXBoUUxPcGVyYXRpb25XYXJuaW5nID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE1hdGNoIGBxdWVyeWAsIGBtdXRhdGlvbmAsIGBzdWJzY3JpcHRpb25gIGFzIHN0YW5kYWxvbmUgdG9rZW5zIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuXG4gICAgLy8gU3RyaXAgYmxvY2svbGluZSBjb21tZW50cyBmaXJzdCBzbyBjb21tZW50ZWQtb3V0IG9wZXJhdGlvbnMgZG9uJ3QgdHJpcCB0aGUgY291bnQuXG4gICAgY29uc3Qgc3RyaXBwZWQgPSBxdWVyeVxuICAgICAgLnJlcGxhY2UoLyNbXlxcbl0qL2csICcnKVxuICAgICAgLnJlcGxhY2UoL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvZywgJycpO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpcHBlZC5tYXRjaCgvXltcXHNdKihxdWVyeXxtdXRhdGlvbnxzdWJzY3JpcHRpb24pXFxiL2dtKSB8fCBbXTtcbiAgICB0aGlzLmdyYXBoUUxPcGVyYXRpb25XYXJuaW5nID0gbWF0Y2hlcy5sZW5ndGggPj0gMlxuICAgICAgPyAnTXVsdGlwbGUgb3BlcmF0aW9ucyBkZXRlY3RlZCDigJQgT3BlcmF0aW9uIE5hbWUgaXMgcmVxdWlyZWQuJ1xuICAgICAgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGljayBoYW5kbGVyIGZvciB0aGUgXCJMb2FkIFNjaGVtYVwiIGJ1dHRvbiAoR3JhcGhRTCBtb2RlIG9ubHkpLiBTd2l0Y2hlcyB0aGUgYm9keSB2aWV3XG4gICAqIHRvIHRoZSBvcGVyYXRpb24gcGlja2VyIEFORCBlbWl0cyBgbG9hZFNjaGVtYWAgc28gdGhlIHBhcmVudCBjYW4gZmV0Y2ggLyByZWZyZXNoIHRoZVxuICAgKiBzY2hlbWEgaW4gdGhlIGJhY2tncm91bmQuIFRoZSBwaWNrZXIgcmVuZGVycyB3aGF0ZXZlciBgZ3JhcGhRTFNjaGVtYVNvdXJjZWAgL1xuICAgKiBgZ3JhcGhRTE9wZXJhdGlvbnNgIHRoZSBwYXJlbnQgaGFzIHN1cHBsaWVkIGF0IGFueSBnaXZlbiB0aW1lIOKAlCBlbXB0eSBzdGF0ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgb25Mb2FkU2NoZW1hKCk6IHZvaWQge1xuICAgIHRoaXMuYm9keVZpZXcgPSAnZ3JhcGhxbC1zY2hlbWEnO1xuICAgIHRoaXMubG9hZFNjaGVtYS5lbWl0KHsgdXJsOiB0aGlzLnVybCA/PyAnJywgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFBpY2tlciDihpIgYmFjazogZHJvcCB0aGUgcGlja2VyIHZpZXcgYW5kIHJldHVybiB0byB0aGUgaGVhZGVycy90YWJzIHBhbmVsLiAqL1xuICBvbkdyYXBoUUxQaWNrZXJCYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUGlja2VyIOKGkiByZS1pbnRyb3NwZWN0OiBmb3J3YXJkIHRvIHBhcmVudCBzbyBpdCBjYW4gcmVmZXRjaCB0aGUgc2NoZW1hLiAqL1xuICBvbkdyYXBoUUxQaWNrZXJSZUludHJvc3BlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkU2NoZW1hLmVtaXQoeyB1cmw6IHRoaXMudXJsID8/ICcnLCBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGlja2VyIOKGkiBvcGVyYXRpb24gc2VsZWN0ZWQ6IHBhdGNoIHRoZSBHcmFwaFFMIGZvcm0gKHF1ZXJ5IC8gdmFyaWFibGVzIC8gb3BlcmF0aW9uTmFtZSlcbiAgICogYW5kIHBvcCBiYWNrIHRvIHRoZSBtYWluIHZpZXcgd2l0aCB0aGUgR3JhcGhRTCB0YWIgYWN0aXZlIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlXG4gICAqIGZpbGxlZC1pbiBmaWVsZHMuXG4gICAqL1xuICBvbkdyYXBoUUxQaWNrZXJPcGVyYXRpb25TZWxlY3RlZChvcDogR3JhcGhRTE9wZXJhdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5ncmFwaFFMRm9ybSkge1xuICAgICAgdGhpcy5ib2R5VmlldyA9ICdoZWFkZXJzJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHZhcmlhYmxlc1N0cmluZyA9ICcnO1xuICAgIGlmIChvcC52YXJpYWJsZXMgIT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyaWFibGVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3AudmFyaWFibGVzLCBudWxsLCAyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB2YXJpYWJsZXNTdHJpbmcgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ncmFwaFFMRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHF1ZXJ5OiBvcC5xdWVyeSA/PyAnJyxcbiAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzU3RyaW5nLFxuICAgICAgb3BlcmF0aW9uTmFtZTogb3Aub3BlcmF0aW9uTmFtZSA/PyBvcC5uYW1lID8/ICcnLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JhcGhRTFF1ZXJ5RXJyb3IgPSAnJztcbiAgICB0aGlzLmdyYXBoUUxWYXJpYWJsZXNFcnJvciA9ICcnO1xuICAgIHRoaXMucmVjb21wdXRlR3JhcGhRTE9wZXJhdGlvbldhcm5pbmcoKTtcbiAgICAvLyBEcm9wIGFueSBzdGFsZSByZXNwb25zZSBmcm9tIGEgcHJldmlvdXNseS1waWNrZWQgb3BlcmF0aW9uLiBUaGUgbmV4dCBTZW5kIFJlcXVlc3RcbiAgICAvLyB3aWxsIHBvcHVsYXRlIHRoZSBwcmV2aWV3IGFnYWluLiBOb3RlOiBuZ09uQ2hhbmdlcyBvbiBgaW5pdGlhbFJlc3BvbnNlUHJldmlld2Agb25seVxuICAgIC8vIHN5bmNzIG5vbi1udWxsIHZhbHVlcyBkb3duLCBzbyBjbGVhcmluZyBoZXJlIGRvZXNuJ3QgZ2V0IGNsb2JiZXJlZCB3aGVuIHRoZSBwYXJlbnRcbiAgICAvLyBhbHNvIGNsZWFycyBpdHMgYGluaXRpYWxSZXNwb25zZVByZXZpZXdgIGZpZWxkLlxuICAgIHRoaXMucmVzcG9uc2VQcmV2aWV3ID0gJyc7XG4gICAgdGhpcy5hY3RpdmVBcGlUeXBlID0gJ2dyYXBocWwnO1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdncmFwaHFsJztcbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9IHZhbHVlO1xuICB9XG5cbiAgYWRkSGVhZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7IG5hbWU6IFsnJ10sIHZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUhlYWRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgYWRkcyBhIGN1c3RvbSBoZWFkZXIgbmFtZSB2aWEgdGhlIGRyb3Bkb3duIFwiQWRkICfigKYnXCIgb3B0aW9uLCBzZXQgdGhlIGNvbnRyb2wgdmFsdWUuICovXG4gIG9uSGVhZGVyTmFtZUFkZEN1c3RvbVZhbHVlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0sIHJvdzogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHJvdy5nZXQoZXZlbnQua2V5KTtcbiAgICBpZiAoY29udHJvbCAmJiBldmVudC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGV2ZW50LnZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUhlYWRlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRLZXlWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlS2V5VmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVZhbHVlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVR5cGVWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFsnJ10sIHR5cGU6IFsndGV4dCddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlUeXBlVmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlLZXlUeXBlVmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkUGFyYW1zUm93KCk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlUGFyYW1zUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5UGFyYW1zKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZFZlcmlmaWNhdGlvblJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbJyddLFxuICAgICAgICB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKV0sXG4gICAgICAgIGRhdGFUeXBlOiBbdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFsnJ10sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVWZXJpZmljYXRpb25Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlWZXJpZmljYXRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIFdoZW4gRGF0YSBUeXBlIGNoYW5nZXMgaW4gUmVzcG9uc2UgQm9keSB2ZXJpZmljYXRpb24sIHJlc2V0IEV4cGVjdGVkIFZhbHVlIGZvciB0aGF0IHJvdy4gKi9cbiAgb25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3c6IEZvcm1Hcm91cCwgZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnZGF0YVR5cGUnKSB7XG4gICAgICByb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgdmVyaWZpY2F0aW9uOiBbdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCldLCBleHBlY3RlZFZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gY2hhbmdlcyBhbmQga2VlcCBib3RoIGRhdGEgYW5kIGZvcm0gaW4gc3luYy5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub24tYm9vbGVhbiBhZHZhbmNlZCB2YWx1ZXMgKGtlcHQgZm9yIEFQSSBjb21wYXRpYmlsaXR5OyBjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXQgYWxsIGVudGVyZWQgZGV0YWlscyAoZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHksIHN0ZXAyIHZhcmlhYmxlLCBzdGVwMyB2ZXJpZmljYXRpb25zKSB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZS4gKi9cbiAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJzk5OTk5OTknKTtcblxuICAgIC8vIEdyYXBoUUwgbW9kZSB2YWxpZGF0aW9uOiBxdWVyeSBpcyByZXF1aXJlZCArIG5vbi1ibGFuaywgdmFyaWFibGVzIChpZiBub24tZW1wdHkpIG11c3QgYmUgdmFsaWQgSlNPTi5cbiAgICBpZiAodGhpcy5hY3RpdmVBcGlUeXBlID09PSAnZ3JhcGhxbCcpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gKCh0aGlzLmdyYXBoUUxGb3JtPy5nZXQoJ3F1ZXJ5Jyk/LnZhbHVlIGFzIHN0cmluZykgPz8gJycpLnRyaW0oKTtcbiAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgdGhpcy5ncmFwaFFMUXVlcnlFcnJvciA9ICdRdWVyeSBpcyByZXF1aXJlZC4nO1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnZ3JhcGhxbCc7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnZhbGlkYXRlR3JhcGhRTFZhcmlhYmxlcyh0cnVlKTtcbiAgICAgIGlmICghdmFyaWFibGVzLnZhbGlkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdncmFwaHFsJztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZCgpO1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgcGF5bG9hZCcsIHBheWxvYWQpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdChwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwaUVkaXRTdGVwIGdldENyZWF0ZVBheWxvYWQgZXJyb3I6JywgZXJyKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQodGhpcy5nZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1pbmltYWwgcGF5bG9hZCB3aGVuIGdldENyZWF0ZVBheWxvYWQgdGhyb3dzIChzbyBjcmVhdGUgYWx3YXlzIGVtaXRzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgc3VtbWFyeTogdGhpcy5zdW1tYXJ5Py50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgICBlbnZpcm9ubWVudDogJycsXG4gICAgICAgIG1ldGhvZDogJycsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IFtdLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgLi4uKGJlYXJlclRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBiZWFyZXJUb2tlbiB9KSxcbiAgICAgICAgLi4uKG9hdXRoMiAhPT0gdW5kZWZpbmVkICYmIHsgb2F1dGgyIH0pLFxuICAgICAgICBhY3RpdmVQYXlsb2FkVGFiOiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIsXG4gICAgICAgIHBheWxvYWRUeXBlOiB0aGlzLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiAnJyxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93czogW10sXG4gICAgICAgIGtleVR5cGVWYWx1ZVJvd3M6IFtdLFxuICAgICAgICBwYXJhbXNSb3dzOiBbXSxcbiAgICAgIH0sXG4gICAgICBzdGVwMjogeyB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnIH0sXG4gICAgICBzdGVwMzoge1xuICAgICAgICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYixcbiAgICAgICAgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uczogW10sXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2wgdmFsdWUgdG8gc3RyaW5nIChoYW5kbGVzIG9iamVjdCBvciBzdHJpbmcpLiAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRDb250cm9sVmFsdWUoY29udHJvbDogeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IGNvbnRyb2w/LnZhbHVlO1xuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpIDogU3RyaW5nKHYpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZ1bGwgY3JlYXRlIHBheWxvYWQ6IGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5IChzdGVwMSksIHZhcmlhYmxlIG5hbWUgKHN0ZXAyKSwgdmVyaWZpY2F0aW9ucyAoc3RlcDMpLiAqL1xuICBwcml2YXRlIGdldENyZWF0ZVBheWxvYWQoKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGVudkZyb21Gb3JtID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50JykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPVxuICAgICAgZW52RnJvbUZvcm0gIT09ICcnID8gZW52RnJvbUZvcm0gOiAodGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlIDogdGhpcy5zZWxlY3RlZEVudmlyb25tZW50KTtcbiAgICBjb25zdCBtZXRob2RGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm1ldGhvZEZvcm0/LmdldCgnbWV0aG9kJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgbWV0aG9kID1cbiAgICAgIG1ldGhvZEZyb21Gb3JtICE9PSAnJyA/IG1ldGhvZEZyb21Gb3JtIDogKHRoaXMuY3VycmVudE1ldGhvZFZhbHVlICE9PSAnJyA/IHRoaXMuY3VycmVudE1ldGhvZFZhbHVlIDogdGhpcy5zZWxlY3RlZE1ldGhvZCk7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3Qga2V5VmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVZhbHVlUm93cyA9IChrZXlWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZUZvcm1BcnJheSA9IHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZVJvd3MgPSAoa2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3R5cGUnKT8udmFsdWUgPz8gJ3RleHQnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1zRm9ybUFycmF5ID0gdGhpcy5wYXJhbXNGb3JtQXJyYXk7XG4gICAgY29uc3QgcGFyYW1zUm93cyA9IChwYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCB2ZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheTtcbiAgICBjb25zdCByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zID0gKHZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGpzb25QYXRoOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnanNvblBhdGgnKT8udmFsdWUgPz8gJycsXG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBkYXRhVHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbnMgPSAoc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAgdmVyaWZpY2F0aW9uOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBHcmFwaFFMIGV4dGVuc2lvbjogd2hlbiBpbiBHcmFwaFFMIG1vZGUsIHBhY2thZ2UgdGhlIHF1ZXJ5L3ZhcmlhYmxlcy9vcGVyYXRpb25OYW1lIGludG8gYVxuICAgIC8vIHNpbmdsZSBzdWItb2JqZWN0IGFuZCBlbnN1cmUgQ29udGVudC1UeXBlIGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uL2pzb24gKGVuZ2luZSBzZXRzIGl0IHRvbyxcbiAgICAvLyBidXQgc3VyZmFjaW5nIGl0IG9uIHRoZSBoZWFkZXJzIGxpc3QgaXMgY2xlYW5lciBmb3IgdGhlIHVzZXIpLiBNZXRob2QgaXMgZm9yY2VkIHRvIFBPU1Qgc29cbiAgICAvLyBsZWdhY3kgUkVTVC1mbGF2b3VyZWQgZG93bnN0cmVhbSBjb2RlIHBhdGhzIGtlZXAgd29ya2luZyB3aGVuIHRoZXkgcGVlayBhdCBpdC5cbiAgICBjb25zdCBpc0dyYXBoUUwgPSB0aGlzLmFjdGl2ZUFwaVR5cGUgPT09ICdncmFwaHFsJztcbiAgICBsZXQgb3V0cHV0QXBpVHlwZTogQXBpRWRpdEFwaVR5cGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG91dHB1dEdyYXBoUUw6IEFwaUVkaXRHcmFwaFFMUGF5bG9hZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb3V0cHV0SGVhZGVycyA9IHRoaXMuaGVhZGVycztcbiAgICBsZXQgb3V0cHV0TWV0aG9kID0gbWV0aG9kO1xuICAgIGlmIChpc0dyYXBoUUwpIHtcbiAgICAgIG91dHB1dEFwaVR5cGUgPSAnZ3JhcGhxbCc7XG4gICAgICBjb25zdCBxdWVyeSA9ICgodGhpcy5ncmFwaFFMRm9ybT8uZ2V0KCdxdWVyeScpPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25OYW1lID0gKCh0aGlzLmdyYXBoUUxGb3JtPy5nZXQoJ29wZXJhdGlvbk5hbWUnKT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJykudHJpbSgpO1xuICAgICAgY29uc3QgdmFyaWFibGVzUmVzdWx0ID0gdGhpcy52YWxpZGF0ZUdyYXBoUUxWYXJpYWJsZXMoZmFsc2UpO1xuICAgICAgb3V0cHV0R3JhcGhRTCA9IHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC4uLih2YXJpYWJsZXNSZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB7IHZhcmlhYmxlczogdmFyaWFibGVzUmVzdWx0LnZhbHVlIH0pLFxuICAgICAgICAuLi4ob3BlcmF0aW9uTmFtZSAmJiB7IG9wZXJhdGlvbk5hbWUgfSksXG4gICAgICB9O1xuICAgICAgb3V0cHV0TWV0aG9kID0gJ1BPU1QnO1xuICAgICAgY29uc3QgaGFzQ29udGVudFR5cGUgPSBvdXRwdXRIZWFkZXJzLnNvbWUoaCA9PiAoaC5uYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgaWYgKCFoYXNDb250ZW50VHlwZSkge1xuICAgICAgICBvdXRwdXRIZWFkZXJzID0gW3sgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIC4uLm91dHB1dEhlYWRlcnNdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGVwMToge1xuICAgICAgICBzdW1tYXJ5OiB0aGlzLnN1bW1hcnk/LnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBtZXRob2Q6IG91dHB1dE1ldGhvZCxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogb3V0cHV0SGVhZGVycyxcbiAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgIC4uLihiZWFyZXJUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHsgYmVhcmVyVG9rZW4gfSksXG4gICAgICAgIC4uLihvYXV0aDIgIT09IHVuZGVmaW5lZCAmJiB7IG9hdXRoMiB9KSxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogZm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgICBwYXJhbXNSb3dzLFxuICAgICAgICAuLi4ob3V0cHV0QXBpVHlwZSAmJiB7IGFwaVR5cGU6IG91dHB1dEFwaVR5cGUgfSksXG4gICAgICAgIC4uLihvdXRwdXRHcmFwaFFMICYmIHsgZ3JhcGhRTDogb3V0cHV0R3JhcGhRTCB9KSxcbiAgICAgIH0sXG4gICAgICBzdGVwMjoge1xuICAgICAgICB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaGVhZGVyIHJvd3MgZnJvbSBmb3JtIChmb3IgY29uc3VtZXJzIHRoYXQgcmVhZCBoZWFkZXJzKSAqL1xuICBnZXQgaGVhZGVycygpOiBBcGlFZGl0SGVhZGVyUm93W10ge1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5KSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scy5tYXAoKGMpID0+ICh7XG4gICAgICBuYW1lOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxNZXRob2QnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5tZXRob2RGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaHR0cE1ldGhvZE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLm1ldGhvZEZvcm0gJiYgdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gZmlyc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuZW52aXJvbm1lbnRGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnRGb3JtICYmIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZW52aXJvbm1lbnRGb3JtLmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RW52aXJvbm1lbnRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsQXV0aFR5cGUnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsQXV0aFR5cGUnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZCA9XG4gICAgICAgIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpO1xuICAgICAgaWYgKHJlc29sdmVkICE9IG51bGwpIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2F1dGhUeXBlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUF1dGhUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5hdXRoVHlwZUZvcm0pIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpO1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5hdXRoVHlwZUZvcm0uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsID1cbiAgICAgICAgICAgIGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50ICE9PSAnJ1xuICAgICAgICAgICAgICA/IHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoY3VycmVudCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKGN1cnJlbnQpXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBjb25zdCB2YWxpZCA9IGN1cnJlbnRWYWwgIT0gbnVsbCAmJiB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudFZhbCk7XG4gICAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXSkge1xuICAgICAgdGhpcy5hcHBseUluaXRpYWxTdGVwKGNoYW5nZXNbJ2luaXRpYWxTdGVwJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxVcmwnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXJsID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZGVjb2RlVXJsRm9yRGlzcGxheShjaGFuZ2VzWydpbml0aWFsVXJsJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSBjaGFuZ2VzWydpbml0aWFsUGF5bG9hZFRhYiddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlYWRlck5hbWVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KGNoYW5nZXNbJ2luaXRpYWxIZWFkZXJzJ10uY3VycmVudFZhbHVlIGFzIEFwaUVkaXRIZWFkZXJSb3dbXSk7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5IGluaXRpYWxSZXNwb25zZVByZXZpZXcnLCB0aGlzLmluaXRpYWxSZXNwb25zZVByZXZpZXcpO1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXcgPSBjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gV2hlbiBhIG5ldyByZXNwb25zZSBwcmV2aWV3IGlzIHByb3ZpZGVkIChhZnRlciBTZW5kIFJlcXVlc3QpLCBzY3JvbGwgcHJldmlldyBzZWN0aW9uIGludG8gdmlld1xuICAgICAgdGhpcy5zY3JvbGxQcmV2aWV3SW50b1ZpZXcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkge1xuICAgICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBjaGFuZ2VzWydpbml0aWFsRm9ybWF0J10uY3VycmVudFZhbHVlIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFZhcmlhYmxlTmFtZSddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWUgPSBjaGFuZ2VzWydpbml0aWFsVmFyaWFibGVOYW1lJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFN1bW1hcnknXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VtbWFyeSA9IGNoYW5nZXNbJ2luaXRpYWxTdW1tYXJ5J10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZm9ybWF0T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2ZXJpZmljYXRpb25PcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldERhdGFUeXBlVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0RGF0YVR5cGUgPSB0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpO1xuICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IGRhdGFUeXBlOiBkZWZhdWx0RGF0YVR5cGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3N0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbW9vdGhseSBzY3JvbGxzIHRoZSByZXNwb25zZSBwcmV2aWV3IHNlY3Rpb24gaW50byB2aWV3IHdpdGhpbiB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIuXG4gICAqIENhbGxlZCB3aGVuIGEgZnJlc2ggcmVzcG9uc2UgcHJldmlldyB2YWx1ZSBpcyBzZXQgZnJvbSB0aGUgcGFyZW50IChBUEkgYnVpbGRlcikuXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbFByZXZpZXdJbnRvVmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzcG9uc2VQcmV2aWV3UmVmIHx8ICF0aGlzLnJlc3BvbnNlUHJldmlld1JlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIGJsb2NrOiAnc3RhcnQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgYWRqdXN0IGNsb3Nlc3Qgc2Nyb2xsYWJsZSBwYXJlbnQgaWYgbmVlZGVkXG4gICAgICBjb25zdCBlbCA9IHRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBzY3JvbGxQYXJlbnQgPSBlbC5jbG9zZXN0KCcuY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSBlbC5vZmZzZXRUb3AgLSAxNjsgLy8gc21hbGwgcGFkZGluZ1xuICAgICAgICBzY3JvbGxQYXJlbnQuc2Nyb2xsVG8oeyB0b3A6IG9mZnNldFRvcCA8IDAgPyAwIDogb2Zmc2V0VG9wLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyIGNxYS1iZy1bI2ZmZmZmZl0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtcC1bMTZweF0gY3FhLWdhcC1bMTJweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLWJveC1ib3JkZXJcIj5cblxuICA8aDIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10aXRsZSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLXRleHQtWyMwMDAwMDBdIGNxYS1tLTBcIj5cbiAgICB7eyBlZGl0TW9kZSA/ICdVcGRhdGUgQVBJIFRlc3QgU3RlcCcgOiAnQ3JlYXRlIEFQSSBUZXN0IFN0ZXAnIH19XG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvciBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMCBjcWEtbWF4LVs3NjdweF06Y3FhLWZsZXgtd3JhcCBjcWEtbWF4LVs3NjdweF06Y3FhLWdhcC0yIGNxYS1tYXgtWzc2N3B4XTpjcWEtanVzdGlmeS1zdGFydFwiXG4gICAgW2NsYXNzLmNxYS1qdXN0aWZ5LXN0YXJ0XT1cInN0ZXBMYWJlbHMubGVuZ3RoID09PSAxXCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktYmV0d2Vlbl09XCJzdGVwTGFiZWxzLmxlbmd0aCAhPT0gMVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcExhYmVsczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbSBjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbS0tY2xpY2thYmxlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMTBweF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1mb250LWluaGVyaXQgY3FhLXRleHQtaW5oZXJpdCBjcWEtdGV4dC1sZWZ0ICFjcWEtYmctdHJhbnNwYXJlbnRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTdGVwICcgKyBzdGVwLmluZGV4ICsgJzogJyArIHN0ZXAubGFiZWxcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXBcIlxuICAgICAgICAoY2xpY2tlZCk9XCJzZXRTdGVwKHN0ZXAuaW5kZXgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWNpcmNsZSBjcWEtdy04IGNxYS1oLTggY3FhLXJvdW5kZWQtZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJvcmRlci1ub25lIGNxYS1zaHJpbmstMFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXAgPyAnY3FhLWJnLVsjNEY0NkU1XSBjcWEtdGV4dC13aGl0ZScgOiAnY3FhLWJnLVsjRTBFMEUwXSBjcWEtdGV4dC1bIzY2NjY2Nl0nXCI+XG4gICAgICAgICAge3sgc3RlcC5pbmRleCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxhYmVsIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLW1heC1bNzY3cHhdOmNxYS10ZXh0LXhzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtdGV4dC1bIzRGNDZFNV0nIDogJ2NxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmxhYmVsIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImkgPCBzdGVwTGFiZWxzLmxlbmd0aCAtIDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1saW5lIGNxYS13LVs5NnB4XSBjcWEtaC1bMnB4XSBjcWEtYmctWyNFMEUwRTBdIGNxYS1teS0wIGNxYS1teC1bNnB4XSBjcWEtc2hyaW5rLTAgY3FhLXNlbGYtY2VudGVyIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1bMjRweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1teC0xXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBjb250ZW50IHZpZXdwb3J0OiBvbmx5IHRoZSBhY3RpdmUgc3RlcCBib2R5IGlzIHNob3duICgqbmdJZikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12aWV3cG9ydCBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBTdGVwIDE6IEVudmlyb25tZW50LCByZXF1ZXN0LCBib2R5LCByZXNwb25zZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFN0ZXAgPT09IDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTYgY3FhLWJveC1ib3JkZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8IS0tIEFQSSBUeXBlIHNlZ21lbnQ6IFJFU1QgQVBJIChkZWZhdWx0KSB8IEdyYXBoUUwgfCBTT0FQL1dlYlNvY2tldC9nUlBDIChkaXNhYmxlZCkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hcGktdHlwZS1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXBpLXR5cGUtbGFiZWwgY3FhLW0tMCBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWxcIj5BUEkgVHlwZTwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFt2YWx1ZV09XCJhY3RpdmVBcGlUeXBlXCJcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJhcGlUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQXBpVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXBpLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdW1tYXJ5IGZpZWxkOiBsYWJlbCBvbiB0b3AsIGlucHV0IGJlbG93IChhYm92ZSBFbnZpcm9ubWVudCkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdW1tYXJ5LXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLWl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdW1tYXJ5LWxhYmVsIGNxYS1tLTAgY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtdHJhY2tpbmctbm9ybWFsXCI+U3VtbWFyeTwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgWyh2YWx1ZSldPVwic3VtbWFyeVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIFJlcXVlc3Qgc3VtbWFyeVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICBhcmlhTGFiZWw9XCJTdW1tYXJ5XCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFbnZpcm9ubWVudCByb3c6IGxhYmVsIG9uIHRvcCwgc2VsZWN0IGJlbG93IChhbGlnbmVkIHJpZ2h0IG9uIGRlc2t0b3ApIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtcm93IGNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtZ2FwLTEuNSBjcWEtaXRlbXMtZW5kIGNxYS1tYXgtWzc2N3B4XTpjcWEtaXRlbXMtc3RyZXRjaFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVBcGlUeXBlID09PSAnZ3JhcGhxbCdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICBbdmFsdWVdPVwidXJsXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInVybCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInVybE9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidXJsUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFbnRlciBVUkwgb3Igc2VsZWN0IFBhcmFtZXRlclwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25VcmxPcHRpb25TZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVybEVycm9yXCIgY2xhc3M9XCJjcWEtdGV4dC1yZWQtNjAwIGNxYS10ZXh0LXNtIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgIHt7IHVybEVycm9yIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1sYWJlbCBjcWEtbS0wIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbFwiPkVudmlyb25tZW50czwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiZW52aXJvbm1lbnRGb3JtXCJcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZW52aXJvbm1lbnRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJlbnZpcm9ubWVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMzE1cHhdIGNxYS1tYXgtdy1bMzE1cHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgWyZfLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJdOmNxYS1wYi0wXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVudmlyb25tZW50XCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkVudmlyb25tZW50U2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlcXVlc3Qgcm93OiBtZXRob2QsIFVSTCwgYnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2NxYS1pdGVtcy1zdGFydCc6IGFjdGl2ZUFwaVR5cGUgPT09ICdyZXN0JywgJ2NxYS1qdXN0aWZ5LWJldHdlZW4nOiBhY3RpdmVBcGlUeXBlID09PSAnZ3JhcGhxbCd9XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXF1ZXN0LXJvdyBjcWEtZmxleCBjcWEtZ2FwLTMgY3FhLWZsZXgtd3JhcCBjcWEtbWF4LVs3NjdweF06Y3FhLWZsZXgtY29sIGNxYS1tYXgtWzc2N3B4XTpjcWEtaXRlbXMtc3RyZXRjaCBjcWEtbWF4LVs3NjdweF06Y3FhLWdhcC0yLjVcIj5cbiAgICAgICAgICA8IS0tIFJFU1QgbW9kZSBzaG93cyB0aGUgSFRUUCBNZXRob2QgZHJvcGRvd24uIEdyYXBoUUwgcGlucyBtZXRob2QgdG8gUE9TVCBpbnRlcm5hbGx5IHNvIHRoZSBkcm9wZG93biBpcyBoaWRkZW4uIC0tPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJtZXRob2RGb3JtICYmIGFjdGl2ZUFwaVR5cGUgPT09ICdyZXN0J1wiIFtmb3JtXT1cIm1ldGhvZEZvcm1cIiBbY29uZmlnXT1cIm1ldGhvZFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLW1ldGhvZC1zZWxlY3QgY3FhLXNocmluay0wIGNxYS13LWF1dG8gY3FhLW1pbi13LVsxNTJweF0gY3FhLW1heC13LVsxNTJweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWF4LXctZnVsbCBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiIGFyaWEtbGFiZWw9XCJIVFRQIG1ldGhvZFwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlQXBpVHlwZSA9PT0gJ3Jlc3QnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC11cmwtd3JhcCBjcWEtZmxleC0xIGNxYS1taW4tdy1bMjAwcHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInVybFwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ1cmwgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1cmxPcHRpb25zXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVybFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXJcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0KT1cIm9uVXJsT3B0aW9uU2VsZWN0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cmxFcnJvclwiIGNsYXNzPVwiY3FhLXRleHQtcmVkLTYwMCBjcWEtdGV4dC1zbSBjcWEtbXQtMVwiPlxuICAgICAgICAgICAgICB7eyB1cmxFcnJvciB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEltcG9ydCBBUEkgY1VSTDogUkVTVC1vbmx5ICh0aGUgY1VSTCBwYXJzZXIgcHJvZHVjZXMgUkVTVCBzaGFwZXMpLiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlQXBpVHlwZSA9PT0gJ3Jlc3QnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10cmlnZ2VyIGNxYS1jb250ZW50cyBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBjcWEtbWF4LVs3NjdweF06IWNxYS1mbGV4XCIgKGNsaWNrKT1cIm9wZW5JbXBvcnRDdXJsUGFuZWwoKVwiPlxuICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnQgQVBJIGNVUkxcIlxuICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWJ0bi1vdXRsaW5lICFjcWEtYmctd2hpdGUgIWNxYS1ib3JkZXIgIWNxYS1ib3JkZXItc29saWQgIWNxYS1ib3JkZXItWyM2QjcyODBdIGNxYS10ZXh0LVsjNDE0MTQ2XSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgaG92ZXI6IWNxYS1iZy1bI0Y5RkFGQl0gaG92ZXI6IWNxYS10ZXh0LVsjNDE0MTQ2XSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBjcWEtbXQtMVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgIExvYWQgU2NoZW1hOiBHcmFwaFFMLW9ubHkuIFVzZXMgdGhlIGVsZXZhdGVkIGNxYS1idXR0b24gdmFyaWFudCBzbyB0aGVcbiAgICAgICAgICAgIGluZGlnbyBzdXJmYWNlICsgdGV4dCArIGVsZXZhdGlvbiBzaGFkb3cgY29tZSBmcm9tIHRoZSBkZXNpZ24gc3lzdGVtIOKAlFxuICAgICAgICAgICAgY3VzdG9tQ2xhc3Mga2VlcHMgb25seSB0aGUgdHlwb2dyYXBoeSArIHJlc3BvbnNpdmUgc2l6aW5nIHR3ZWFrcy5cbiAgICAgICAgICAgIERpc2FibGVkIC8gYmxvY2tlZCBzdHlsaW5nIGlzIGhhbmRsZWQgbmF0aXZlbHkgYnkgdGhlIGVsZXZhdGVkIHZhcmlhbnRcbiAgICAgICAgICAgIChjcWEtYmctcHJpbWFyeS1tdXRlZCwgbXV0ZWQgdGV4dCwgbm8gc2hhZG93KSwgc28gd2UgZG9uJ3QgYWRkIGFuXG4gICAgICAgICAgICBvcGFjaXR5IG92ZXJyaWRlIG9uIHRvcC5cbiAgICAgICAgICAtLT5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cImFjdGl2ZUFwaVR5cGUgPT09ICdncmFwaHFsJ1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZWxldmF0ZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTG9hZCBTY2hlbWFcIlxuICAgICAgICAgICAgaWNvbj1cInNjaGVtYVwiXG4gICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBjcWEtbXQtMVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXVybCB8fCAhdXJsLnRyaW0oKSB8fCBpc0xvYWRpbmdHcmFwaFFMU2NoZW1hXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cIm9uTG9hZFNjaGVtYSgpXCI+XG4gICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiU2VuZCBSZXF1ZXN0XCIgKGNsaWNrZWQpPVwib25TZW5kUmVxdWVzdCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNVcmxWYWxpZFwiXG4gICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWJ0bi1wcmltYXJ5IGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCAhY3FhLWJnLVsjM0Y0M0VFXSBjcWEtdGV4dC1bI0ZCRkNGRl0gIWNxYS1ib3JkZXItbm9uZSBjcWEtcHktMi41IGNxYS1weC02IGNxYS1nYXAtMiBjcWEtcm91bmRlZC1sZyBjcWEtbWluLWgtWzM3cHhdIGNxYS1ib3gtYm9yZGVyIGhvdmVyOiFjcWEtYmctWyMxQjFGRUJdIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIGNxYS1tdC0xXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnIWNxYS1vcGFjaXR5LTUwICFjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogIWlzVXJsVmFsaWR9XCI+XG4gICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgPCEtLSBCb2R5IGNvbnRlbnQ6IGhlYWRlciBzZWN0aW9uIChkZWZhdWx0KSBPUiBpbXBvcnQgY1VSTCBzZWN0aW9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdpbXBvcnQtY3VybCdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXNoYWRvdy1bMF8xcHhfM3B4X3JnYmEoMCwwLDAsMC4wOCldIGNxYS1vdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1oZWFkZXIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weS0zIGNxYS1weC01IGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLXJvdW5kZWQtdC1sZyBjcWEtbWF4LVs3NjdweF06Y3FhLXB4LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdGl0bGUgY3FhLW0tMCBjcWEtdGV4dC14cyBjcWEtZm9udC1ib2xkIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIj5JbXBvcnQgQVBJIGNVUkw8L2gzPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtc2VwYXJhdG9yIGNxYS1oLXB4IGNxYS1iZy1bI0UyRThGMF0gY3FhLW15LTAgY3FhLW14LTVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1ub3RlIGNxYS1weC01IGNxYS1wdC0zXCI+XG4gICAgICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJjVVJMIGlzIHN1cHBvcnRlZCBpbiBCYXNoIGZvcm1hdCBvbmx5LlwiIGljb249XCJpbmZvXCIgdmFyaWFudD1cImluZm9cIiBzaXplPVwic21hbGxcIiBbZnVsbFdpZHRoXT1cInRydWVcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLWJvZHlcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWEgW3ZhbHVlXT1cImltcG9ydEN1cmxDb250cm9sLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaW1wb3J0Q3VybENvbnRyb2wuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQYXN0ZSB5b3VyIGNVUkwgY29tbWFuZCBoZXJlIChlLmcuLCBjdXJsIC1YIFBPU1QgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnMpXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI4XCIgcmVzaXplPVwidmVydGljYWxcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdGV4dGFyZWFcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLWJ0bi1jYW5jZWxcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbEltcG9ydEN1cmwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiSW1wb3J0XCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLWJ0bi1pbXBvcnRcIiAoY2xpY2tlZCk9XCJvbkltcG9ydEN1cmxDb25maXJtKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBHcmFwaFFMIG9wZXJhdGlvbiBwaWNrZXIg4oCUIG9wZW5lZCBieSB0aGUgXCJMb2FkIFNjaGVtYVwiIGJ1dHRvbiBpbiBHcmFwaFFMIG1vZGUuIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdncmFwaHFsLXNjaGVtYSdcIj5cbiAgICAgICAgICA8Y3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlclxuICAgICAgICAgICAgW3NjaGVtYVNvdXJjZV09XCJncmFwaFFMU2NoZW1hU291cmNlXCJcbiAgICAgICAgICAgIFtvcGVyYXRpb25zXT1cImdyYXBoUUxPcGVyYXRpb25zXCJcbiAgICAgICAgICAgIFtpbnRyb3NwZWN0ZWRdPVwiISFncmFwaFFMU2NoZW1hU291cmNlXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nR3JhcGhRTFNjaGVtYVwiXG4gICAgICAgICAgICAoYmFjayk9XCJvbkdyYXBoUUxQaWNrZXJCYWNrKClcIlxuICAgICAgICAgICAgKHJlSW50cm9zcGVjdCk9XCJvbkdyYXBoUUxQaWNrZXJSZUludHJvc3BlY3QoKVwiXG4gICAgICAgICAgICAob3BlcmF0aW9uU2VsZWN0ZWQpPVwib25HcmFwaFFMUGlja2VyT3BlcmF0aW9uU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaGVhZGVycydcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFicy13cmFwcGVyIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcGF5bG9hZFRhYnNcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbdGV4dF09XCJ0YWIubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVQYXlsb2FkVGFiID09PSB0YWIudmFsdWUgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tYWN0aXZlJyA6ICcnKSArIChpc01ldGhvZFdpdGhvdXRCb2R5ICYmICh0YWIudmFsdWUgPT09ICdib2R5JyB8fCB0YWIudmFsdWUgPT09ICdwYXJhbXMnKSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1kaXNhYmxlZCcgOiAnJylcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01ldGhvZFdpdGhvdXRCb2R5ICYmICh0YWIudmFsdWUgPT09ICdib2R5JyB8fCB0YWIudmFsdWUgPT09ICdwYXJhbXMnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0UGF5bG9hZFRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoQXV0aG9yaXphdGlvbikgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2F1dGhvcml6YXRpb24nXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ3BhZGRpbmc6IDIwcHg7IG1pbi1oZWlnaHQ6IDIwMHB4OydcIj5cbiAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAyMHB4OydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgd2lkdGg6IGZpdC1jb250ZW50OydcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAyZW07IGNvbG9yOiAjNkI3MjgwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+QVVUSCBUWVBFPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cImF1dGhUeXBlRm9ybVwiIFtmb3JtXT1cImF1dGhUeXBlRm9ybVwiIFtjb25maWddPVwiYXV0aFR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdHlwZS1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQXV0aCB0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMTYwcHg7J1wiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBObyBBdXRoOiBjZW50ZXJlZCBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnbm8tYXV0aCdcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2ZsZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEycHg7IG1pbi13aWR0aDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXI6IDFweCBzb2xpZCAjRTVFN0VCOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmctdG9wOiAxNnB4OyBwYWRkaW5nLWJvdHRvbTogMTZweDsnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIid3aWR0aDogNDhweDsgaGVpZ2h0OiA0OHB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBiYWNrZ3JvdW5kOiAjRjNGNEY2OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZmxleC1zaHJpbms6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI1XCIgeT1cIjExXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjJcIiByeD1cIjFcIiBmaWxsPVwiIzlDQTNBRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Tm8gQXV0aDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDZweDsgZmxleC13cmFwOiB3cmFwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6ICM5Q0EzQUY7IGxpbmUtaGVpZ2h0OiAxLjQ7J1wiPlRoaXMgcmVxdWVzdCBkb2VzIG5vdCB1c2UgYW55IGF1dGhvcml6YXRpb24uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIk1vcmUgaW5mb3JtYXRpb25cIiB0aXRsZT1cIlRoaXMgcmVxdWVzdCBkb2VzIG5vdCB1c2UgYW55IGF1dGhvcml6YXRpb24uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyB3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogIzlDQTNBRjsgZmxleC1zaHJpbms6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDd2NE04IDV2LjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBCZWFyZXIgVG9rZW46IFRva2VuIGxhYmVsICsgdGV4dGFyZWEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICdiZWFyZXInXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPlRva2VuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWEgWyh2YWx1ZSldPVwiYmVhcmVyVG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGJlYXJlciB0b2tlblwiXG4gICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjZcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC10b2tlbi10ZXh0YXJlYVwiIGFyaWFMYWJlbD1cIkJlYXJlciB0b2tlblwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gT0F1dGggMi4wOiBHcmFudCBUeXBlLCBBY2Nlc3MgVG9rZW4gVVJMLCBDbGllbnQgSUQsIENsaWVudCBTZWNyZXQsIFNjb3BlLCBDbGllbnQgQXV0aGVudGljYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICdvYXV0aDInICYmIG9hdXRoMkZvcm1cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1vYXV0aDItZ3JpZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDE2cHggMjRweDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+R3JhbnQgVHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm9hdXRoMkZvcm1cIiBbZm9ybV09XCJvYXV0aDJGb3JtXCIgW2NvbmZpZ109XCJvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC1vYXV0aC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiT0F1dGggZ3JhbnQgdHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggZ3JhbnQgdHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+QWNjZXNzIFRva2VuIFVSTDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIHRva2VuIGVuZHBvaW50XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJBY2Nlc3MgVG9rZW4gVVJMXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggdG9rZW4gZW5kcG9pbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBJRDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRJZCcpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRJZCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIGNsaWVudCBpZGVudGlmaWVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJDbGllbnQgSURcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBjbGllbnQgaWRlbnRpZmllcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IFNlY3JldDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT0F1dGggY2xpZW50IHNlY3JldFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQ2xpZW50IFNlY3JldFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGNsaWVudCBzZWNyZXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPlNjb3BlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3BhY2Utc2VwYXJhdGVkIHNjb3Blc1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU2NvcGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5TcGFjZS1zZXBhcmF0ZWQgc2NvcGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgQXV0aGVudGljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJvYXV0aDJGb3JtXCIgW2Zvcm1dPVwib2F1dGgyRm9ybVwiIFtjb25maWddPVwib2F1dGgyQ2xpZW50QXV0aFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLW9hdXRoLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJDbGllbnQgYXV0aGVudGljYXRpb24gbWV0aG9kXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAwOyB3aWR0aDogMTAwJTsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5DbGllbnQgYXV0aGVudGljYXRpb24gbWV0aG9kPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChIZWFkZXJzKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnaGVhZGVycydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtZ3JpZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbFwiPkhlYWRlciBOYW1lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbFwiPkhlYWRlciBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGhlYWRlclJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlIZWFkZXJcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cImhlYWRlck5hbWVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgKGFkZEN1c3RvbVZhbHVlKT1cIm9uSGVhZGVyTmFtZUFkZEN1c3RvbVZhbHVlKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci10eXBlLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIkhlYWRlciB2YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWhlYWRlci1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgaGVhZGVyJ1wiIChjbGlja2VkKT1cInJlbW92ZUhlYWRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hZGQtaGVhZGVyLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiKyBBZGQgSGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtYWRkLWhlYWRlci1saW5rJ1wiIChjbGlja2VkKT1cImFkZEhlYWRlcigpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoUGFyYW1zKTogS2V54oCTVmFsdWUgdGFibGUgd2l0aCBhZGQvZGVsZXRlIHJvd3MuIFJFU1Qtb25seSDigJQgR3JhcGhRTCBQT1NUIGhhcyBubyBxdWVyeSBwYXJhbXMuIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdwYXJhbXMnICYmIGFjdGl2ZUFwaVR5cGUgPT09ICdyZXN0J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgcGFyYW1zUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVBhcmFtc1wiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZVBhcmFtc1JvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZFBhcmFtc1JvdygpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoQm9keSBvbmx5KTogdHlwZSwgZm9ybWF0LCB0ZXh0IGFyZWEsIEJhY2svTmV4dC4gUkVTVC1vbmx5IOKAlCBHcmFwaFFMIHVzZXMgdGhlIGRlZGljYXRlZCB0YWIgYmVsb3cuIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5JyAmJiBhY3RpdmVBcGlUeXBlID09PSAncmVzdCdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQgY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3JcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFt2YWx1ZV09XCJwYXlsb2FkVHlwZVwiIFtzZWdtZW50c109XCJwYXlsb2FkVHlwZVNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGF5bG9hZFR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXNlZ21lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LWxhYmVsXCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJwYXlsb2FkRm9ybWF0Rm9ybVwiIFtmb3JtXT1cInBheWxvYWRGb3JtYXRGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRm9ybWF0XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gUmF3OiB0ZXh0IGFyZWEgd2l0aCBsaW5lIG51bWJlcnMgKFBvc3RtYW4tc3R5bGUgcGF5bG9hZCBib2R5KSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAncmF3J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1ib2R5XCIgI3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZWRpdG9yLXdpdGgtbGluZXNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgbiBvZiBwYXlsb2FkTGluZU51bWJlcnNcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBheWxvYWRKc29uRXJyb3IgJiYgcGF5bG9hZEpzb25FcnJvci5saW5lID09PSBuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLWVycm9yLWljb25cIiBbdGl0bGVdPVwicGF5bG9hZEpzb25FcnJvclRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlBhcnNlIGVycm9yIG9uIHRoaXMgbGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBmaWxsPVwiI0VGNDQ0NFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDRsNiA2TTEwIDRsLTYgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW0tdGV4dFwiPnt7IG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYSBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLWgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICNwYXlsb2FkVGV4dGFyZWFSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1pbnB1dCBjcWEtdy1mdWxsIGNxYS1vdXRsaW5lLW5vbmUgY3FhLWJveC1ib3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0LS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYXlsb2FkVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQYXlsb2FkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiISFwYXlsb2FkSnNvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblBheWxvYWRJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUGF5bG9hZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJwYXlsb2FkSnNvbkVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWpzb24tZXJyb3ItbXNnXCI+XG4gICAgICAgICAgICAgICAgICBJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIHgtd3d3LWZvcm0tdXJsZW5jb2RlZDogS2V54oCTVmFsdWUgcm93cywgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAneC13d3ctZm9ybS11cmxlbmNvZGVkJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1ncmlkIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVZhbHVlXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVZhbHVlUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZEtleVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBGb3JtIERhdGE6IEtleeKAk1R5cGXigJNWYWx1ZSByb3dzOyBUeXBlIGlzIGEgZHJvcGRvd24gKFRleHQvRmlsZSksIGFkZC9yZW1vdmUgZHluYW1pY2FsbHkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ2Zvcm0tZGF0YSdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPktleTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtbGFiZWxcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVR5cGVWYWx1ZVJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlLZXlUeXBlVmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cImtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVLZXlUeXBlVmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VHlwZVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKEdyYXBoUUwpOiBRdWVyeSArIFZhcmlhYmxlcyArIE9wZXJhdGlvbiBOYW1lLiBBY3RpdmUgb25seSBpbiBHcmFwaFFMIG1vZGUuIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdncmFwaHFsJyAmJiBhY3RpdmVBcGlUeXBlID09PSAnZ3JhcGhxbCcgJiYgZ3JhcGhRTEZvcm1cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZ3JhcGhxbCBjcWEtYXBpLWVkaXQtc3RlcC1ncmFwaHFsLXRhYiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBRdWVyeSAvIFZhcmlhYmxlcyB1c2UgdGhlIGRlc2lnbi1zeXN0ZW0gYGNxYS1jdXN0b20tdGV4dGFyZWFgIHNvXG4gICAgICAgICAgICAgICAgc3R5bGluZywgbGFiZWwsIGVycm9yIHJlbmRlcmluZywgYW5kIGFjY2Vzc2liaWxpdHkgY29tZSBmcm9tIHRoZVxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZS4gV2UgYmluZCB2aWEgW3ZhbHVlXSAvICh2YWx1ZUNoYW5nZSkgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZSBiZWNhdXNlIGNxYS1jdXN0b20tdGV4dGFyZWEgaXNuJ3QgYSBDVkEg4oCUIGNhbGxpbmdcbiAgICAgICAgICAgICAgICBmb3JtLmdldCgn4oCmJykuc2V0VmFsdWUgc3RpbGwgZmlyZXMgdGhlIGV4aXN0aW5nIHZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgKHdoaWNoIGNsZWFyIGlubGluZSBlcnJvcnMgYW5kIHJlY29tcHV0ZSB0aGVcbiAgICAgICAgICAgICAgICBtdWx0aS1vcGVyYXRpb24gd2FybmluZykuXG4gICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIGxhYmVsPVwiUXVlcnlcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JhcGhRTEZvcm0uZ2V0KCdxdWVyeScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImdyYXBoUUxGb3JtLmdldCgncXVlcnknKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJxdWVyeSBHZXRYKCRpZDogSUQhKSB7JiMxMDsgIHgoaWQ6ICRpZCkgeyBuYW1lIH0mIzEwO31cIlxuICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkdyYXBoUUwgcXVlcnlcIlxuICAgICAgICAgICAgICAgIFtlcnJvcnNdPVwiZ3JhcGhRTFF1ZXJ5RXJyb3IgPyBbZ3JhcGhRTFF1ZXJ5RXJyb3JdIDogW11cIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICAgICAgICAgICAgcmVzaXplPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJWYXJpYWJsZXMgKEpTT04pXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJncmFwaFFMRm9ybS5nZXQoJ3ZhcmlhYmxlcycpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ3JhcGhRTEZvcm0uZ2V0KCd2YXJpYWJsZXMnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0neyBcImlkXCI6IFwiYWJjXCIgfSdcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkdyYXBoUUwgdmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgICAgIFtlcnJvcnNdPVwiZ3JhcGhRTFZhcmlhYmxlc0Vycm9yID8gW2dyYXBoUUxWYXJpYWJsZXNFcnJvcl0gOiBbXVwiXG4gICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICAgICAgICAgICAgICByZXNpemU9XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPCEtLSBPcGVyYXRpb24gTmFtZTogb3B0aW9uYWwgdW5sZXNzIDIrIG9wZXJhdGlvbnMgYXJlIGRlY2xhcmVkLiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZ3JhcGhxbC1maWVsZCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWdyYXBocWwtbGFiZWwgY3FhLW0tMCBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdXCI+T3BlcmF0aW9uIE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdyYXBoUUxGb3JtLmdldCgnb3BlcmF0aW9uTmFtZScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJncmFwaFFMRm9ybS5nZXQoJ29wZXJhdGlvbk5hbWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBHZXRCb29raW5nXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiR3JhcGhRTCBvcGVyYXRpb24gbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJncmFwaFFMT3BlcmF0aW9uV2FybmluZ1wiIGNsYXNzPVwiY3FhLXRleHQtWyNCNDUzMDldIGNxYS10ZXh0LVsxMnB4XSBjcWEtbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBncmFwaFFMT3BlcmF0aW9uV2FybmluZyB9fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10ZXh0LVsxMnB4XSBjcWEtcC0yXCIgc3R5bGU9XCJib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICNFREU5RkU7IGJhY2tncm91bmQ6ICNGNUYzRkY7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OiA2MDA7XCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLXRleHQtWyM3QzNBRURdXCIgPmxpZ2h0YnVsYjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWyM3QzNBRURdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgVXNlIDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IGNvbG9yOmJsYWNrOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDJweDtcIj52YXI8L3NwYW4+IGluIHZhcmlhYmxlcyB0byBiaW5kIGZyb20gZWFybGllciBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCBzZXR0aW5ncyAoc3RlcC1sZXZlbCkuIEhpZGRlbiB3aGlsZSB0aGUgR3JhcGhRTCBwaWNrZXIgaXMgb3BlbiBzbyBpdCBkb2Vzbid0IGNvbXBldGUgZm9yIGZvY3VzIHdpdGggdGhlIG9wZXJhdGlvbiBsaXN0LiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImJvZHlWaWV3ICE9PSAnZ3JhcGhxbC1zY2hlbWEnXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMlwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMzogUmVzcG9uc2UgQm9keSAvIFN0YXR1cyB0YWJzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gM1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gdGFiLnZhbHVlID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWFjdGl2ZScgOiAnJylcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJlc3BvbnNlIEJvZHkgdGFiIGNvbnRlbnQ6IHZlcmlmaWNhdGlvbiBncmlkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3Jlc3BvbnNlLWJvZHknXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3cgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtY2VudGVyIGNxYS1wdC0wIGNxYS1wci0wIGNxYS1wYi0yIGNxYS1wbC0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5KU09OIFBhdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5EYXRhIFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiB2ZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmVyaWZpY2F0aW9uXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSnNvbiBQYXRoXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiSlNPTiBQYXRoXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWU6IHRleHQgZm9yIFN0cmluZy9BcnJheS9PYmplY3QsIG51bWJlciBmb3IgTnVtYmVyLCBkcm9wZG93biBmb3IgQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCIgW2Zvcm1dPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSAobnVtYmVyKVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaERlZmF1bHQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBTdHJpbmdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN0YXR1cyB0YWIgY29udGVudDogUy5ubywgVmVyaWZpY2F0aW9uIGRyb3Bkb3duLCBFeHBlY3RlZCBWYWx1ZSwgYWRkL3JlbW92ZSByb3dzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3N0YXR1cydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvdyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTAgY3FhLXByLTAgY3FhLXBiLTIgY3FhLXBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN0YXR1c1ZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGF0dXNWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicm93XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSZXNwb25zZSBQcmV2aWV3LiBIaWRkZW4gd2hpbGUgdGhlIEdyYXBoUUwgcGlja2VyIGlzIG9wZW4g4oCUIHRoZSB1c2VyIGlzIGluIFwicGljayBhbiBvcGVyYXRpb25cIiBtb2RlLCBub3QgXCJ2aWV3IGxhc3QgcmVzcG9uc2VcIiBtb2RlLCBzbyBzaG93aW5nIGEgc3RhbGUgcHJldmlldyBiZWxvdyB0aGUgcGlja2VyIGlzIGp1c3Qgbm9pc2UuIC0tPlxuICA8ZGl2ICpuZ0lmPVwiYm9keVZpZXcgIT09ICdncmFwaHFsLXNjaGVtYSdcIiAjcmVzcG9uc2VQcmV2aWV3UmVmIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2VcIj5cbiAgICA8aDMgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS10aXRsZSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLW1iLVsxMnB4XSBjcWEtc2hyaW5rLTBcIj5SZXNwb25zZSBQcmV2aWV3PC9oMz5cbiAgICA8cHJlIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2UtY29udGVudFwiPnt7IHJlc3BvbnNlUHJldmlldyB9fTwvcHJlPlxuICA8L2Rpdj5cblxuICA8IS0tIFN0ZXAgYWN0aW9uczogb25lIHJvdywgZnVsbCB3aWR0aC4gU3RlcCAxOiBDYW5jZWwgKyBOZXh0OyBTdGVwIDI6IEJhY2sgKyBOZXh0OyBTdGVwIDM6IEJhY2sgKyBDcmVhdGUgLS0+XG4gIDxkaXYgKm5nSWY9XCJib2R5VmlldyAhPT0gJ2dyYXBocWwtc2NoZW1hJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9uc1wiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImN1cnJlbnRTdGVwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIxXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjJcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIk5leHRcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tbmV4dFwiIChjbGlja2VkKT1cIm9uTmV4dCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkJhY2tcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tYmFja1wiIChjbGlja2VkKT1cIm9uQmFjaygpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1N0ZXBcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cImVkaXRNb2RlID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jcmVhdGVcIiAoY2xpY2tlZCk9XCJvbkNyZWF0ZSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBNYXRjaCBjcWEtYnV0dG9uIGZsZXg6IGFjdGlvbnMgcm93IHN0eWxlcyA+IGNxYS1idXR0b24geyBmbGV4OiAxIDEgMCB9IOKAlCBsb2FkZXIgZGl2IG11c3QgZ3JvdyBzYW1lIHdpZHRoIGFzIENyZWF0ZSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWxvYWRlciBjcWEtdy1mdWxsIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQ3JlYXRpbmfigKZcIiBpY29uPVwiYXV0b3JlbmV3XCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCIgc2l6ZT1cIm1lZGl1bVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|