@cqa-lib/cqa-ui 1.1.536 → 1.1.537-gamma.5
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/.github/workflows/README.md +8 -1
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
- package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
- package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +30 -10
- package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +129 -0
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +16 -5
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
- package/esm2020/lib/segment-control/segment-control.component.mjs +12 -4
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +17 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +17 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +12 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +315 -27
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +109 -10
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +9 -1
- package/esm2020/lib/templates/table-template.component.mjs +5 -3
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +43 -4
- package/esm2020/lib/test-case-details/test-case-details.models.mjs +3 -1
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +776 -124
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +702 -61
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/new-global-variable-dialog/global-variable-tags-input.component.d.ts +39 -0
- package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +5 -2
- package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +8 -0
- package/lib/segment-control/segment-control.component.d.ts +3 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +15 -1
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +15 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +11 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +71 -4
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +9 -0
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +15 -0
- package/lib/templates/table-template.component.d.ts +8 -1
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +7 -0
- package/lib/test-case-details/test-case-details.models.d.ts +2 -0
- package/lib/ui-kit.module.d.ts +97 -96
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs
CHANGED
|
@@ -20,6 +20,7 @@ export const TEST_CASE_DETAILS_SELECT_KEYS = {
|
|
|
20
20
|
type: 'type',
|
|
21
21
|
labels: 'labels',
|
|
22
22
|
prerequisiteCases: 'prerequisiteCases',
|
|
23
|
+
environment: 'environment',
|
|
23
24
|
testDataProfile: 'testDataProfile',
|
|
24
25
|
testDataSet: 'testDataSet',
|
|
25
26
|
videoRecording: 'videoRecording',
|
|
@@ -144,6 +145,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
144
145
|
type: new FormControl(''),
|
|
145
146
|
labels: new FormControl([]),
|
|
146
147
|
prerequisiteCases: new FormControl([]),
|
|
148
|
+
environment: new FormControl(''),
|
|
147
149
|
testDataProfile: new FormControl(''),
|
|
148
150
|
testDataSet: new FormControl(''),
|
|
149
151
|
defaultBrowser: new FormControl(''),
|
|
@@ -178,6 +180,13 @@ export class TestCaseDetailsEditComponent {
|
|
|
178
180
|
searchable: true,
|
|
179
181
|
options: [],
|
|
180
182
|
};
|
|
183
|
+
this.environmentSelectConfig = {
|
|
184
|
+
key: 'environment',
|
|
185
|
+
label: '',
|
|
186
|
+
placeholder: 'Select environment',
|
|
187
|
+
searchable: true,
|
|
188
|
+
options: [],
|
|
189
|
+
};
|
|
181
190
|
this.testDataProfileSelectConfig = {
|
|
182
191
|
key: 'testDataProfile',
|
|
183
192
|
label: '',
|
|
@@ -442,6 +451,16 @@ export class TestCaseDetailsEditComponent {
|
|
|
442
451
|
this._labelsSelectConfigDirty = true;
|
|
443
452
|
this.cdr.markForCheck();
|
|
444
453
|
}
|
|
454
|
+
// Environment cascade: clear dependent Test Data Profile / Set selections so the host
|
|
455
|
+
// re-fetches profiles for the new env. Mark dirty to prevent ngOnChanges re-seed.
|
|
456
|
+
if (event.key === TEST_CASE_DETAILS_SELECT_KEYS.environment) {
|
|
457
|
+
const tdpCtrl = this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.testDataProfile);
|
|
458
|
+
const tdsCtrl = this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.testDataSet);
|
|
459
|
+
tdpCtrl?.setValue('', { emitEvent: false });
|
|
460
|
+
tdsCtrl?.setValue('', { emitEvent: false });
|
|
461
|
+
tdpCtrl?.markAsDirty();
|
|
462
|
+
tdsCtrl?.markAsDirty();
|
|
463
|
+
}
|
|
445
464
|
// Mark Test Data selects as dirty so later input changes (options/config) don't overwrite user choice
|
|
446
465
|
if (event.key === TEST_CASE_DETAILS_SELECT_KEYS.testDataProfile || event.key === TEST_CASE_DETAILS_SELECT_KEYS.testDataSet) {
|
|
447
466
|
const ctrl = this.editForm.get(event.key);
|
|
@@ -552,9 +571,11 @@ export class TestCaseDetailsEditComponent {
|
|
|
552
571
|
this.editStatus = this.statusItem?.value ?? '';
|
|
553
572
|
this.editPriority = this.priorityItem?.value ?? '';
|
|
554
573
|
const typeRaw = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
574
|
+
const environmentRaw = this.getConfigItemValue('Execution', 'Environment') ?? '';
|
|
555
575
|
const testDataProfileRaw = this.getConfigItemValue('Execution', 'Test Data Profile') ?? '';
|
|
556
576
|
const testDataSetRaw = this.normalizeTestDataSetRawValue(this.getConfigItemValue('Execution', 'Test Data Set') ?? '');
|
|
557
577
|
const typeVal = this.resolveToOptionValue(typeRaw, this.selectConfigOverrides?.['type']?.options) ?? typeRaw;
|
|
578
|
+
const environmentVal = this.resolveToOptionValue(environmentRaw, this.selectConfigOverrides?.['environment']?.options) ?? environmentRaw;
|
|
558
579
|
const testDataProfileVal = this.resolveToOptionValue(testDataProfileRaw, this.selectConfigOverrides?.['testDataProfile']?.options) ?? testDataProfileRaw;
|
|
559
580
|
const testDataSetVal = this.resolveToOptionValue(testDataSetRaw, this.selectConfigOverrides?.['testDataSet']?.options) ?? testDataSetRaw;
|
|
560
581
|
this.editLabels = [...this.labels];
|
|
@@ -590,6 +611,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
590
611
|
priority: this.editPriority,
|
|
591
612
|
type: typeVal || '',
|
|
592
613
|
labels: this.editLabels,
|
|
614
|
+
environment: environmentVal || '',
|
|
593
615
|
testDataProfile: testDataProfileVal || '',
|
|
594
616
|
testDataSet: testDataSetVal ?? '',
|
|
595
617
|
prerequisiteCases,
|
|
@@ -616,6 +638,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
616
638
|
const status = this.editForm.get('status')?.value ?? this.editStatus;
|
|
617
639
|
const priority = this.editForm.get('priority')?.value ?? this.editPriority;
|
|
618
640
|
const typeVal = this.editForm.get('type')?.value ?? '';
|
|
641
|
+
const environmentVal = this.editForm.get('environment')?.value ?? '';
|
|
619
642
|
const testDataProfileVal = this.editForm.get('testDataProfile')?.value ?? '';
|
|
620
643
|
const testDataSetVal = this.editForm.get('testDataSet')?.value ?? '';
|
|
621
644
|
const configSectionsMerged = this.mergeConfigSections();
|
|
@@ -626,6 +649,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
626
649
|
priority,
|
|
627
650
|
type: typeVal,
|
|
628
651
|
labels: this.editLabels,
|
|
652
|
+
environmentId: environmentVal || null,
|
|
629
653
|
testDataProfileId: testDataProfileVal || null,
|
|
630
654
|
testDataSetIndex: testDataSetVal ?? null,
|
|
631
655
|
configSections: configSectionsMerged,
|
|
@@ -699,6 +723,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
699
723
|
this._labelsSelectConfigDirty = true;
|
|
700
724
|
if (changes['selectConfigOverrides'] && this.editForm?.get('type')) {
|
|
701
725
|
const typeCtrl = this.editForm.get('type');
|
|
726
|
+
const envCtrl = this.editForm.get('environment');
|
|
702
727
|
const tdpCtrl = this.editForm.get('testDataProfile');
|
|
703
728
|
const tdsCtrl = this.editForm.get('testDataSet');
|
|
704
729
|
const enableAiCtrl = this.editForm.get('enableAiSmartness');
|
|
@@ -708,6 +733,11 @@ export class TestCaseDetailsEditComponent {
|
|
|
708
733
|
const typeRaw = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
709
734
|
patch['type'] = (this.resolveToOptionValue(typeRaw, this.selectConfigOverrides?.['type']?.options) ?? typeRaw) || '';
|
|
710
735
|
}
|
|
736
|
+
if (envCtrl && !envCtrl.dirty) {
|
|
737
|
+
const envRaw = this.getConfigItemValue('Execution', 'Environment') ?? '';
|
|
738
|
+
patch['environment'] =
|
|
739
|
+
(this.resolveToOptionValue(envRaw, this.selectConfigOverrides?.['environment']?.options) ?? envRaw) || '';
|
|
740
|
+
}
|
|
711
741
|
// For Test Data Profile / Set, allow one-time re-resolve from config when options arrive,
|
|
712
742
|
// but never overwrite a user-edited (dirty) value.
|
|
713
743
|
if (tdpCtrl && !tdpCtrl.dirty) {
|
|
@@ -779,9 +809,11 @@ export class TestCaseDetailsEditComponent {
|
|
|
779
809
|
const knowledgeBaseDefaultTestCase = this.resolveToOptionValue(knowledgeBaseDefaultTestCaseRaw, this.selectConfigOverrides?.['knowledgeBaseDefaultTestCase']?.options) ?? knowledgeBaseDefaultTestCaseRaw;
|
|
780
810
|
const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
|
|
781
811
|
const typeRaw = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
812
|
+
const environmentRaw = this.getConfigItemValue('Execution', 'Environment') ?? '';
|
|
782
813
|
const testDataProfileRaw = this.getConfigItemValue('Execution', 'Test Data Profile') ?? '';
|
|
783
814
|
const testDataSetRaw = this.normalizeTestDataSetRawValue(this.getConfigItemValue('Execution', 'Test Data Set') ?? '');
|
|
784
815
|
const typeVal = this.resolveToOptionValue(typeRaw, this.selectConfigOverrides?.['type']?.options) ?? typeRaw;
|
|
816
|
+
const environmentVal = this.resolveToOptionValue(environmentRaw, this.selectConfigOverrides?.['environment']?.options) ?? environmentRaw;
|
|
785
817
|
const testDataProfileVal = this.resolveToOptionValue(testDataProfileRaw, this.selectConfigOverrides?.['testDataProfile']?.options) ?? testDataProfileRaw;
|
|
786
818
|
const testDataSetVal = this.resolveToOptionValue(testDataSetRaw, this.selectConfigOverrides?.['testDataSet']?.options) ?? testDataSetRaw;
|
|
787
819
|
const defaultBrowser = this.getConfigItemValue('Execution', 'Default Browser');
|
|
@@ -815,11 +847,15 @@ export class TestCaseDetailsEditComponent {
|
|
|
815
847
|
patch['prerequisiteCases'] = prerequisiteCases;
|
|
816
848
|
if (typeVal)
|
|
817
849
|
patch['type'] = typeVal;
|
|
818
|
-
// Re-sync Test Data Profile / Set from config only when controls are NOT dirty
|
|
850
|
+
// Re-sync Environment / Test Data Profile / Set from config only when controls are NOT dirty
|
|
851
|
+
const envCtrl2 = this.editForm.get('environment');
|
|
819
852
|
const tdpCtrl2 = this.editForm.get('testDataProfile');
|
|
820
853
|
const tdsCtrl2 = this.editForm.get('testDataSet');
|
|
854
|
+
const preserveEnv2 = envCtrl2?.dirty;
|
|
821
855
|
const preserveTdp2 = tdpCtrl2?.dirty;
|
|
822
856
|
const preserveTds2 = tdsCtrl2?.dirty;
|
|
857
|
+
if (environmentVal && !preserveEnv2)
|
|
858
|
+
patch['environment'] = environmentVal;
|
|
823
859
|
if (testDataProfileVal && !preserveTdp2)
|
|
824
860
|
patch['testDataProfile'] = testDataProfileVal;
|
|
825
861
|
if (testDataSetVal != null && testDataSetVal !== '' && !preserveTds2)
|
|
@@ -875,6 +911,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
875
911
|
: [];
|
|
876
912
|
const prerequisiteCaseValue = prerequisiteCases.length ? prerequisiteCases.join(',') : null;
|
|
877
913
|
const typeValue = this.editForm.get('type')?.value ?? '';
|
|
914
|
+
const environmentValue = this.editForm.get('environment')?.value ?? '';
|
|
878
915
|
const testDataProfileValue = this.editForm.get('testDataProfile')?.value ?? '';
|
|
879
916
|
const testDataSetValue = this.editForm.get('testDataSet')?.value ?? '';
|
|
880
917
|
return this.configSections.map((section) => {
|
|
@@ -888,6 +925,8 @@ export class TestCaseDetailsEditComponent {
|
|
|
888
925
|
return { ...item, value: prerequisiteCaseValue };
|
|
889
926
|
if (item.label === 'Type')
|
|
890
927
|
return { ...item, value: typeValue };
|
|
928
|
+
if (item.label === 'Environment')
|
|
929
|
+
return { ...item, value: environmentValue };
|
|
891
930
|
if (item.label === 'Test Data Profile')
|
|
892
931
|
return { ...item, value: testDataProfileValue };
|
|
893
932
|
if (item.label === 'Test Data Set')
|
|
@@ -1020,10 +1059,10 @@ export class TestCaseDetailsEditComponent {
|
|
|
1020
1059
|
}
|
|
1021
1060
|
}
|
|
1022
1061
|
TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1023
|
-
TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange", configureApiMocking: "configureApiMocking" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.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: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.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: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.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: i7.DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: i8.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }, { type: i9.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1062
|
+
TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange", configureApiMocking: "configureApiMocking" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Environment</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('environment', environmentSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('environment')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.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: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.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: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.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: i7.DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: i8.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }, { type: i9.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1024
1063
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
|
|
1025
1064
|
type: Component,
|
|
1026
|
-
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
1065
|
+
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Environment</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('environment', environmentSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('environment')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
1027
1066
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { descriptionTitle: [{
|
|
1028
1067
|
type: Input
|
|
1029
1068
|
}], descriptionContent: [{
|
|
@@ -1103,4 +1142,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1103
1142
|
}], configureApiMocking: [{
|
|
1104
1143
|
type: Output
|
|
1105
1144
|
}] } });
|
|
1106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7QUFXeEQsbUhBQW1IO0FBQ25ILE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBeUJ2QyxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFD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QkFBdkIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTTtnQkFFRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBRUcseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uLFxuICBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0sXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1kZXRhaWxzLm1vZGVscyc7XG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9uIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24tYnV0dG9uL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQnO1xuXG4vKiogU2VudGluZWwgdmFsdWUgZW1pdHRlZCBpbiBzYXZlIHBheWxvYWRzIHRvIHRlbGwgdGhlIGhvc3QgdG8gc2VuZCBudWxsIGZvciB0aGUgZmllbGQgKHVzZSBvcmctbGV2ZWwgZGVmYXVsdCkuICovXG5jb25zdCBPUkdfTEVWRUxfU0VOVElORUwgPSAnT3JnIGxldmVsJztcblxuLyoqIE92ZXJyaWRlIGNvbmZpZyBmb3IgYSBzcGVjaWZpYyBzZWxlY3QuIFVzZSBmb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBsb2FkIG1vcmUsIGN1c3RvbSBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RDb25maWdPdmVycmlkZSB7XG4gIC8qKiBSZXBsYWNlIG9wdGlvbnMgKGUuZy4gZnJvbSBBUEkpLiBVcGRhdGUgd2hlbiBBUEkgcmV0dXJucy4gKi9cbiAgb3B0aW9ucz86IFNlbGVjdE9wdGlvbltdO1xuICAvKiogRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaDsgY29tcG9uZW50IGVtaXRzIHNlbGVjdFNlYXJjaCBpbnN0ZWFkIG9mIGxvY2FsIGZpbHRlcmluZy4gKi9cbiAgc2VydmVyU2VhcmNoPzogYm9vbGVhbjtcbiAgLyoqIEluZGljYXRlcyBtb3JlIHJlc3VsdHMgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogTG9hZGluZyBzdGF0ZSAoZS5nLiBkdXJpbmcgQVBJIGNhbGwpLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHNlYXJjaCBpbnB1dCBpbiB0aGUgc2VsZWN0LiAqL1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdHJpZ2dlcnMgaW5pdGlhbCBzZWFyY2ggb24gcGFuZWwgb3BlbiAoc2VydmVyU2VhcmNoIG1vZGUpLiAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogQ2FsbGJhY2sgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaC4gQ2FsbCBBUEksIHRoZW4gdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgb25TZWFyY2g/OiAocXVlcnk6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKiBNYXAgb2Ygc2VsZWN0IGtleSAtPiBjb25maWcgb3ZlcnJpZGUuIEVuYWJsZXMgQVBJLWRyaXZlbiBvcHRpb25zLCBpbmZpbml0ZSBzZWFyY2gsIGxvYWQgbW9yZS4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgU2VsZWN0Q29uZmlnT3ZlcnJpZGU+PjtcblxuLyoqIEtleXMgZm9yIGVhY2ggZHluYW1pYyBzZWxlY3QgaW4gdGVzdC1jYXNlLWRldGFpbHMtZWRpdC4gVXNlIHRoZXNlIHdpdGggc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTID0ge1xuICBzdGF0dXM6ICdzdGF0dXMnLFxuICBwcmlvcml0eTogJ3ByaW9yaXR5JyxcbiAgdHlwZTogJ3R5cGUnLFxuICBsYWJlbHM6ICdsYWJlbHMnLFxuICBwcmVyZXF1aXNpdGVDYXNlczogJ3ByZXJlcXVpc2l0ZUNhc2VzJyxcbiAgdGVzdERhdGFQcm9maWxlOiAndGVzdERhdGFQcm9maWxlJyxcbiAgdGVzdERhdGFTZXQ6ICd0ZXN0RGF0YVNldCcsXG4gIHZpZGVvUmVjb3JkaW5nOiAndmlkZW9SZWNvcmRpbmcnLFxuICBlbmFibGVBaVNtYXJ0bmVzczogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgZGVmYXVsdEFpQWN0aW9uOiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLFxuICB1c2VBaU1ldGFkYXRhOiAndXNlQWlNZXRhZGF0YScsXG4gIGRlZmF1bHRCcm93c2VyOiAnZGVmYXVsdEJyb3dzZXInLFxuICBkZWZhdWx0Vmlld3BvcnQ6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICBkZXZpY2VUeXBlOiAnZGV2aWNlVHlwZScsXG4gIGRldmljZU9TOiAnZGV2aWNlT1MnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHByaW9yaXR5OiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxhYmVsczogc3RyaW5nW107XG4gIHRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgdGVzdERhdGFTZXRJbmRleD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW107XG4gIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICAvKiogXCJVc2UgbW9jayBBUEkgcmVzcG9uc2VzXCIgcm93IHN0YXRlLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXBpTW9ja2luZ1N0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBhcGlNb2NraW5nUmVzdG9yZU1vY2s/OiBib29sZWFuO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGFwaU1vY2tpbmdSZXN0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBhcGlNb2NraW5nU3RvcmVNb2NrPzogYm9vbGVhbjtcbn1cblxuY29uc3QgRlJFUVVFTlRMWV9VU0VEX0xBQkVMUyA9IFtcbiAgJ0Nhc2UnLFxuICAnQ3JpdGljYWwnLFxuICAnUE8nLFxuICAnVXBsb2FkJyxcbiAgJ1ZhbGlkYXRpb24nLFxuICAnUmV2aWV3JyxcbiAgJ0VkZ2UtY2FzZXMnLFxuICAnU2VjdXJpdHknLFxuICAnSW50ZWdyYXRpb24nLFxuICAnU21va2UnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG4gIC8qKiBXaGVuIHRydWUsIGRlc2NyaXB0aW9uIHVzZXMgVHJpeCByaWNoIHRleHQgZWRpdG9yIChCb2xkLCBJdGFsaWMsIGV0Yy4pLiBIb3N0IGFwcCBtdXN0IGxvYWQgVHJpeC4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBpc1NhdmluZyA9IGZhbHNlO1xuICAvKiogT3B0aW9uYWwgbGlzdCBvZiBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIHRoZSBtdWx0aS1zZWxlY3QuIElmIG5vdCBwcm92aWRlZCwgdXNlcyBkZWZhdWx0IHNhbXBsZSBvcHRpb25zLiAqL1xuICBASW5wdXQoKSBwcmVyZXF1aXNpdGVDYXNlT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgc2hvd3MgRGVmYXVsdCBCcm93c2VyICsgVmlld3BvcnQ7ICdtb2JpbGUnIHNob3dzIERldmljZSBUeXBlICsgT1MuIERlZmF1bHRzIHRvICd3ZWInLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhpZGVzIFByaW9yaXR5LCBUeXBlLCBhbmQgVGVzdCBEYXRhIFNldCBmaWVsZHMgKHN0ZXAgZ3JvdXBzIGRvbid0IGhhdmUgdGhlc2UpLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgQElucHV0KCkgaXNTdGVwR3JvdXAgPSBmYWxzZTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3Qga2V5LiBVc2UgZm9yOlxuICAgKiAtIEFQSS1kcml2ZW4gb3B0aW9uczogcGFzcyBvcHRpb25zIGFycmF5ICh1cGRhdGUgd2hlbiBBUEkgcmV0dXJucylcbiAgICogLSBTZXJ2ZXItc2lkZSBzZWFyY2g6IHNlcnZlclNlYXJjaDogdHJ1ZSwgb25TZWFyY2ggaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdFNlYXJjaFxuICAgKiAtIEluZmluaXRlIHNjcm9sbDogaGFzTW9yZTogdHJ1ZSwgb25Mb2FkTW9yZSBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0TG9hZE1vcmVcbiAgICogLSBJbml0aWFsIGZldGNoIG9uIG9wZW46IGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcblxuICAvLyDilIDilIAgQVBJIE1vY2tpbmcgY2FyZCAoZWRpdCBtb2RlOiBzaG93cyB0d28gdG9nZ2xlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIEBJbnB1dCgpIHNob3dBcGlNb2NraW5nQ2FyZCA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nVGl0bGUgPSAnQVBJIE1vY2tpbmcnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3RhdHVzTGFiZWwgPSAnTm90IGNvbmZpZ3VyZWQnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUxhYmVsID0gJ1VzZSBtb2NrIEFQSSByZXNwb25zZXMnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUhpbnQgPSAnVXNlcyBzdG9yZWQgcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJuIG9uIGFmdGVyIGNhcHR1cmUgY29tcGxldGVzLic7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0xhYmVsID0gJ1JlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1JlbmV3SGludCA9ICdSZS1jYXB0dXJlcyBmcmVzaCByZXNwb25zZXMgb24gbmV4dCBydW4uIFR1cm5zIG9mZiBVc2UgbW9jay4nO1xuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsIHRvZ2dsZSBzdGF0ZS5cbiAgICogICB0cnVlICDihpIgUmVuZXcgT04sIENhcHR1cmUgT0ZGXG4gICAqICAgZmFsc2Ug4oaSIFJlbmV3IE9GRiwgQ2FwdHVyZSBPTlxuICAgKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrID0gZmFsc2U7XG4gIC8qKiBcIlJlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzXCIg4oCUIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhcGlNb2NraW5nUmVzdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0b3JlTW9jayA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1Byb2dyZXNzUGVyY2VudCA9IDA7XG4gIC8qKiBGb3J3YXJkZWQgdG8gYGNxYS1hcGktbW9ja2luZy1jYXJkYC4gSW4gZWRpdCBtb2RlIHRoZSBjYXJkIGhpZGVzIHRoZSBibG9jayBhbnl3YXksIGJ1dFxuICAgKiAgd2Ugc3RpbGwgcGlwZSB0aGUgaW5wdXQgdGhyb3VnaCBmb3Igc3ltbWV0cnkgd2l0aCB0aGUgcmVhZC1vbmx5IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Nob3dQcm9ncmVzcyA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQZXJjZW50VGV4dD86IHN0cmluZztcblxuICAvKiogT3JnLWxldmVsIGRlZmF1bHQgZm9yIFRlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKS4gVXNlZCB0byBmbGFnIHRoZSBpbnB1dCBhcyBcIk9SRyBsZXZlbFwiIHZzIFwiQ3VzdG9tXCIuICovXG4gIEBJbnB1dCgpIG9yZ0xldmVsVGVzdENhc2VUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBhIHNlbGVjdCAoc2VydmVyU2VhcmNoIG1vZGUpLiBDYWxsIEFQSSBhbmQgdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCB0byBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3QgcGFuZWwgaXMgb3BlbmVkLiBVc2UgdG8gY2FsbCBBUEkgZm9yIGluaXRpYWwgbG9hZCAoZS5nLiB3aGVuIGluaXRpYWxGZXRjaE9uT3BlbikuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIGluIGFueSBzZWxlY3QuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGFkZHMgYSBuZXcgY3VzdG9tIGxhYmVsIHZpYSB0aGUgXCJOZXdcIiBvcHRpb24uICovXG4gIEBPdXRwdXQoKSBsYWJlbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiQ29uZmlndXJlIE1vY2sgQVBJc1wiIG9uIHRoZSBlbWJlZGRlZCBjYXJkIGluIGVkaXQgbW9kZS4gKi9cbiAgQE91dHB1dCgpIGNvbmZpZ3VyZUFwaU1vY2tpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBGb3JtIHN0YXRlICovXG4gIGVkaXREZXNjcmlwdGlvbiA9ICcnO1xuICBlZGl0U3RhdHVzID0gJyc7XG4gIGVkaXRQcmlvcml0eSA9ICcnO1xuICBlZGl0TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogTG9jYWwgZWRpdC1tb2RlIG1pcnJvciBvZiB0aGUgYHJlc3RvcmVNb2NrYCBib29sZWFuLiBTZWVkZWQgZnJvbSBASW5wdXQoKSBvbiBpbml0L2NoYW5nZXMuICovXG4gIGVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgLyoqIExvY2FsIGVkaXQtbW9kZSBtaXJyb3Igb2YgdGhlIGBzdG9yZU1vY2tgIGJvb2xlYW4uICovXG4gIGVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICAvKiogJ29yZycg4oaSIGlucHV0IGRpc2FibGVkLCBwYXlsb2FkIHNlbmRzIG51bGwgZm9yIHRlc3RjYXNlVGltZW91dDsgJ2N1c3RvbScg4oaSIGlucHV0IGVuYWJsZWQsIHBheWxvYWQgc2VuZHMgdGhlIHR5cGVkIHZhbHVlLiAqL1xuICB0ZXN0Q2FzZVRpbWVvdXRNb2RlOiAnb3JnJyB8ICdjdXN0b20nID0gJ29yZyc7XG4gIHdhaXRUaW1lb3V0TG9jYXRvcnMgPSAnJztcbiAgYXV0b1dhaXRFbmFibGVkID0gZmFsc2U7XG4gIHJldHJ5RmFpbGVkU3RlcHMgPSAnJztcbiAgY29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICBleGVjdXRpb25FeHBhbmRlZCA9IHRydWU7XG4gIGFpQ29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICB3YWl0c1JldHJpZXNFeHBhbmRlZCA9IHRydWU7XG4gIGRldmljZUV4cGFuZGVkID0gdHJ1ZTtcbiAga2V5RmxhZ3NFeHBhbmRlZCA9IHRydWU7XG4gIG1vYmlsZVRlc3RpbmdFbmFibGVkID0gZmFsc2U7XG4gIGV4dGVuc2lvblVzZUVuYWJsZWQgPSBmYWxzZTtcbiAgZGF0YURyaXZlbkVuYWJsZWQgPSBmYWxzZTtcblxuICByZWFkb25seSBmcmVxdWVudGx5VXNlZExhYmVscyA9IEZSRVFVRU5UTFlfVVNFRF9MQUJFTFM7XG4gIHByaXZhdGUgX2luaXRpYWxGb3JtU25hcHNob3Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3JtR3JvdXAgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBiaW5kaW5ncyAqL1xuICBlZGl0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmlvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGxhYmVsczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBwcmVyZXF1aXNpdGVDYXNlczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICB0ZXN0RGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdGVzdERhdGFTZXQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEJyb3dzZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdmlkZW9SZWNvcmRpbmc6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdFZpZXdwb3J0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZVR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlT1M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZW5hYmxlQWlTbWFydG5lc3M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEFpQWN0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdXNlQWlNZXRhZGF0YTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgfSk7XG5cbiAgZ2V0IHN0YXR1c0l0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdTdGF0dXMnKTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eUl0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdQcmlvcml0eScpO1xuICB9XG5cbiAgZ2V0IHR5cGVJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnVHlwZScpO1xuICB9XG5cbiAgZ2V0IHN0YXR1c09wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0RyYWZ0JywgJ0luIFJldmlldycsICdBcHByb3ZlZCcsICdBY3RpdmUnLCAnSW5hY3RpdmUnLCAnQmxvY2tlZCddO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5T3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnQ3JpdGljYWwnLCAnTWFqb3InLCAnSGlnaCcsICdNZWRpdW0nLCAnTG93JywgJ01pbm9yJywgJ05vdCBzZXQnXTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgY29uZmlncyB0byBhdm9pZCBuZXcgb2JqZWN0IHJlZnMgZWFjaCBjaGFuZ2UgZGV0ZWN0aW9uIChwcmV2ZW50cyBpbmZpbml0ZSBsb29wcykgKi9cbiAgcmVhZG9ubHkgc3RhdHVzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnc3RhdHVzJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTdGF0dXMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdEcmFmdCcsIG5hbWU6ICdEcmFmdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdJbiBSZXZpZXcnLCBuYW1lOiAnSW4gUmV2aWV3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FwcHJvdmVkJywgbmFtZTogJ0FwcHJvdmVkJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FjdGl2ZScsIG5hbWU6ICdBY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnSW5hY3RpdmUnLCBuYW1lOiAnSW5hY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnQmxvY2tlZCcsIG5hbWU6ICdCbG9ja2VkJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgdHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1R5cGUnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcmVhZG9ubHkgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVNldFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3Rlc3REYXRhU2V0JyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgU2V0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFByZXJlcXVpc2l0ZUNhc2VPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDInLCBuYW1lOiAnVEMtMDAyOiBVc2VyIHJlZ2lzdHJhdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDUnLCBuYW1lOiAnVEMtMDA1OiBBUEkgaGVhbHRoIGNoZWNrJyB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmlkZW9SZWNvcmRpbmcnLFxuICAgIGxhYmVsOiAnUmVjb3JkIHRlc3QgZXhlY3V0aW9uIHZpZGVvJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgYWlNZXRhZGF0YUNvbGxlY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd1c2VBaU1ldGFkYXRhJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIENhY2hlZCBsYWJlbHMgY29uZmlnIHRvIGF2b2lkIG5ldyBvYmplY3Qgb24gZXZlcnkgQ0QgKHByZXZlbnRzIGZyZWV6ZSkgKi9cbiAgcHJpdmF0ZSBfbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG5cbiAgLyoqIExhYmVscyBtdWx0aS1zZWxlY3Q6IG9wdGlvbnMgPSBmcmVxdWVudGx5IHVzZWQgKyBjdXJyZW50ICsgQVBJIG9wdGlvbnMgZnJvbSBzZWxlY3RDb25maWdPdmVycmlkZXMgKi9cbiAgZ2V0IGxhYmVsc1NlbGVjdENvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGlmICghdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgJiYgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzW1RFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVsc107XG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IG92ZXJyaWRlPy5vcHRpb25zID8/IFtdO1xuICAgIGNvbnN0IGFsbExhYmVscyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAuLi50aGlzLmZyZXF1ZW50bHlVc2VkTGFiZWxzLFxuICAgICAgLi4udGhpcy5lZGl0TGFiZWxzLFxuICAgICAgLi4uYXBpT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLm5hbWUgPz8gby52YWx1ZSA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgXSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20oYWxsTGFiZWxzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LCBuYW1lOiB2IH0pKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ2xhYmVscycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBsYWJlbHMgdG8gYWRkIC4uLi4uLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU7XG4gIH1cblxuICBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICAgIGxhYmVsOiAnUHJlcmVxdWlzaXRlIENhc2UnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgIHNob3dTZWxlY3RBbGw6IHRydWUsXG4gICAgc2VsZWN0QWxsTGFiZWw6ICdBbGwnLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0Vmlld3BvcnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICcxMjgweDcyMCcsIG5hbWU6ICcxMjgweDcyMCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VUeXBlJyxcbiAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNCcsIG5hbWU6ICdpUGhvbmUgMTQnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE1JywgbmFtZTogJ2lQaG9uZSAxNScgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTcnLCBuYW1lOiAnaVBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0lwaG9uZSAxNycsIG5hbWU6ICdJcGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnU2Ftc3VuZyBHYWxheHknLCBuYW1lOiAnU2Ftc3VuZyBHYWxheHknIH0sXG4gICAgICB7IHZhbHVlOiAnUGl4ZWwnLCBuYW1lOiAnUGl4ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VPU1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZU9TJyxcbiAgICBsYWJlbDogJ09TJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lwYScsIG5hbWU6ICdpT1MgKGlwYSknIH0sXG4gICAgICB7IHZhbHVlOiAnYXBrJywgbmFtZTogJ0FuZHJvaWQgKGFwayknIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE2JywgbmFtZTogJ2lPUyAxNicgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTcnLCBuYW1lOiAnaU9TIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTMnLCBuYW1lOiAnQW5kcm9pZCAxMycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDE0JywgbmFtZTogJ0FuZHJvaWQgMTQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRCcm93c2VyJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsXG4gICAgcGxhY2Vob2xkZXI6ICdDaHJvbWUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDaHJvbWUnLCBuYW1lOiAnQ2hyb21lJyB9LFxuICAgICAgeyB2YWx1ZTogJ0ZpcmVmb3gnLCBuYW1lOiAnRmlyZWZveCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTYWZhcmknLCBuYW1lOiAnU2FmYXJpJyB9LFxuICAgICAgeyB2YWx1ZTogJ0VkZ2UnLCBuYW1lOiAnRWRnZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHByaW9yaXR5U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJpb3JpdHknLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1ByaW9yaXR5JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ3JpdGljYWwnLCBuYW1lOiAnQ3JpdGljYWwnIH0sXG4gICAgICB7IHZhbHVlOiAnTWFqb3InLCBuYW1lOiAnTWFqb3InIH0sXG4gICAgICB7IHZhbHVlOiAnSGlnaCcsIG5hbWU6ICdIaWdoJyB9LFxuICAgICAgeyB2YWx1ZTogJ01lZGl1bScsIG5hbWU6ICdNZWRpdW0nIH0sXG4gICAgICB7IHZhbHVlOiAnTG93JywgbmFtZTogJ0xvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdNaW5vcicsIG5hbWU6ICdNaW5vcicgfSxcbiAgICAgIHsgdmFsdWU6ICdOb3Qgc2V0JywgbmFtZTogJ05vdCBzZXQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBTbWFydG5lc3MnLFxuICAgIHBsYWNlaG9sZGVyOiAnQWR2YW5jZWQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdCYXNpYycsIG5hbWU6ICdCYXNpYycgfSxcbiAgICAgIHsgdmFsdWU6ICdBZHZhbmNlZCcsIG5hbWU6ICdBZHZhbmNlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdPZmYnLCBuYW1lOiAnT2ZmJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQUkgQWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NtYXJ0IHdhaXQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdTbWFydCB3YWl0JywgbmFtZTogJ1NtYXJ0IHdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnU21hcnQgV2FpdCcsIG5hbWU6ICdTbWFydCBXYWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1dhaXQgZm9yIGVsZW1lbnQnLCBuYW1lOiAnV2FpdCBmb3IgZWxlbWVudCcgfSxcbiAgICAgIHsgdmFsdWU6ICdSZXRyeScsIG5hbWU6ICdSZXRyeScgfSxcbiAgICAgIHsgdmFsdWU6ICdTa2lwJywgbmFtZTogJ1NraXAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsXG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnbm9uZScsIG5hbWU6ICdOb25lJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWVyZ2VkIGNvbmZpZyBmb3IgYSBzZWxlY3Q6IGJhc2UgY29uZmlnICsgb3ZlcnJpZGUuXG4gICAqIFdpcmVzIG9uU2VhcmNoLCBvbkxvYWRNb3JlIHRvIGJvdGggb3ZlcnJpZGUgY2FsbGJhY2tzIGFuZCBvdXRwdXQgZXZlbnRzLlxuICAgKi9cbiAgZ2V0Q29uZmlnRm9yU2VsZWN0KGtleTogc3RyaW5nLCBiYXNlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltrZXldO1xuICAgIGlmICghb3ZlcnJpZGUpIHJldHVybiBiYXNlQ29uZmlnO1xuXG4gICAgY29uc3QgbWVyZ2VkOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgLi4ub3ZlcnJpZGUsXG4gICAgICBvcHRpb25zOiBvdmVycmlkZS5vcHRpb25zID8/IGJhc2VDb25maWcub3B0aW9ucyxcbiAgICAgIGtleTogYmFzZUNvbmZpZy5rZXksXG4gICAgfTtcblxuICAgIGlmIChvdmVycmlkZS5zZXJ2ZXJTZWFyY2ggfHwgb3ZlcnJpZGUub25TZWFyY2gpIHtcbiAgICAgIG1lcmdlZC5vblNlYXJjaCA9IChxdWVyeSkgPT4ge1xuICAgICAgICBvdmVycmlkZS5vblNlYXJjaD8uKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2guZW1pdCh7IGtleSwgcXVlcnkgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGUuaGFzTW9yZSB8fCBvdmVycmlkZS5vbkxvYWRNb3JlKSB7XG4gICAgICBtZXJnZWQub25Mb2FkTW9yZSA9IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gJyc7XG4gICAgICAgIG92ZXJyaWRlLm9uTG9hZE1vcmU/LihxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RPcGVuZWQuZW1pdCh7IGtleSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KGV2ZW50KTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bZXZlbnQua2V5XTtcbiAgICBvdmVycmlkZT8ub25TZWFyY2g/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdExvYWRNb3JlKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vbkxvYWRNb3JlPy4oZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGV2ZW50LnZhbHVlO1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbikgOiB2YWwgIT0gbnVsbCA/IFtTdHJpbmcodmFsKV0gOiBbXTtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvLyBNYXJrIFRlc3QgRGF0YSBzZWxlY3RzIGFzIGRpcnR5IHNvIGxhdGVyIGlucHV0IGNoYW5nZXMgKG9wdGlvbnMvY29uZmlnKSBkb24ndCBvdmVyd3JpdGUgdXNlciBjaG9pY2VcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVByb2ZpbGUgfHwgZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVNldCkge1xuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KGV2ZW50LmtleSk7XG4gICAgICBjdHJsPy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsga2V5OiBldmVudC5rZXksIHZhbHVlOiBldmVudC52YWx1ZSB9KTtcbiAgfVxuXG4gIG9uTGFiZWxzQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXYgfHwgdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHYpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgdl07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMubGFiZWxBZGRlZC5lbWl0KHYpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZSB8fFxuICAgICAgICBzLnRpdGxlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlY3Rpb25UaXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKFxuICAgICAgKGkpID0+XG4gICAgICAgIGkubGFiZWwgPT09IGl0ZW1MYWJlbCB8fFxuICAgICAgICBpLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgcmV0dXJuIChpdGVtPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIERldmljZSBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnRGV2aWNlJyBhbmQgJ0RldmljZSBTZXR0aW5nJyB0aXRsZXMgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VDb25maWdWYWx1ZShpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCBpdGVtTGFiZWwpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlIFNldHRpbmcnLCBpdGVtTGFiZWwpO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIFdhaXRzIHNlY3Rpb24gLSBzdXBwb3J0cyBib3RoICdXYWl0IGFuZCByZXRyaWVzJyBhbmQgJ1dhaXRzICYgUmV0cmllcycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0V2FpdHNSZXRyaWVzVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYxID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXQgYW5kIHJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGNvbnN0IHYyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsIGl0ZW1MYWJlbCk7XG4gICAgbGV0IHZhbCA9ICh2MSAhPT0gJycgJiYgdjEgIT0gbnVsbCkgPyB2MSA6IHYyO1xuXG4gICAgLy8gV2hlbiB2YWx1ZXMgYXJlIGNvbWluZyBmcm9tIG9yZ2FuaXphdGlvbiBzZXR0aW5ncywgdGhlIHBvcnRhbCB3cmFwcyB0aGVtIGFzXG4gICAgLy8gXCJPcmcgTGV2ZWwgKEFDVFVBTCBWQUxVRSlcIi4gRm9yIGVkaXQgaW5wdXRzIChSZXRyeSBGYWlsZWQgU3RlcHMsIFRlc3QgQ2FzZSBUaW1lb3V0LFxuICAgIC8vIFdhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMpLCB3ZSBvbmx5IHdhbnQgdG8gc2hvdyB0aGUgaW5uZXIgdmFsdWUsIG5vdCB0aGUgd3JhcHBlci5cbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJhdyA9IFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGxvd2VyID0gcmF3LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBwcmVmaXggPSAnb3JnIGxldmVsICgnO1xuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBvcGVuSWR4ID0gcmF3LmluZGV4T2YoJygnKTtcbiAgICAgICAgY29uc3QgY2xvc2VJZHggPSByYXcubGFzdEluZGV4T2YoJyknKTtcbiAgICAgICAgaWYgKG9wZW5JZHggPj0gMCAmJiBjbG9zZUlkeCA+IG9wZW5JZHgpIHtcbiAgICAgICAgICB2YWwgPSByYXcuc3Vic3RyaW5nKG9wZW5JZHggKyAxLCBjbG9zZUlkeCkudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IHJhdy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgJiYgU3RyaW5nKHZhbCkudHJpbSgpICE9PSAnJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICAvKiogU3RyaXAgdHJhaWxpbmcgJ3MnIGZyb20gdmFsdWUgKGUuZy4gXCIxMHNcIiAtPiBcIjEwXCIpIGZvciBkaXNwbGF5IGluIHRpbWVvdXQgaW5wdXRzICovXG4gIHByaXZhdGUgc3RyaXBUcmFpbGluZ1VuaXRTKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBzID0gU3RyaW5nKHZhbCkudHJpbSgpO1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1xccypzJC9pLCAnJyk7XG4gIH1cblxuICByZWFkb25seSB0ZXN0Q2FzZVRpbWVvdXRNb2RlT3B0aW9uczogRHJvcGRvd25PcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnT1JHIGxldmVsJywgdmFsdWU6ICdvcmcnIH0sXG4gICAgeyBsYWJlbDogJ0N1c3RvbScsIHZhbHVlOiAnY3VzdG9tJyB9LFxuICBdO1xuXG4gIC8qKiBWYWx1ZSBzaG93biBpbiB0aGUgZGlzYWJsZWQgKG9yZykgb3IgZW5hYmxlZCAoY3VzdG9tKSBUZXN0IENhc2UgVGltZW91dCBpbnB1dC4gKi9cbiAgZ2V0IHRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlc3RDYXNlVGltZW91dE1vZGUgPT09ICdvcmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmdMZXZlbFRlc3RDYXNlVGltZW91dCAhPSBudWxsID8gU3RyaW5nKHRoaXMub3JnTGV2ZWxUZXN0Q2FzZVRpbWVvdXQpIDogJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3RDYXNlVGltZW91dDtcbiAgfVxuXG4gIG9uVGVzdENhc2VUaW1lb3V0TW9kZUNoYW5nZShtb2RlOiAnb3JnJyB8ICdjdXN0b20nKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gbW9kZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHBvcnRhbCB3cmFwcGVkIHRoZSBUZXN0IENhc2UgVGltZW91dCB2YWx1ZSBhcyBcIk9yZyBMZXZlbCAoLi4uKVwiLCBtZWFuaW5nIHRoZSBUQyBBUEkgcmV0dXJuZWQgbnVsbC4gKi9cbiAgcHJpdmF0ZSBpc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0IGFuZCByZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpO1xuICAgIHJldHVybiByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChPUkdfTEVWRUxfU0VOVElORUwudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvKiogQWxsb3cgb25seSBkaWdpdHM7IHVzZWQgZm9yIFJldHJ5IEZhaWxlZCBTdGVwcywgVGVzdCBDYXNlIFRpbWVvdXQsIFdhaXQgVGltZW91dCBpbnB1dHMgKi9cbiAgb25seURpZ2l0cyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgfVxuXG4gIC8qKiBGb3IgdXBkYXRlOiB1c2UgXCIwXCIgd2hlbiB2YWx1ZSBpcyBlbXB0eSBzbyBBUEkgZ2V0cyBhIG51bWJlciAqL1xuICBwcml2YXRlIGVtcHR5TnVtVG9aZXJvKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgU3RyaW5nKHZhbCkudHJpbSgpID09PSAnJykgcmV0dXJuICcwJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB2YWwuaW5jbHVkZXMoJywnKSA/IHZhbC5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFt2YWxdO1xuICB9XG5cbiAgLyoqIEVkaXQgbW9kZSBzaG91bGQgc2hvdyBwbGFjZWhvbGRlciB3aGVuIGRhdGFzZXQgaXMgbm90IHNlbGVjdGVkLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ25vdCBzZXQnID8gJycgOiB2YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNQcmVyZXF1aXNpdGVDYXNlQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBbLi4udGhpcy5jb25maWdTZWN0aW9ucywgLi4udGhpcy5jb25maWdTZWN0aW9uc1JvdzJdLmZpbmQoXG4gICAgICAocykgPT4gcy50aXRsZSA9PT0gJ0V4ZWN1dGlvbidcbiAgICApO1xuICAgIHJldHVybiAhIXNlY3Rpb24/Lml0ZW1zPy5zb21lKChpKSA9PiBpLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQ7XG4gICAgdGhpcy5lZGl0U3RhdHVzID0gdGhpcy5zdGF0dXNJdGVtPy52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRSYXcgPSB0aGlzLm5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUoXG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodHlwZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndHlwZSddPy5vcHRpb25zKSA/PyB0eXBlUmF3O1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFQcm9maWxlUmF3O1xuICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICB0aGlzLmF1dG9XYWl0RW5hYmxlZCA9ICEhKGF1dG9XYWl0VmFsICYmIGF1dG9XYWl0VmFsLnRyaW0oKSAhPT0gJycgJiYgU3RyaW5nKGF1dG9XYWl0VmFsKSAhPT0gJ2ZhbHNlJyk7XG4gICAgdGhpcy5yZXRyeUZhaWxlZFN0ZXBzID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnUmV0cnkgRmFpbGVkIFN0ZXBzJyk7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXQgPSB0aGlzLnN0cmlwVHJhaWxpbmdVbml0Uyh0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSk7XG4gICAgdGhpcy53YWl0VGltZW91dExvY2F0b3JzID0gdGhpcy5zdHJpcFRyYWlsaW5nVW5pdFModGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjcyknKSk7XG4gICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgIHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdFeHRlbnNpb24gVXNlJyk7XG4gICAgdGhpcy5kYXRhRHJpdmVuRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdEYXRhIERyaXZlbicpO1xuICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgIGNvbnN0IGRlZmF1bHRBaUFjdGlvbiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyk7XG4gICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3O1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3KTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgZGVmYXVsdEJyb3dzZXIgPVxuICAgICAgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgPyB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IEJyb3dzZXInKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpXG4gICAgICAgIDogdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2aWRlb1JlY29yZGluZ1JhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IFZpZXdwb3J0JykgfHwgdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnVmlld3BvcnQnKSB8fCAnJztcbiAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nUmVzdG9yZU1vY2s7XG4gICAgdGhpcy5lZGl0QXBpTW9ja2luZ1N0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nU3RvcmVNb2NrO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyxcbiAgICAgIHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSxcbiAgICAgIHR5cGU6IHR5cGVWYWwgfHwgJycsXG4gICAgICBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFQcm9maWxlVmFsIHx8ICcnLFxuICAgICAgdGVzdERhdGFTZXQ6IHRlc3REYXRhU2V0VmFsID8/ICcnLFxuICAgICAgcHJlcmVxdWlzaXRlQ2FzZXMsXG4gICAgICBkZWZhdWx0QnJvd3NlcjogZGVmYXVsdEJyb3dzZXIgfHwgJ0Nocm9tZScsXG4gICAgICB2aWRlb1JlY29yZGluZzogdmlkZW9SZWNvcmRpbmcgfHwgJycsXG4gICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCB8fCAnJyxcbiAgICAgIGRldmljZVR5cGU6IGRldmljZVR5cGUgfHwgJycsXG4gICAgICBkZXZpY2VPUzogZGV2aWNlT1MgfHwgJycsXG4gICAgICBlbmFibGVBaVNtYXJ0bmVzczogZW5hYmxlQWlTbWFydG5lc3MgfHwgJ0FkdmFuY2VkJyxcbiAgICAgIGRlZmF1bHRBaUFjdGlvbjogZGVmYXVsdEFpQWN0aW9uIHx8ICdTbWFydCB3YWl0JyxcbiAgICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgfHwgJ25vbmUnLFxuICAgICAgdXNlQWlNZXRhZGF0YTogdXNlQWlNZXRhZGF0YSB8fCAnJyxcbiAgICB9KTtcbiAgICB0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5idWlsZFNhdmVQYXlsb2FkKCkpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGhhc1Vuc2F2ZWRDaGFuZ2VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRTYXZlUGF5bG9hZCgpKSAhPT0gdGhpcy5faW5pdGlhbEZvcm1TbmFwc2hvdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTYXZlUGF5bG9hZCgpOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKT8udmFsdWUgPz8gdGhpcy5lZGl0U3RhdHVzO1xuICAgIGNvbnN0IHByaW9yaXR5ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ByaW9yaXR5Jyk/LnZhbHVlID8/IHRoaXMuZWRpdFByaW9yaXR5O1xuICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zKCk7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpO1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHRoaXMuZWRpdERlc2NyaXB0aW9uLFxuICAgICAgc3RhdHVzLFxuICAgICAgcHJpb3JpdHksXG4gICAgICB0eXBlOiB0eXBlVmFsLFxuICAgICAgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlVmFsIHx8IG51bGwsXG4gICAgICB0ZXN0RGF0YVNldEluZGV4OiB0ZXN0RGF0YVNldFZhbCA/PyBudWxsLFxuICAgICAgY29uZmlnU2VjdGlvbnM6IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkLFxuICAgICAgY29uZmlnU2VjdGlvbnNSb3cyOiBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQsXG4gICAgICBhcGlNb2NraW5nUmVzdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayxcbiAgICAgIGFwaU1vY2tpbmdTdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGJvdW5kIHRvIHRoZSBlbWJlZGRlZCBgPGNxYS1hcGktbW9ja2luZy1jYXJkPmAgYHJlc3RvcmVNb2NrQ2hhbmdlYCBvdXRwdXQuXG4gICAqIEtlZXBzIHRoZSBsb2NhbCBlZGl0LW1vZGUgbWlycm9yIGluIHN5bmMgKGluY2x1ZGluZyB0aGUgbXV0dWFsLWV4Y2x1c2l2aXR5IHJ1bGUg4oCUXG4gICAqIHR1cm5pbmcgVXNlLW1vY2sgb24gZm9yY2VzIHN0b3JlLW1vY2sgb2ZmKSBhbmQgcmUtZW1pdHMgdG8gdGhlIHBhcmVudCBzbyB0aGUgc2F2ZVxuICAgKiBwYXlsb2FkIHJlZmxlY3RzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBvbkFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gICAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE1pcnJvciBoYW5kbGVyIGZvciB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggVXNlLW1vY2suICovXG4gIG9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2sgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5lZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVUb09wdGlvblZhbHVlKFxuICAgIGNvbmZpZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29uZmlnVmFsdWUgPT0gbnVsbCB8fCBjb25maWdWYWx1ZSA9PT0gJycpIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyA/PyBbXTtcbiAgICBpZiAoIW9wdHMubGVuZ3RoKSByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIGNvbmZpZ1ZhbHVlID09PSAnbnVtYmVyJyA/IGNvbmZpZ1ZhbHVlIDogTnVtYmVyKGNvbmZpZ1ZhbHVlKTtcbiAgICBjb25zdCBpc051bWVyaWMgPSAhTnVtYmVyLmlzTmFOKG51bSkgJiYgU3RyaW5nKGNvbmZpZ1ZhbHVlKS50cmltKCkgPT09IFN0cmluZyhudW0pO1xuICAgIGlmIChpc051bWVyaWMpIHtcbiAgICAgIC8vIElmIG9wdGlvbnMgdXNlIG51bWVyaWMgdmFsdWVzIChlLmcuIGluZGljZXMgZm9yIFRlc3QgRGF0YSBTZXQpLFxuICAgICAgLy8gcmV0dXJuIHRoZSBudW1lcmljIGZvcm0gc28gdGhlIHNlbGVjdCBjYW4gbWF0Y2ggYnkgc3RyaWN0IGVxdWFsaXR5LlxuICAgICAgY29uc3QgaGFzTnVtZXJpY09wdGlvbiA9IG9wdHMuc29tZShcbiAgICAgICAgKG8pID0+IHR5cGVvZiBvLnZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgKG8gYXMgYW55KS5pZCA9PT0gJ251bWJlcidcbiAgICAgICk7XG4gICAgICByZXR1cm4gaGFzTnVtZXJpY09wdGlvbiA/IG51bSA6IGNvbmZpZ1ZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSBTdHJpbmcoY29uZmlnVmFsdWUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG1hdGNoID0gb3B0cy5maW5kKChvKSA9PiB7XG4gICAgICBjb25zdCBuID0gU3RyaW5nKG8ubmFtZSA/PyBvLmxhYmVsID8/IG8udmFsdWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIG4gPT09IHN0cjtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2ggIT0gbnVsbCA/IChtYXRjaC52YWx1ZSA/PyAobWF0Y2ggYXMgYW55KS5pZCA/PyBtYXRjaCkgOiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZhbDogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09ICd0cnVlJykgcmV0dXJuICd0cnVlJztcbiAgICBpZiAodmFsID09PSBmYWxzZSB8fCB2YWwgPT09ICdmYWxzZScpIHJldHVybiAnZmFsc2UnO1xuICAgIGlmIChcbiAgICAgIHZhbCA9PT0gJ09yZyBsZXZlbCcgfHxcbiAgICAgIHZhbCA9PT0gJ09yZyBMZXZlbCcgfHxcbiAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb3JnIGxldmVsICgnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiAnT3JnIGxldmVsJztcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gJ09uIFdhaXQnIHx8IHZhbCA9PT0gJ29uIHdhaXQnKSByZXR1cm4gJ3RydWUnO1xuICAgIHJldHVybiB2YWwgJiYgU3RyaW5nKHZhbCkudHJpbSgpID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSkge1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdENvbmZpZ092ZXJyaWRlcyddICYmIHRoaXMuZWRpdEZvcm0/LmdldCgndHlwZScpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3R5cGUnKTtcbiAgICAgICAgY29uc3QgdGRwQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgICAgY29uc3QgdGRzQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpO1xuICAgICAgICBjb25zdCBlbmFibGVBaUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5hYmxlQWlTbWFydG5lc3MnKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QWlBY3Rpb24nKTtcbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICAgICAgICBpZiAodHlwZUN0cmwgJiYgIXR5cGVDdHJsLmRpcnR5KSB7XG4gICAgICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICAgICAgcGF0Y2hbJ3R5cGUnXSA9ICh0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0LCBhbGxvdyBvbmUtdGltZSByZS1yZXNvbHZlIGZyb20gY29uZmlnIHdoZW4gb3B0aW9ucyBhcnJpdmUsXG4gICAgICAgIC8vIGJ1dCBuZXZlciBvdmVyd3JpdGUgYSB1c2VyLWVkaXRlZCAoZGlydHkpIHZhbHVlLlxuICAgICAgICBpZiAodGRwQ3RybCAmJiAhdGRwQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPVxuICAgICAgICAgICAgKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz9cbiAgICAgICAgICAgICAgdGVzdERhdGFQcm9maWxlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGRzQ3RybCAmJiAhdGRzQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoWyd0ZXN0RGF0YVNldCddID1cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICB0ZXN0RGF0YVNldFJhdyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZS1yZXNvbHZlIEFJIGZpZWxkcyB3aGVuIHRoZWlyIG9wdGlvbnMgYXJyaXZlICh0aGV5IHVzZSBkaXNwbGF5IG5hbWVzIGFzIHZhbHVlcykuXG4gICAgICAgIGlmIChlbmFibGVBaUN0cmwgJiYgIWVuYWJsZUFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGFpU21hcnRuZXNzUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgICAgIGlmIChhaVNtYXJ0bmVzc1JhdykgcGF0Y2hbJ2VuYWJsZUFpU21hcnRuZXNzJ10gPSBhaVNtYXJ0bmVzc1JhdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdEFpQ3RybCAmJiAhZGVmYXVsdEFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBaVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRBaVJhdykgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpUmF3O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtiQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyk7XG4gICAgICAgIGlmIChrYkN0cmwgJiYgIWtiQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGtiUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICAgICAgICBjb25zdCBrYlJlc29sdmVkID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrYlJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrYlJhdztcbiAgICAgICAgICBpZiAoa2JSZXNvbHZlZCkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtiUmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zJ10gfHwgY2hhbmdlc1snY29uZmlnU2VjdGlvbnNSb3cyJ10pIHtcbiAgICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3O1xuICAgICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVNldFJhdyA9IHRoaXMubm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZShcbiAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICk7XG4gICAgICBjb25zdCB0eXBlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0eXBlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0eXBlJ10/Lm9wdGlvbnMpID8/IHR5cGVSYXc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpKTtcbiAgICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoWydlbmFibGVBaVNtYXJ0bmVzcyddID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaFsnZGVmYXVsdEFpQWN0aW9uJ10gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2hbJ3VzZUFpTWV0YWRhdGEnXSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaFsncHJlcmVxdWlzaXRlQ2FzZXMnXSA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKHR5cGVWYWwpIHBhdGNoWyd0eXBlJ10gPSB0eXBlVmFsO1xuXG4gICAgICAvLyBSZS1zeW5jIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0IGZyb20gY29uZmlnIG9ubHkgd2hlbiBjb250cm9scyBhcmUgTk9UIGRpcnR5XG4gICAgICBjb25zdCB0ZHBDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgIGNvbnN0IHRkc0N0cmwyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkcDIgPSB0ZHBDdHJsMj8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkczIgPSB0ZHNDdHJsMj8uZGlydHk7XG5cbiAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWwgJiYgIXByZXNlcnZlVGRwMikgcGF0Y2hbJ3Rlc3REYXRhUHJvZmlsZSddID0gdGVzdERhdGFQcm9maWxlVmFsO1xuICAgICAgaWYgKHRlc3REYXRhU2V0VmFsICE9IG51bGwgJiYgdGVzdERhdGFTZXRWYWwgIT09ICcnICYmICFwcmVzZXJ2ZVRkczIpIHBhdGNoWyd0ZXN0RGF0YVNldCddID0gdGVzdERhdGFTZXRWYWw7XG4gICAgICBpZiAoZGVmYXVsdEJyb3dzZXIpIHBhdGNoWydkZWZhdWx0QnJvd3NlciddID0gZGVmYXVsdEJyb3dzZXI7XG4gICAgICBpZiAodmlkZW9SZWNvcmRpbmcpIHBhdGNoWyd2aWRlb1JlY29yZGluZyddID0gdmlkZW9SZWNvcmRpbmc7XG4gICAgICBpZiAoZGVmYXVsdFZpZXdwb3J0KSBwYXRjaFsnZGVmYXVsdFZpZXdwb3J0J10gPSBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgICBpZiAoZGV2aWNlVHlwZSkgcGF0Y2hbJ2RldmljZVR5cGUnXSA9IGRldmljZVR5cGU7XG4gICAgICBpZiAoZGV2aWNlT1MpIHBhdGNoWydkZXZpY2VPUyddID0gZGV2aWNlT1M7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHBhdGNoKTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUxhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSB0aGlzLmVkaXRMYWJlbHMuZmlsdGVyKChsKSA9PiBsICE9PSBsYWJlbCk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DbGVhckFsbExhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbXTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRMYWJlbHMuaW5jbHVkZXMobGFiZWwpKSB7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCBsYWJlbF07XG4gICAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmUuZW1pdCh0aGlzLmJ1aWxkU2F2ZVBheWxvYWQoKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnMoKTogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHRoaXMucGxhdGZvcm07XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmdWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2aWRlb1JlY29yZGluZycpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHZpZGVvUmVjb3JkaW5nVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB2aWRlb1JlY29yZGluZ1ZhbHVlO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd1c2VBaU1ldGFkYXRhJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHVzZUFpTWV0YWRhdGFWYWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlc1JhdyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmVyZXF1aXNpdGVDYXNlcycpPy52YWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IEFycmF5LmlzQXJyYXkocHJlcmVxdWlzaXRlQ2FzZXNSYXcpXG4gICAgICA/IHByZXJlcXVpc2l0ZUNhc2VzUmF3Lm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgIDogcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT0gbnVsbCAmJiBwcmVyZXF1aXNpdGVDYXNlc1JhdyAhPT0gJydcbiAgICAgICAgPyBbU3RyaW5nKHByZXJlcXVpc2l0ZUNhc2VzUmF3KV1cbiAgICAgICAgOiBbXTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgPSBwcmVyZXF1aXNpdGVDYXNlcy5sZW5ndGggPyBwcmVyZXF1aXNpdGVDYXNlcy5qb2luKCcsJykgOiBudWxsO1xuICAgIGNvbnN0IHR5cGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1NlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdFeGVjdXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtc1xuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEocGxhdGZvcm0gPT09ICd3ZWInICYmIGl0ZW0ubGFiZWwgPT09ICdEZWZhdWx0IEJyb3dzZXInKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1ZpZGVvIFJlY29yZGluZycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB2aWRlb1JlY29yZGluZyB9O1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdQcmVyZXF1aXNpdGUgQ2FzZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVHlwZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0eXBlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFByb2ZpbGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFQcm9maWxlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFNldCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0ZXN0RGF0YVNldFZhbHVlIH07XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnQUkgQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmFibGVBaVNtYXJ0bmVzcycpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdEFpQWN0aW9uJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBrbm93bGVkZ2VCYXNlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdXNlQWlNZXRhZGF0YSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIFNtYXJ0bmVzcycgJiYgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSAhPSBudWxsICYmIGVuYWJsZUFpU21hcnRuZXNzVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBBSSBBY3Rpb24nICYmIGRlZmF1bHRBaUFjdGlvblZhbHVlICE9IG51bGwgJiYgZGVmYXVsdEFpQWN0aW9uVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZGVmYXVsdEFpQWN0aW9uVmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT0gbnVsbCAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZToga25vd2xlZGdlQmFzZVZhbHVlIH07XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5zZWN0aW9uLCBpdGVtcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RlZmF1bHRCcm93c2VyJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0Vmlld3BvcnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VUeXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RldmljZU9TJyk/LnZhbHVlID8/ICcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuY29uZmlnU2VjdGlvbnNSb3cyLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdXYWl0cyAmIFJldHJpZXMnIHx8IHNlY3Rpb24udGl0bGUgPT09ICdXYWl0IGFuZCByZXRyaWVzJykge1xuICAgICAgICBjb25zdCBhdXRvV2FpdFZhbHVlID0gdGhpcy5hdXRvV2FpdEVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnQXV0byBXYWl0JykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IGF1dG9XYWl0VmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuYXV0b1dhaXRFbmFibGVkIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdSZXRyeSBGYWlsZWQgU3RlcHMnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGhpcy5lbXB0eU51bVRvWmVybyh0aGlzLnJldHJ5RmFpbGVkU3RlcHMpIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gKHRoaXMudGVzdENhc2VUaW1lb3V0ID8/ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID09PSAnb3JnJyB8fCB0cmltbWVkID09PSAnJyA/IE9SR19MRVZFTF9TRU5USU5FTCA6IHRyaW1tZWQ7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy53YWl0VGltZW91dExvY2F0b3JzKSB9O1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlIFNldHRpbmcnKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2UgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0RldmljZScgfHwgcy50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJyk7XG4gICAgaWYgKCFleGlzdGluZ0RldmljZSkge1xuICAgICAgY29uc3QgZGV2aWNlU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgICAgdGl0bGU6ICdEZXZpY2UnLFxuICAgICAgICBpY29uOiAnZGV2aWNlcycsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgLi4uKHBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsIHZhbHVlOiBkZWZhdWx0QnJvd3NlciB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JywgdmFsdWU6IGRlZmF1bHRWaWV3cG9ydCB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHZhbHVlOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ09TJywgdmFsdWU6IGRldmljZU9TIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGRldmljZVNlY3Rpb25dO1xuICAgIH1cblxuICAgIGNvbnN0IGtleUZsYWdzU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnS2V5IEZsYWdzJyxcbiAgICAgIGljb246ICdmbGFnJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUgVGVzdGluZycsIHZhbHVlOiB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4dGVuc2lvbiBVc2UnLCB2YWx1ZTogdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgRHJpdmVuJywgdmFsdWU6IHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5RmxhZ3MgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0tleSBGbGFncycpO1xuICAgIGlmIChleGlzdGluZ0tleUZsYWdzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChzKSA9PlxuICAgICAgICBzLnRpdGxlID09PSAnS2V5IEZsYWdzJyA/IGtleUZsYWdzU2VjdGlvbiA6IHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGtleUZsYWdzU2VjdGlvbl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICB0cmFja0J5TGFiZWwoX2k6IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgdHJhY2tCeUNvbmZpZ1RpdGxlKF9pOiBudW1iZXIsIHNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWN0aW9uLnRpdGxlO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgbGFiZWxzIHVzZSBjb25zaXN0ZW50IGluZGlnbyBzdHlsZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX0NISVBfU1RZTEUgPSB7XG4gICAgYmc6ICcjNjM2NkYxJyxcbiAgICBib3JkZXI6ICcjNjM2NkYxJyxcbiAgICB0ZXh0OiAnI0ZGRkZGRicsXG4gICAgaWNvbjogJyNGRkZGRkYnLFxuICB9O1xuXG4gIGdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShfbGFiZWw6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuTEFCRUxfQ0hJUF9TVFlMRTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBjb2xvcnMuYmcsXG4gICAgICAnYm9yZGVyLWNvbG9yJzogY29sb3JzLmJvcmRlcixcbiAgICAgICdib3JkZXItd2lkdGgnOiAnMXB4JyxcbiAgICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICAgY29sb3I6IGNvbG9ycy50ZXh0LFxuICAgIH07XG4gIH1cblxuICBnZXRMYWJlbENsb3NlSWNvbkNvbG9yKF9sYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5MQUJFTF9DSElQX1NUWUxFLmljb247XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtcHktNFwiPlxuICA8IS0tIEJhc2ljIGRldGFpbHM6IERlc2NyaXB0aW9uLCBTdGF0dXMvUHJpb3JpdHkvVHlwZSwgTGFiZWxzIChsaWdodCBiYWNrZ3JvdW5kIGNvbnRhaW5lcikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOEY5RkVdIGNxYS1wLTRcIj5cbiAgPCEtLSBEZXNjcmlwdGlvbiAoRmlnbWE6IGRvY3VtZW50IGljb24sIHRleHRhcmVhIHdpdGggbGlnaHQgcHVycGxlIGJnKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgZGVzY3JpcHRpb25UaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZWRpdERlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbcm93c109XCI0XCJcbiAgICAgIFtlbmFibGVNYXJrZG93bl09XCJlbmFibGVNYXJrZG93blwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGRlc2NyaXB0aW9uLi4uXCJcbiAgICAgIHRleHRhcmVhSW5saW5lU3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxMDAlXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGF0dXMsIFByaW9yaXR5ICYgVHlwZSAoRmlnbWE6IHNpZGUtYnktc2lkZSBkcm9wZG93bnMsIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnc3RhdHVzJywgc3RhdHVzU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3N0YXR1cycpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5Qcmlvcml0eTwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdwcmlvcml0eScsIHByaW9yaXR5U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByaW9yaXR5JylcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1N0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndHlwZScsIHR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndHlwZScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExhYmVscyAoRmlnbWE6IEN1cnJlbnQgTGFiZWxzIHdpdGggQ2xlYXIgQWxsLCBjcWEtYmFkZ2Ugd2l0aCB4LCBGcmVxdWVudGx5IHVzZWQsIFNlYXJjaCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTVweF0gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+Q3VycmVudCBMYWJlbHMgKHt7IGVkaXRMYWJlbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI0RDMjYyNl0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbExhYmVscygpXCI+XG4gICAgICAgIENsZWFyIEFsbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCIgKm5nSWY9XCJlZGl0TGFiZWxzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGVkaXRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShsYWJlbClcIj5cbiAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTMuNSBjcWEtaC0zLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0TGFiZWxDbG9zZUljb25Db2xvcihsYWJlbClcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUxhYmVsKGxhYmVsKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBsYWJlbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy0zLjUgY3FhLWgtMy41XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5GcmVxdWVudGx5IHVzZWQ8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBmcmVxdWVudGx5VXNlZExhYmVsczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbClcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFOEU5RkZcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzNGNDNFRVwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFOEU5RkZcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+QWRkIGxhYmVsczwvbGFiZWw+XG4gICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJsYWJlbHNTZWxlY3RDb25maWdcIlxuICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnbGFiZWxzJylcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDwhLS0gQ29uZmlndXJhdGlvbiAoRmlnbWE6IGNvbGxhcHNpYmxlLCBnZWFyIGljb24sIGxpZ2h0IGJhY2tncm91bmQgY29udGFpbmVyKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLWJnLVsjRjhGOUZFXSBjcWEtcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LWxlZnQgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS41cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTUgY3FhLXRleHQteHNcIj5cbiAgICAgIDwhLS0gRXhlY3V0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0aW9uRXhwYW5kZWQgPSAhZXhlY3V0aW9uRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+cGxheV9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4ZWN1dGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBleGVjdXRpb25FeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleGVjdXRpb25FeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj4gXG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFQcm9maWxlJywgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhUHJvZmlsZScpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2ODczODldIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBTZXQ8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3Rlc3REYXRhU2V0JywgdGVzdERhdGFTZXRTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFTZXQnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5WaWRlbyBSZWNvcmRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ZpZGVvUmVjb3JkaW5nJywgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndmlkZW9SZWNvcmRpbmcnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBSSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+QUkgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBhaUNvbmZpZ0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFpQ29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEFpQWN0aW9uJywgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRBaUFjdGlvbicpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJywga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIndhaXRzUmV0cmllc0V4cGFuZGVkID0gIXdhaXRzUmV0cmllc0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5XYWl0IGFuZCBSZXRyaWVzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IHdhaXRzUmV0cmllc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndhaXRzUmV0cmllc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImF1dG9XYWl0RW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImF1dG9XYWl0RW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmV0cnkgRmFpbGVkIFN0ZXBzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJldHJ5RmFpbGVkU3RlcHNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicmV0cnlGYWlsZWRTdGVwcyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQteHMgY3FhLW1iLTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICBUZXN0IENhc2UgVGltZW91dCAobWludXRlcylcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1kcm9wZG93bi1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInRlc3RDYXNlVGltZW91dE1vZGVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInRlc3RDYXNlVGltZW91dE1vZGVcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblRlc3RDYXNlVGltZW91dE1vZGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdENhc2VUaW1lb3V0TW9kZSA9PT0gJ29yZydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlc3RDYXNlVGltZW91dCA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMwXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWMpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhaXRUaW1lb3V0TG9jYXRvcnNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwid2FpdFRpbWVvdXRMb2NhdG9ycyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicGxhdGZvcm0gIT09ICdtb2JpbGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkRldmljZSBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBkZXZpY2VFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkZXZpY2VFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSBXZWIgb25seTogbW9iaWxlIERldmljZSBTZXR0aW5ncyBoaWRkZW4gdGVtcG9yYXJpbHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEJyb3dzZXInLCBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0QnJvd3NlcicpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdFZpZXdwb3J0JywgZGVmYXVsdFZpZXdwb3J0U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRWaWV3cG9ydCcpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEtleSBGbGFncyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImtleUZsYWdzRXhwYW5kZWQgPSAha2V5RmxhZ3NFeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5mbGFnPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5LZXkgRmxhZ3M8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sga2V5RmxhZ3NFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJrZXlGbGFnc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJtb2JpbGVUZXN0aW5nRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiTW9iaWxlIFRlc3RpbmdcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+TW9iaWxlIFRlc3Rpbmc8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJleHRlbnNpb25Vc2VFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkV4dGVuc2lvbiBVc2VcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RXh0ZW5zaW9uIFVzZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImRhdGFEcml2ZW5FbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZGF0YURyaXZlbkVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJEYXRhIERyaXZlblwiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5EYXRhIERyaXZlbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgXG4gICAgICA8IS0tIEFQSSBNb2NraW5nIENhcmQgKGVkaXQgbW9kZTogbXV0dWFsbHktZXhjbHVzaXZlIHRvZ2dsZXMgZHJpdmVuIGJ5IG9uZSBib29sZWFuKSAtLT5cbiAgICAgIDxjcWEtYXBpLW1vY2tpbmctY2FyZFxuICAgICAgICAqbmdJZj1cInNob3dBcGlNb2NraW5nQ2FyZFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgW3RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gICAgICAgIFtzdGF0dXNMYWJlbF09XCJhcGlNb2NraW5nU3RhdHVzTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUxhYmVsXT1cImFwaU1vY2tpbmdDYXB0dXJlTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgICAgICAgW3JlbmV3TGFiZWxdPVwiYXBpTW9ja2luZ1JlbmV3TGFiZWxcIlxuICAgICAgICBbcmVuZXdIaW50XT1cImFwaU1vY2tpbmdSZW5ld0hpbnRcIlxuICAgICAgICBbcmVzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gICAgICAgIFtzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2tcIlxuICAgICAgICBbbW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICAgICAgICBbdG90YWxBcGlzQ291bnRdPVwiYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XCJcbiAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJhcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XCJcbiAgICAgICAgW3Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgICAgICAgW3N1bW1hcnlUZXh0XT1cImFwaU1vY2tpbmdTdW1tYXJ5VGV4dFwiXG4gICAgICAgIFtwZXJjZW50VGV4dF09XCJhcGlNb2NraW5nUGVyY2VudFRleHRcIlxuICAgICAgICBbZWRpdGluZ109XCJ0cnVlXCJcbiAgICAgICAgKHJlc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmZpZ3VyZSk9XCJjb25maWd1cmVBcGlNb2NraW5nLmVtaXQoKVwiPlxuICAgICAgPC9jcWEtYXBpLW1vY2tpbmctY2FyZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFpc1NhdmluZ1wiXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVW5zYXZlZENoYW5nZXNcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICBsYWJlbD1cIlNhdmluZ+KAplwiXG4gICAgICAgICAgaWNvbj1cImF1dG9yZW5ld1wiXG4gICAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
1145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7QUFXeEQsbUhBQW1IO0FBQ25ILE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBNkJ2QyxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsV0FBVyxFQUFFLGFBQWE7SUFDMUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBbUJYLE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsTUFBTTtJQUNOLFVBQVU7SUFDVixJQUFJO0lBQ0osUUFBUTtJQUNSLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0lBQ2IsT0FBTztDQUNSLENBQUM7QUFPRixNQUFNLE9BQU8sNEJBQTRCO0lBZ0Z2QyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQS9FakMscUJBQWdCLEdBQUcsYUFBYSxDQUFDO1FBQ2pDLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUNqQyx1R0FBdUc7UUFDOUYsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBQ2xELFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxlQUFlLENBQUM7UUFDOUIsbUJBQWMsR0FBbUMsRUFBRSxDQUFDO1FBQ3BELHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFDeEQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQiwwSEFBMEg7UUFDakgsNEJBQXVCLEdBQXNDLEVBQUUsQ0FBQztRQUN6RSw0R0FBNEc7UUFDbkcsYUFBUSxHQUFxQixLQUFLLENBQUM7UUFFNUMsbUhBQW1IO1FBQzFHLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRTdCOzs7Ozs7V0FNRztRQUNNLDBCQUFxQixHQUEwQixFQUFFLENBQUM7UUFFM0QsNkVBQTZFO1FBQ3BFLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixvQkFBZSxHQUFHLGFBQWEsQ0FBQztRQUNoQywwQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QywyQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztRQUNsRCwwQkFBcUIsR0FBRyxxRUFBcUUsQ0FBQztRQUM5Rix5QkFBb0IsR0FBRywrQkFBK0IsQ0FBQztRQUN2RCx3QkFBbUIsR0FBRyw4REFBOEQsQ0FBQztRQUM5Rjs7OztXQUlHO1FBQ00sMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLG1HQUFtRztRQUMxRix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsOEJBQXlCLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLDZCQUF3QixHQUFHLENBQUMsQ0FBQztRQUM3Qiw4QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFDdkM7eUZBQ2lGO1FBQ3hFLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQU85QixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFDdkQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFNUMseUhBQXlIO1FBQy9HLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFFNUUscUdBQXFHO1FBQzNGLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFFOUUsOEdBQThHO1FBQ3BHLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFN0Qsb0RBQW9EO1FBQzFDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQW1DLENBQUM7UUFFaEYsc0VBQXNFO1FBQzVELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2xELHVFQUF1RTtRQUM3RCxnQ0FBMkIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BFLDhFQUE4RTtRQUNwRSw4QkFBeUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ2xFLDRGQUE0RjtRQUNsRix3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBSXpELGlCQUFpQjtRQUNqQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsaUdBQWlHO1FBQ2pHLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLCtIQUErSDtRQUMvSCx3QkFBbUIsR0FBcUIsS0FBSyxDQUFDO1FBQzlDLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4Qix5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHlCQUFvQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLHlCQUFvQixHQUFrQixJQUFJLENBQUM7UUFFbkQsZ0RBQWdEO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUN2QixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBYyxDQUFDO1lBQ3ZDLGlCQUFpQixFQUFFLElBQUksV0FBVyxDQUFDLEVBQWMsQ0FBQztZQUNsRCxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ25DLGNBQWMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsZUFBZSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsaUJBQWlCLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3RDLGVBQWUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsNEJBQTRCLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2pELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBc0JILDhGQUE4RjtRQUNyRix1QkFBa0IsR0FBNkI7WUFDdEQsR0FBRyxFQUFFLFFBQVE7WUFDYixLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDakMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3pDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUN2QyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3ZDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQ3RDO1NBQ0YsQ0FBQztRQUVPLHFCQUFnQixHQUE2QjtZQUNwRCxHQUFHLEVBQUUsTUFBTTtZQUNYLEtBQUssRUFBRSxFQUFFO1lBQ1QsV0FBVyxFQUFFLE1BQU07WUFDbkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRU8sNEJBQXVCLEdBQTZCO1lBQzNELEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxFQUFFO1lBQ1QsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxVQUFVLEVBQUUsSUFBSTtZQUNoQixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFFTyxnQ0FBMkIsR0FBNkI7WUFDL0QsR0FBRyxFQUFFLGlCQUFpQjtZQUN0QixLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxtQkFBbUI7WUFDaEMsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRU8sNEJBQXVCLEdBQTZCO1lBQzNELEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxFQUFFO1lBQ1QsV0FBVyxFQUFFLGVBQWU7WUFDNUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRWUsbUNBQThCLEdBQUc7WUFDaEQsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUMvQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ3RELEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDbkQsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUNuRCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFO1NBQ3RELENBQUM7UUFFTywrQkFBMEIsR0FBNkI7WUFDOUQsR0FBRyxFQUFFLGdCQUFnQjtZQUNyQixLQUFLLEVBQUUsNkJBQTZCO1lBQ3BDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtnQkFDL0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQ2pDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2FBQzFDO1NBQ0YsQ0FBQztRQUVPLHFDQUFnQyxHQUE2QjtZQUNwRSxHQUFHLEVBQUUsZUFBZTtZQUNwQixLQUFLLEVBQUUsK0JBQStCO1lBQ3RDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtnQkFDL0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQ2pDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2FBQzFDO1NBQ0YsQ0FBQztRQUVGLDZFQUE2RTtRQUNyRSw2QkFBd0IsR0FBb0MsSUFBSSxDQUFDO1FBQ2pFLDZCQUF3QixHQUFHLElBQUksQ0FBQztRQThCeEMsaUNBQTRCLEdBQTZCO1lBQ3ZELEdBQUcsRUFBRSxtQkFBbUI7WUFDeEIsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixXQUFXLEVBQUUsUUFBUTtZQUNyQixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2dCQUMvQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFO2dCQUN0RCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFO2dCQUNuRCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFO2dCQUNuRCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFO2FBQ3REO1NBQ0YsQ0FBQztRQUVPLGdDQUEyQixHQUE2QjtZQUMvRCxHQUFHLEVBQUUsaUJBQWlCO1lBQ3RCLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsV0FBVyxFQUFFLFFBQVE7WUFDckIsVUFBVSxFQUFFLEtBQUs7WUFDakIsT0FBTyxFQUFFO2dCQUNQLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2FBQ3hDO1NBQ0YsQ0FBQztRQUVPLDJCQUFzQixHQUE2QjtZQUMxRCxHQUFHLEVBQUUsWUFBWTtZQUNqQixLQUFLLEVBQUUsYUFBYTtZQUNwQixXQUFXLEVBQUUsUUFBUTtZQUNyQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3pDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUN6QyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDekMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3pDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDbkQsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7YUFDbEM7U0FDRixDQUFDO1FBRU8seUJBQW9CLEdBQTZCO1lBQ3hELEdBQUcsRUFBRSxVQUFVO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsUUFBUTtZQUNyQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ25DLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFO2dCQUN2QyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDbkMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ25DLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUMzQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTthQUM1QztTQUNGLENBQUM7UUFFTywrQkFBMEIsR0FBNkI7WUFDOUQsR0FBRyxFQUFFLGdCQUFnQjtZQUNyQixLQUFLLEVBQUUsaUJBQWlCO1lBQ3hCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDbkMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQ3JDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUNuQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTthQUNoQztTQUNGLENBQUM7UUFFTyx5QkFBb0IsR0FBNkI7WUFDeEQsR0FBRyxFQUFFLFVBQVU7WUFDZixLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDdkMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQ2pDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2dCQUMvQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDbkMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7Z0JBQzdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO2dCQUNqQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTthQUN0QztTQUNGLENBQUM7UUFFTyxrQ0FBNkIsR0FBNkI7WUFDakUsR0FBRyxFQUFFLG1CQUFtQjtZQUN4QixLQUFLLEVBQUUscUJBQXFCO1lBQzVCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDakMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3ZDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO2FBQzlCO1NBQ0YsQ0FBQztRQUVPLGdDQUEyQixHQUE2QjtZQUMvRCxHQUFHLEVBQUUsaUJBQWlCO1lBQ3RCLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsV0FBVyxFQUFFLFlBQVk7WUFDekIsVUFBVSxFQUFFLEtBQUs7WUFDakIsT0FBTyxFQUFFO2dCQUNQLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUMzQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDM0MsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO2dCQUN2RCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDakMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7YUFDaEM7U0FDRixDQUFDO1FBRU8sNkNBQXdDLEdBQTZCO1lBQzVFLEdBQUcsRUFBRSw4QkFBOEI7WUFDbkMsS0FBSyxFQUFFLGtDQUFrQztZQUN6QyxXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7YUFDaEM7U0FDRixDQUFDO1FBNklPLCtCQUEwQixHQUFxQjtZQUN0RCxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtZQUNwQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtTQUNyQyxDQUFDO1FBa2hCRixpREFBaUQ7UUFDaEMscUJBQWdCLEdBQUc7WUFDbEMsRUFBRSxFQUFFLFNBQVM7WUFDYixNQUFNLEVBQUUsU0FBUztZQUNqQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUM7SUF4OUIyQyxDQUFDO0lBbUQ5QyxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBc0ZELHdHQUF3RztJQUN4RyxJQUFJLGtCQUFrQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUMxRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEYsTUFBTSxVQUFVLEdBQUcsUUFBUSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQVM7WUFDaEMsR0FBRyxJQUFJLENBQUMsb0JBQW9CO1lBQzVCLEdBQUcsSUFBSSxDQUFDLFVBQVU7WUFDbEIsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUNqRixDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHO1lBQzlCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsS0FBSyxFQUFFLEVBQUU7WUFDVCxXQUFXLEVBQUUsNkJBQTZCO1lBQzFDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLFVBQVU7WUFDdkIsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixPQUFPO1NBQ1IsQ0FBQztRQUNGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQTZIRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsVUFBb0M7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUVqQyxNQUFNLE1BQU0sR0FBNkI7WUFDdkMsR0FBRyxVQUFVO1lBQ2IsR0FBRyxRQUFRO1lBQ1gsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU87WUFDL0MsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1NBQ3BCLENBQUM7UUFFRixJQUFJLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUM5QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUM7U0FDSDtRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUM7U0FDSDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBVztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFxQztRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBcUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQXNDO1FBQ3RELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BILElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtRQUNELHNGQUFzRjtRQUN0RixrRkFBa0Y7UUFDbEYsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLDZCQUE2QixDQUFDLFdBQVcsRUFBRTtZQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3RSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUN4QjtRQUNELHNHQUFzRztRQUN0RyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssNkJBQTZCLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssNkJBQTZCLENBQUMsV0FBVyxFQUFFO1lBQzFILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBcUM7UUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxZQUFvQixFQUFFLFNBQWlCO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUN2RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLEtBQUssS0FBSyxZQUFZO1lBQ3hCLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUM5RCxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFDckIsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQzNELENBQUM7UUFDRixPQUFRLElBQUksRUFBRSxLQUFnQixJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQseUZBQXlGO0lBQ2pGLG9CQUFvQixDQUFDLFNBQWlCO1FBQzVDLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQzVDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RCxPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBRUQsbUdBQW1HO0lBQzNGLG9CQUFvQixDQUFDLFNBQWlCO1FBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFOUMsOEVBQThFO1FBQzlFLHNGQUFzRjtRQUN0RixxRkFBcUY7UUFDckYsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM1QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksUUFBUSxHQUFHLE9BQU8sRUFBRTtvQkFDdEMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDbkQ7cUJBQU07b0JBQ0wsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUMzQzthQUNGO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLGtCQUFrQixDQUFDLEdBQVc7UUFDcEMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQU9ELHFGQUFxRjtJQUNyRixJQUFJLDJCQUEyQjtRQUM3QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RjtRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsMkJBQTJCLENBQUMsSUFBc0I7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCx1SEFBdUg7SUFDL0csd0JBQXdCO1FBQzlCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSw2QkFBNkIsQ0FBQztZQUMxRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUM1RSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELG1FQUFtRTtJQUMzRCxjQUFjLENBQUMsR0FBVztRQUNoQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUN6RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsc0VBQXNFO0lBQzlELDRCQUE0QixDQUFDLEtBQWE7UUFDaEQsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDM0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQ3ZFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FDL0IsQ0FBQztRQUNGLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pHLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxDQUM1RCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUM7UUFDN0csTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxjQUFjLENBQUM7UUFDekksTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxrQkFBa0IsQ0FBQztRQUN6SixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLGNBQWMsQ0FBQztRQUN6SSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtDQUFrQyxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzlFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDekcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM3RixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN6RixNQUFNLCtCQUErQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3hILE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksK0JBQStCLENBQUM7UUFDMU0sTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUN0RyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sY0FBYyxHQUNsQixJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUs7WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUM7WUFDekcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM5RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNsRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsaUJBQWlELENBQUMsQ0FBQztRQUMzRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDM0IsSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixXQUFXLEVBQUUsY0FBYyxJQUFJLEVBQUU7WUFDakMsZUFBZSxFQUFFLGtCQUFrQixJQUFJLEVBQUU7WUFDekMsV0FBVyxFQUFFLGNBQWMsSUFBSSxFQUFFO1lBQ2pDLGlCQUFpQjtZQUNqQixjQUFjLEVBQUUsY0FBYyxJQUFJLFFBQVE7WUFDMUMsY0FBYyxFQUFFLGNBQWMsSUFBSSxFQUFFO1lBQ3BDLGVBQWUsRUFBRSxlQUFlLElBQUksRUFBRTtZQUN0QyxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUU7WUFDNUIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1lBQ3hCLGlCQUFpQixFQUFFLGlCQUFpQixJQUFJLFVBQVU7WUFDbEQsZUFBZSxFQUFFLGVBQWUsSUFBSSxZQUFZO1lBQ2hELDRCQUE0QixFQUFFLDRCQUE0QixJQUFJLE1BQU07WUFDcEUsYUFBYSxFQUFFLGFBQWEsSUFBSSxFQUFFO1NBQ25DLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDL0UsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDN0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEUsT0FBTztZQUNMLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3hDLE1BQU07WUFDTixRQUFRO1lBQ1IsSUFBSSxFQUFFLE9BQU87WUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsYUFBYSxFQUFFLGNBQWMsSUFBSSxJQUFJO1lBQ3JDLGlCQUFpQixFQUFFLGtCQUFrQixJQUFJLElBQUk7WUFDN0MsZ0JBQWdCLEVBQUUsY0FBYyxJQUFJLElBQUk7WUFDeEMsY0FBYyxFQUFFLG9CQUFvQjtZQUNwQyxrQkFBa0IsRUFBRSx3QkFBd0I7WUFDNUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtZQUNyRCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw2QkFBNkIsQ0FBQyxLQUFjO1FBQzFDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFDdkMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ3pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7WUFDckMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsdUdBQXVHO0lBQ3ZHLDJCQUEyQixDQUFDLEtBQWM7UUFDeEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDM0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUN2QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsV0FBd0MsRUFDeEMsT0FBbUM7UUFFbkMsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsS0FBSyxFQUFFO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDbEUsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLElBQUksU0FBUyxFQUFFO1lBQ2Isa0VBQWtFO1lBQ2xFLHNFQUFzRTtZQUN0RSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ2hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQVEsQ0FBUyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQ3hFLENBQUM7WUFDRixPQUFPLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztTQUM3QztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFLLEtBQWEsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUNuRixDQUFDO0lBRU8sMkJBQTJCLENBQUMsR0FBaUM7UUFDbkUsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDbEQsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDckQsSUFDRSxHQUFHLEtBQUssV0FBVztZQUNuQixHQUFHLEtBQUssV0FBVztZQUNuQixDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQy9FO1lBQ0EsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFDRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxRCxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFHRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztZQUNyQyxJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLEtBQUssR0FBb0MsRUFBcUMsQ0FBQztnQkFDckYsSUFBSSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO29CQUMvQixNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO29CQUN6RyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDdEg7Z0JBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDekUsS0FBSyxDQUFDLGFBQWEsQ0FBQzt3QkFDbEIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDN0c7Z0JBQ0QsMEZBQTBGO2dCQUMxRixtREFBbUQ7Z0JBQ25ELElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDN0IsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO29CQUMzRixLQUFLLENBQUMsaUJBQWlCLENBQUM7d0JBQ3RCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDOzRCQUN0RyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDL0I7Z0JBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUM3QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxDQUM1RCxDQUFDO29CQUNGLEtBQUssQ0FBQyxhQUFhLENBQUM7d0JBQ2xCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDOzRCQUMvRixjQUFjLElBQUksRUFBRSxDQUFDO2lCQUN4QjtnQkFDRCxxRkFBcUY7Z0JBQ3JGLElBQUksWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtvQkFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLENBQUM7b0JBQzFGLElBQUksY0FBYzt3QkFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBRyxjQUFjLENBQUM7aUJBQ2pFO2dCQUNELElBQUksYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtvQkFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDLENBQUM7b0JBQ3RGLElBQUksWUFBWTt3QkFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxZQUFZLENBQUM7aUJBQzNEO2dCQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7Z0JBQ2pFLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtvQkFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7b0JBQzlGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsOEJBQThCLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7b0JBQ3BJLElBQUksVUFBVTt3QkFBRSxLQUFLLENBQUMsOEJBQThCLENBQUMsR0FBRyxVQUFVLENBQUM7aUJBQ3BFO2dCQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUN2RDthQUNGO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDbEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUUsTUFBTSxjQUFjLEdBQUcsYUFBYSxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsS0FBSyxDQUFDO1lBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxFQUFFLE9BQU8sSUFBSSxlQUFlLEVBQUUsS0FBSyxDQUFDO1lBQzVFLE1BQU0sWUFBWSxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLEtBQUssQ0FBQztZQUNoRSxNQUFNLGNBQWMsR0FBRyxhQUFhLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxLQUFLLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM1RCxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUN2RCxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRTtZQUM3RSxJQUFJLENBQUMsNEJBQTRCLEdBQUc7Z0JBQ2xDLEdBQUcsSUFBSSxDQUFDLDRCQUE0QjtnQkFDcEMsT0FBTyxFQUFFLElBQUksQ0FBQyx1QkFBdUI7YUFDdEMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUM5RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzdGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3pGLE1BQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDeEgsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsOEJBQThCLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSwrQkFBK0IsQ0FBQztZQUMxTSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FDdEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQzVELENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQztZQUM3RyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLGNBQWMsQ0FBQztZQUN6SSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLGtCQUFrQixDQUFDO1lBQ3pKLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksY0FBYyxDQUFDO1lBQ3pJLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMvRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNsRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsaUJBQWlELENBQUMsQ0FBQztZQUMzRyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxnQkFBZ0QsQ0FBQyxDQUFDO1lBQ3pHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3SSxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN2RyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQztZQUNsSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLGlCQUFpQjtnQkFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztZQUN0RSxJQUFJLGVBQWU7Z0JBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hFLElBQUksNEJBQTRCO2dCQUFFLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLDRCQUE0QixDQUFDO1lBQ3ZHLElBQUksYUFBYTtnQkFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQzFELElBQUksaUJBQWlCLENBQUMsTUFBTTtnQkFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztZQUM3RSxJQUFJLE9BQU87Z0JBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUVyQyw2RkFBNkY7WUFDN0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRCxNQUFNLFlBQVksR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLFFBQVEsRUFBRSxLQUFLLENBQUM7WUFDckMsTUFBTSxZQUFZLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQztZQUVyQyxJQUFJLGNBQWMsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMzRSxJQUFJLGtCQUFrQixJQUFJLENBQUMsWUFBWTtnQkFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztZQUN2RixJQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksY0FBYyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUM1RyxJQUFJLGNBQWM7Z0JBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsY0FBYyxDQUFDO1lBQzdELElBQUksY0FBYztnQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxjQUFjLENBQUM7WUFDN0QsSUFBSSxlQUFlO2dCQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRSxJQUFJLFVBQVU7Z0JBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUNqRCxJQUFJLFFBQVE7Z0JBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUMzQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzdFLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFDN0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzNFLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDekgsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUMzRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDM0QsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUM1RCxDQUFDLENBQUMsb0JBQW9CLElBQUksSUFBSSxJQUFJLG9CQUFvQixLQUFLLEVBQUU7Z0JBQzNELENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1QsTUFBTSxxQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDakMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUs7cUJBQ3hCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUMzRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDWixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssaUJBQWlCO3dCQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7b0JBQ2hGLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxtQkFBbUI7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDO29CQUN6RixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTTt3QkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO29CQUNoRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssYUFBYTt3QkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLENBQUM7b0JBQzlFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxtQkFBbUI7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDO29CQUN4RixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZTt3QkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLENBQUM7b0JBQ2hGLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUNMLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUM5QjtZQUNELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxrQkFBa0IsRUFBRTtnQkFDeEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDN0UsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDekUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDcEYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLCtCQUErQjt3QkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO29CQUM3RixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUsscUJBQXFCLElBQUksc0JBQXNCLElBQUksSUFBSSxJQUFJLHNCQUFzQixLQUFLLEVBQUU7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxDQUFDO29CQUMvSixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssbUJBQW1CLElBQUksb0JBQW9CLElBQUksSUFBSSxJQUFJLG9CQUFvQixLQUFLLEVBQUU7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDO29CQUN2SixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssa0NBQWtDLElBQUksa0JBQWtCLElBQUksSUFBSSxJQUFJLGtCQUFrQixLQUFLLEVBQUU7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO29CQUNoSyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDOUI7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUU1RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkQsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssa0JBQWtCLEVBQUU7Z0JBQy9FLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUN2QyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVzt3QkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO29CQUN6RSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssa0NBQWtDO3dCQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN2RyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssb0JBQW9CO3dCQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO29CQUMvRyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssNkJBQTZCLEVBQUU7d0JBQ2hELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssSUFBSSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO3dCQUNsRyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7cUJBQzNCO29CQUNELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxrQ0FBa0M7d0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7b0JBQ2hJLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUM5QjtZQUNELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsRUFBRTtnQkFDcEUsTUFBTSxLQUFLLEdBQXVDO29CQUNoRCxHQUFHLENBQUMsUUFBUSxLQUFLLEtBQUs7d0JBQ3BCLENBQUMsQ0FBQzs0QkFDRSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFOzRCQUNuRCxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO3lCQUN0RDt3QkFDSCxDQUFDLENBQUM7NEJBQ0UsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7NEJBQ3BDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO3lCQUNqQyxDQUFDO2lCQUNQLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQzlCO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixNQUFNLGFBQWEsR0FBaUM7Z0JBQ2xELEtBQUssRUFBRSxRQUFRO2dCQUNmLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRTtvQkFDTCxHQUFHLENBQUMsUUFBUSxLQUFLLEtBQUs7d0JBQ3BCLENBQUMsQ0FBQzs0QkFDRSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFOzRCQUNuRCxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO3lCQUN0RDt3QkFDSCxDQUFDLENBQUM7NEJBQ0UsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7NEJBQ3BDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO3lCQUNqQyxDQUFDO2lCQUNQO2FBQ0YsQ0FBQztZQUNGLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsTUFBTSxlQUFlLEdBQWlDO1lBQ3BELEtBQUssRUFBRSxXQUFXO1lBQ2xCLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFO2dCQUNMLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUM5RSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTthQUN6RTtTQUNGLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3hCLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDOUMsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztTQUN2QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBWSxDQUFDLEVBQVUsRUFBRSxLQUFhO1FBQ3BDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQVUsRUFBRSxPQUFxQztRQUNsRSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQVVELHdCQUF3QixDQUFDLE1BQWM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLE9BQU87WUFDTCxrQkFBa0IsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM3QixjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDN0IsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLE9BQU87WUFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCLENBQUMsTUFBYztRQUNuQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQzs7eUhBdmpDVSw0QkFBNEI7NkdBQTVCLDRCQUE0Qixzb0RDNUd6QyxxNHlCQW9kQTsyRkR4V2EsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDRCQUE0QixtQkFFckIsdUJBQXVCLENBQUMsTUFBTTt3R0FHdEMsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQVNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQU1HLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBR0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxjQUFjO3NCQUF2QixNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFFRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24sXG4gIFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSxcbn0gZnJvbSAnLi4vdGVzdC1jYXNlLWRldGFpbHMubW9kZWxzJztcbmltcG9ydCB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25PcHRpb24gfSBmcm9tICcuLi8uLi9kcm9wZG93bi1idXR0b24vZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudCc7XG5cbi8qKiBTZW50aW5lbCB2YWx1ZSBlbWl0dGVkIGluIHNhdmUgcGF5bG9hZHMgdG8gdGVsbCB0aGUgaG9zdCB0byBzZW5kIG51bGwgZm9yIHRoZSBmaWVsZCAodXNlIG9yZy1sZXZlbCBkZWZhdWx0KS4gKi9cbmNvbnN0IE9SR19MRVZFTF9TRU5USU5FTCA9ICdPcmcgbGV2ZWwnO1xuXG4vKiogT3ZlcnJpZGUgY29uZmlnIGZvciBhIHNwZWNpZmljIHNlbGVjdC4gVXNlIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2gsIGxvYWQgbW9yZSwgY3VzdG9tIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdENvbmZpZ092ZXJyaWRlIHtcbiAgLyoqIFJlcGxhY2Ugb3B0aW9ucyAoZS5nLiBmcm9tIEFQSSkuIFVwZGF0ZSB3aGVuIEFQSSByZXR1cm5zLiAqL1xuICBvcHRpb25zPzogU2VsZWN0T3B0aW9uW107XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoOyBjb21wb25lbnQgZW1pdHMgc2VsZWN0U2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbC4gKi9cbiAgaGFzTW9yZT86IGJvb2xlYW47XG4gIC8qKiBMb2FkaW5nIHN0YXRlIChlLmcuIGR1cmluZyBBUEkgY2FsbCkuICovXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgc2VhcmNoIGlucHV0IGluIHRoZSBzZWxlY3QuICovXG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCB0cmlnZ2VycyBpbml0aWFsIHNlYXJjaCBvbiBwYW5lbCBvcGVuIChzZXJ2ZXJTZWFyY2ggbW9kZSkuICovXG4gIGluaXRpYWxGZXRjaE9uT3Blbj86IGJvb2xlYW47XG4gIC8qKiBEaXNhYmxlIHRoZSBzZWxlY3QgKGUuZy4gZGVwZW5kZW50IGRyb3Bkb3duIHdhaXRpbmcgb24gYSBwYXJlbnQgdmFsdWUpLiAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBPdmVycmlkZSB0aGUgcGxhY2Vob2xkZXIgc2hvd24gd2hlbiBubyB2YWx1ZSBpcyBzZWxlY3RlZC4gKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBDYWxsYmFjayB3aGVuIHVzZXIgdHlwZXMgaW4gc2VhcmNoLiBDYWxsIEFQSSwgdGhlbiB1cGRhdGUgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBvblNlYXJjaD86IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlLiBDYWxsIEFQSSwgYXBwZW5kIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgb25Mb2FkTW9yZT86IChxdWVyeT86IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqIE1hcCBvZiBzZWxlY3Qga2V5IC0+IGNvbmZpZyBvdmVycmlkZS4gRW5hYmxlcyBBUEktZHJpdmVuIG9wdGlvbnMsIGluZmluaXRlIHNlYXJjaCwgbG9hZCBtb3JlLiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0Q29uZmlnT3ZlcnJpZGVzID0gUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBTZWxlY3RDb25maWdPdmVycmlkZT4+O1xuXG4vKiogS2V5cyBmb3IgZWFjaCBkeW5hbWljIHNlbGVjdCBpbiB0ZXN0LWNhc2UtZGV0YWlscy1lZGl0LiBVc2UgdGhlc2Ugd2l0aCBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG5leHBvcnQgY29uc3QgVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMgPSB7XG4gIHN0YXR1czogJ3N0YXR1cycsXG4gIHByaW9yaXR5OiAncHJpb3JpdHknLFxuICB0eXBlOiAndHlwZScsXG4gIGxhYmVsczogJ2xhYmVscycsXG4gIHByZXJlcXVpc2l0ZUNhc2VzOiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICBlbnZpcm9ubWVudDogJ2Vudmlyb25tZW50JyxcbiAgdGVzdERhdGFQcm9maWxlOiAndGVzdERhdGFQcm9maWxlJyxcbiAgdGVzdERhdGFTZXQ6ICd0ZXN0RGF0YVNldCcsXG4gIHZpZGVvUmVjb3JkaW5nOiAndmlkZW9SZWNvcmRpbmcnLFxuICBlbmFibGVBaVNtYXJ0bmVzczogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgZGVmYXVsdEFpQWN0aW9uOiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLFxuICB1c2VBaU1ldGFkYXRhOiAndXNlQWlNZXRhZGF0YScsXG4gIGRlZmF1bHRCcm93c2VyOiAnZGVmYXVsdEJyb3dzZXInLFxuICBkZWZhdWx0Vmlld3BvcnQ6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICBkZXZpY2VUeXBlOiAnZGV2aWNlVHlwZScsXG4gIGRldmljZU9TOiAnZGV2aWNlT1MnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHByaW9yaXR5OiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxhYmVsczogc3RyaW5nW107XG4gIGVudmlyb25tZW50SWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICB0ZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIHRlc3REYXRhU2V0SW5kZXg/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXTtcbiAgLyoqIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGFwaU1vY2tpbmdTdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrPzogYm9vbGVhbjtcbiAgLyoqIFwiUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXNcIiByb3cgc3RhdGUuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhcGlNb2NraW5nUmVzdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgYXBpTW9ja2luZ1N0b3JlTW9jaz86IGJvb2xlYW47XG59XG5cbmNvbnN0IEZSRVFVRU5UTFlfVVNFRF9MQUJFTFMgPSBbXG4gICdDYXNlJyxcbiAgJ0NyaXRpY2FsJyxcbiAgJ1BPJyxcbiAgJ1VwbG9hZCcsXG4gICdWYWxpZGF0aW9uJyxcbiAgJ1JldmlldycsXG4gICdFZGdlLWNhc2VzJyxcbiAgJ1NlY3VyaXR5JyxcbiAgJ0ludGVncmF0aW9uJyxcbiAgJ1Ntb2tlJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtZGV0YWlscy1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VEZXRhaWxzRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGVzY3JpcHRpb25UaXRsZSA9ICdEZXNjcmlwdGlvbic7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uQ29udGVudCA9ICcnO1xuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiB1c2VzIFRyaXggcmljaCB0ZXh0IGVkaXRvciAoQm9sZCwgSXRhbGljLCBldGMuKS4gSG9zdCBhcHAgbXVzdCBsb2FkIFRyaXguICovXG4gIEBJbnB1dCgpIGVuYWJsZU1hcmtkb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1ldGFkYXRhSXRlbXM6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnVGl0bGUgPSAnQ29uZmlndXJhdGlvbic7XG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnNSb3cyOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgaXNTYXZpbmcgPSBmYWxzZTtcbiAgLyoqIE9wdGlvbmFsIGxpc3Qgb2YgcHJlcmVxdWlzaXRlIHRlc3QgY2FzZSBvcHRpb25zIGZvciB0aGUgbXVsdGktc2VsZWN0LiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgZGVmYXVsdCBzYW1wbGUgb3B0aW9ucy4gKi9cbiAgQElucHV0KCkgcHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogUGxhdGZvcm06ICd3ZWInIHNob3dzIERlZmF1bHQgQnJvd3NlciArIFZpZXdwb3J0OyAnbW9iaWxlJyBzaG93cyBEZXZpY2UgVHlwZSArIE9TLiBEZWZhdWx0cyB0byAnd2ViJy4gKi9cbiAgQElucHV0KCkgcGxhdGZvcm06ICd3ZWInIHwgJ21vYmlsZScgPSAnd2ViJztcblxuICAvKiogV2hlbiB0cnVlLCBoaWRlcyBQcmlvcml0eSwgVHlwZSwgYW5kIFRlc3QgRGF0YSBTZXQgZmllbGRzIChzdGVwIGdyb3VwcyBkb24ndCBoYXZlIHRoZXNlKS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIEBJbnB1dCgpIGlzU3RlcEdyb3VwID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGNvbmZpZyBwZXIgc2VsZWN0IGtleS4gVXNlIGZvcjpcbiAgICogLSBBUEktZHJpdmVuIG9wdGlvbnM6IHBhc3Mgb3B0aW9ucyBhcnJheSAodXBkYXRlIHdoZW4gQVBJIHJldHVybnMpXG4gICAqIC0gU2VydmVyLXNpZGUgc2VhcmNoOiBzZXJ2ZXJTZWFyY2g6IHRydWUsIG9uU2VhcmNoIGluIG92ZXJyaWRlIG9yIGxpc3RlbiB0byBzZWxlY3RTZWFyY2hcbiAgICogLSBJbmZpbml0ZSBzY3JvbGw6IGhhc01vcmU6IHRydWUsIG9uTG9hZE1vcmUgaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdExvYWRNb3JlXG4gICAqIC0gSW5pdGlhbCBmZXRjaCBvbiBvcGVuOiBpbml0aWFsRmV0Y2hPbk9wZW46IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdENvbmZpZ092ZXJyaWRlczogU2VsZWN0Q29uZmlnT3ZlcnJpZGVzID0ge307XG5cbiAgLy8g4pSA4pSAIEFQSSBNb2NraW5nIGNhcmQgKGVkaXQgbW9kZTogc2hvd3MgdHdvIHRvZ2dsZXMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBASW5wdXQoKSBzaG93QXBpTW9ja2luZ0NhcmQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RpdGxlID0gJ0FQSSBNb2NraW5nJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0YXR1c0xhYmVsID0gJ05vdCBjb25maWd1cmVkJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVMYWJlbCA9ICdVc2UgbW9jayBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVIaW50ID0gJ1VzZXMgc3RvcmVkIHJlc3BvbnNlcyBvbiBuZXh0IHJ1bi4gVHVybiBvbiBhZnRlciBjYXB0dXJlIGNvbXBsZXRlcy4nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUmVuZXdMYWJlbCA9ICdSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0hpbnQgPSAnUmUtY2FwdHVyZXMgZnJlc2ggcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJucyBvZmYgVXNlIG1vY2suJztcbiAgLyoqXG4gICAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjYXJkJ3MgZHVhbCB0b2dnbGUgc3RhdGUuXG4gICAqICAgdHJ1ZSAg4oaSIFJlbmV3IE9OLCBDYXB0dXJlIE9GRlxuICAgKiAgIGZhbHNlIOKGkiBSZW5ldyBPRkYsIENhcHR1cmUgT05cbiAgICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IGZhbHNlO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIOKAlCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrYCB3aGVuIHRydWUuICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2sgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnQgPSAwO1xuICAvKiogRm9yd2FyZGVkIHRvIGBjcWEtYXBpLW1vY2tpbmctY2FyZGAuIEluIGVkaXQgbW9kZSB0aGUgY2FyZCBoaWRlcyB0aGUgYmxvY2sgYW55d2F5LCBidXRcbiAgICogIHdlIHN0aWxsIHBpcGUgdGhlIGlucHV0IHRocm91Z2ggZm9yIHN5bW1ldHJ5IHdpdGggdGhlIHJlYWQtb25seSBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTaG93UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N1bW1hcnlUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUGVyY2VudFRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqIE9yZy1sZXZlbCBkZWZhdWx0IGZvciBUZXN0IENhc2UgVGltZW91dCAobWludXRlcykuIFVzZWQgdG8gZmxhZyB0aGUgaW5wdXQgYXMgXCJPUkcgbGV2ZWxcIiB2cyBcIkN1c3RvbVwiLiAqL1xuICBASW5wdXQoKSBvcmdMZXZlbFRlc3RDYXNlVGltZW91dD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7XG5cbiAgQE91dHB1dCgpIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlRGV0YWlsc0VkaXRGb3JtRGF0YT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2VhcmNoZXMgaW4gYSBzZWxlY3QgKHNlcnZlclNlYXJjaCBtb2RlKS4gQ2FsbCBBUEkgYW5kIHVwZGF0ZSBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUuIENhbGwgQVBJLCBhcHBlbmQgdG8gb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VsZWN0IHBhbmVsIGlzIG9wZW5lZC4gVXNlIHRvIGNhbGwgQVBJIGZvciBpbml0aWFsIGxvYWQgKGUuZy4gd2hlbiBpbml0aWFsRmV0Y2hPbk9wZW4pLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0T3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcyBpbiBhbnkgc2VsZWN0LiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBhZGRzIGEgbmV3IGN1c3RvbSBsYWJlbCB2aWEgdGhlIFwiTmV3XCIgb3B0aW9uLiAqL1xuICBAT3V0cHV0KCkgbGFiZWxBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGZsaXBzIHRoZSBcIlVzZSBtb2NrIEFQSSByZXNwb25zZXNcIiB0b2dnbGUuICovXG4gIEBPdXRwdXQoKSBhcGlNb2NraW5nUmVzdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFwiUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXNcIiB0b2dnbGUuICovXG4gIEBPdXRwdXQoKSBhcGlNb2NraW5nU3RvcmVNb2NrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkNvbmZpZ3VyZSBNb2NrIEFQSXNcIiBvbiB0aGUgZW1iZWRkZWQgY2FyZCBpbiBlZGl0IG1vZGUuICovXG4gIEBPdXRwdXQoKSBjb25maWd1cmVBcGlNb2NraW5nID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICAvKiogRm9ybSBzdGF0ZSAqL1xuICBlZGl0RGVzY3JpcHRpb24gPSAnJztcbiAgZWRpdFN0YXR1cyA9ICcnO1xuICBlZGl0UHJpb3JpdHkgPSAnJztcbiAgZWRpdExhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIExvY2FsIGVkaXQtbW9kZSBtaXJyb3Igb2YgdGhlIGByZXN0b3JlTW9ja2AgYm9vbGVhbi4gU2VlZGVkIGZyb20gQElucHV0KCkgb24gaW5pdC9jaGFuZ2VzLiAqL1xuICBlZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrID0gZmFsc2U7XG4gIC8qKiBMb2NhbCBlZGl0LW1vZGUgbWlycm9yIG9mIHRoZSBgc3RvcmVNb2NrYCBib29sZWFuLiAqL1xuICBlZGl0QXBpTW9ja2luZ1N0b3JlTW9jayA9IGZhbHNlO1xuICB0ZXN0Q2FzZVRpbWVvdXQgPSAnJztcbiAgLyoqICdvcmcnIOKGkiBpbnB1dCBkaXNhYmxlZCwgcGF5bG9hZCBzZW5kcyBudWxsIGZvciB0ZXN0Y2FzZVRpbWVvdXQ7ICdjdXN0b20nIOKGkiBpbnB1dCBlbmFibGVkLCBwYXlsb2FkIHNlbmRzIHRoZSB0eXBlZCB2YWx1ZS4gKi9cbiAgdGVzdENhc2VUaW1lb3V0TW9kZTogJ29yZycgfCAnY3VzdG9tJyA9ICdvcmcnO1xuICB3YWl0VGltZW91dExvY2F0b3JzID0gJyc7XG4gIGF1dG9XYWl0RW5hYmxlZCA9IGZhbHNlO1xuICByZXRyeUZhaWxlZFN0ZXBzID0gJyc7XG4gIGNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgZXhlY3V0aW9uRXhwYW5kZWQgPSB0cnVlO1xuICBhaUNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPSB0cnVlO1xuICBkZXZpY2VFeHBhbmRlZCA9IHRydWU7XG4gIGtleUZsYWdzRXhwYW5kZWQgPSB0cnVlO1xuICBtb2JpbGVUZXN0aW5nRW5hYmxlZCA9IGZhbHNlO1xuICBleHRlbnNpb25Vc2VFbmFibGVkID0gZmFsc2U7XG4gIGRhdGFEcml2ZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZnJlcXVlbnRseVVzZWRMYWJlbHMgPSBGUkVRVUVOVExZX1VTRURfTEFCRUxTO1xuICBwcml2YXRlIF9pbml0aWFsRm9ybVNuYXBzaG90OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogRm9ybUdyb3VwIGZvciBjcWEtZHluYW1pYy1zZWxlY3QgYmluZGluZ3MgKi9cbiAgZWRpdEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGF0dXM6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgcHJpb3JpdHk6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdHlwZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBsYWJlbHM6IG5ldyBGb3JtQ29udHJvbChbXSBhcyBzdHJpbmdbXSksXG4gICAgcHJlcmVxdWlzaXRlQ2FzZXM6IG5ldyBGb3JtQ29udHJvbChbXSBhcyBzdHJpbmdbXSksXG4gICAgZW52aXJvbm1lbnQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdGVzdERhdGFQcm9maWxlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHRlc3REYXRhU2V0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRCcm93c2VyOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHZpZGVvUmVjb3JkaW5nOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRWaWV3cG9ydDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZXZpY2VUeXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZU9TOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGVuYWJsZUFpU21hcnRuZXNzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRBaUFjdGlvbjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHVzZUFpTWV0YWRhdGE6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gIH0pO1xuXG4gIGdldCBzdGF0dXNJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnU3RhdHVzJyk7XG4gIH1cblxuICBnZXQgcHJpb3JpdHlJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnUHJpb3JpdHknKTtcbiAgfVxuXG4gIGdldCB0eXBlSXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1R5cGUnKTtcbiAgfVxuXG4gIGdldCBzdGF0dXNPcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydEcmFmdCcsICdJbiBSZXZpZXcnLCAnQXBwcm92ZWQnLCAnQWN0aXZlJywgJ0luYWN0aXZlJywgJ0Jsb2NrZWQnXTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eU9wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0NyaXRpY2FsJywgJ01ham9yJywgJ0hpZ2gnLCAnTWVkaXVtJywgJ0xvdycsICdNaW5vcicsICdOb3Qgc2V0J107XG4gIH1cblxuICAvKiogQ2FjaGVkIGNvbmZpZ3MgdG8gYXZvaWQgbmV3IG9iamVjdCByZWZzIGVhY2ggY2hhbmdlIGRldGVjdGlvbiAocHJldmVudHMgaW5maW5pdGUgbG9vcHMpICovXG4gIHJlYWRvbmx5IHN0YXR1c1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3N0YXR1cycsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RhdHVzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnRHJhZnQnLCBuYW1lOiAnRHJhZnQnIH0sXG4gICAgICB7IHZhbHVlOiAnSW4gUmV2aWV3JywgbmFtZTogJ0luIFJldmlldycgfSxcbiAgICAgIHsgdmFsdWU6ICdBcHByb3ZlZCcsIG5hbWU6ICdBcHByb3ZlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdBY3RpdmUnLCBuYW1lOiAnQWN0aXZlJyB9LFxuICAgICAgeyB2YWx1ZTogJ0luYWN0aXZlJywgbmFtZTogJ0luYWN0aXZlJyB9LFxuICAgICAgeyB2YWx1ZTogJ0Jsb2NrZWQnLCBuYW1lOiAnQmxvY2tlZCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUeXBlJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGVudmlyb25tZW50U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZW52aXJvbm1lbnQnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBlbnZpcm9ubWVudCcsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1Rlc3QgRGF0YSBQcm9maWxlJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHRlc3REYXRhU2V0U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFTZXQnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1Rlc3QgRGF0YSBTZXQnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ1RDLTAwMScsIG5hbWU6ICdUQy0wMDE6IExvZ2luIGZsb3cnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDMnLCBuYW1lOiAnVEMtMDAzOiBQYXNzd29yZCByZXNldCcgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDA0JywgbmFtZTogJ1RDLTAwNDogRGFzaGJvYXJkIGxvYWQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gIF07XG5cbiAgcmVhZG9ubHkgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2aWRlb1JlY29yZGluZycsXG4gICAgbGFiZWw6ICdSZWNvcmQgdGVzdCBleGVjdXRpb24gdmlkZW8nLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAndHJ1ZScsIG5hbWU6ICdUcnVlJyB9LFxuICAgICAgeyB2YWx1ZTogJ2ZhbHNlJywgbmFtZTogJ0ZhbHNlJyB9LFxuICAgICAgeyB2YWx1ZTogJ09yZyBsZXZlbCcsIG5hbWU6ICdPcmcgbGV2ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3VzZUFpTWV0YWRhdGEnLFxuICAgIGxhYmVsOiAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAndHJ1ZScsIG5hbWU6ICdUcnVlJyB9LFxuICAgICAgeyB2YWx1ZTogJ2ZhbHNlJywgbmFtZTogJ0ZhbHNlJyB9LFxuICAgICAgeyB2YWx1ZTogJ09yZyBsZXZlbCcsIG5hbWU6ICdPcmcgbGV2ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogQ2FjaGVkIGxhYmVscyBjb25maWcgdG8gYXZvaWQgbmV3IG9iamVjdCBvbiBldmVyeSBDRCAocHJldmVudHMgZnJlZXplKSAqL1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcblxuICAvKiogTGFiZWxzIG11bHRpLXNlbGVjdDogb3B0aW9ucyA9IGZyZXF1ZW50bHkgdXNlZCArIGN1cnJlbnQgKyBBUEkgb3B0aW9ucyBmcm9tIHNlbGVjdENvbmZpZ092ZXJyaWRlcyAqL1xuICBnZXQgbGFiZWxzU2VsZWN0Q29uZmlnKCk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgaWYgKCF0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSAmJiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSkgcmV0dXJuIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXNbVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzXTtcbiAgICBjb25zdCBhcGlPcHRpb25zID0gb3ZlcnJpZGU/Lm9wdGlvbnMgPz8gW107XG4gICAgY29uc3QgYWxsTGFiZWxzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIC4uLnRoaXMuZnJlcXVlbnRseVVzZWRMYWJlbHMsXG4gICAgICAuLi50aGlzLmVkaXRMYWJlbHMsXG4gICAgICAuLi5hcGlPcHRpb25zLm1hcCgobykgPT4gU3RyaW5nKG8ubmFtZSA/PyBvLnZhbHVlID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSxcbiAgICBdKTtcbiAgICBjb25zdCBvcHRpb25zID0gQXJyYXkuZnJvbShhbGxMYWJlbHMpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgodikgPT4gKHsgdmFsdWU6IHYsIG5hbWU6IHYgfSkpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAnbGFiZWxzJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGxhYmVscyB0byBhZGQgLi4uLi4uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgICAgYWxsb3dDdXN0b21WYWx1ZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgfVxuXG4gIHByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gICAgbGFiZWw6ICdQcmVyZXF1aXNpdGUgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgb3B0aW9uU3R5bGU6ICdjaGVja2JveCcsXG4gICAgc2hvd1NlbGVjdEFsbDogdHJ1ZSxcbiAgICBzZWxlY3RBbGxMYWJlbDogJ0FsbCcsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ1RDLTAwMScsIG5hbWU6ICdUQy0wMDE6IExvZ2luIGZsb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAyJywgbmFtZTogJ1RDLTAwMjogVXNlciByZWdpc3RyYXRpb24nIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA0JywgbmFtZTogJ1RDLTAwNDogRGFzaGJvYXJkIGxvYWQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA1JywgbmFtZTogJ1RDLTAwNTogQVBJIGhlYWx0aCBjaGVjaycgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRWaWV3cG9ydCcsXG4gICAgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJzEyODB4NzIwJywgbmFtZTogJzEyODB4NzIwJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGV2aWNlVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZVR5cGUnLFxuICAgIGxhYmVsOiAnRGV2aWNlIFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE0JywgbmFtZTogJ2lQaG9uZSAxNCcgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTUnLCBuYW1lOiAnaVBob25lIDE1JyB9LFxuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNycsIG5hbWU6ICdpUGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnSXBob25lIDE3JywgbmFtZTogJ0lwaG9uZSAxNycgfSxcbiAgICAgIHsgdmFsdWU6ICdTYW1zdW5nIEdhbGF4eScsIG5hbWU6ICdTYW1zdW5nIEdhbGF4eScgfSxcbiAgICAgIHsgdmFsdWU6ICdQaXhlbCcsIG5hbWU6ICdQaXhlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZU9TU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGV2aWNlT1MnLFxuICAgIGxhYmVsOiAnT1MnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnaXBhJywgbmFtZTogJ2lPUyAoaXBhKScgfSxcbiAgICAgIHsgdmFsdWU6ICdhcGsnLCBuYW1lOiAnQW5kcm9pZCAoYXBrKScgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTYnLCBuYW1lOiAnaU9TIDE2JyB9LFxuICAgICAgeyB2YWx1ZTogJ2lPUyAxNycsIG5hbWU6ICdpT1MgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnQW5kcm9pZCAxMycsIG5hbWU6ICdBbmRyb2lkIDEzJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTQnLCBuYW1lOiAnQW5kcm9pZCAxNCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRCcm93c2VyU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEJyb3dzZXInLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJyxcbiAgICBwbGFjZWhvbGRlcjogJ0Nocm9tZScsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0Nocm9tZScsIG5hbWU6ICdDaHJvbWUnIH0sXG4gICAgICB7IHZhbHVlOiAnRmlyZWZveCcsIG5hbWU6ICdGaXJlZm94JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NhZmFyaScsIG5hbWU6ICdTYWZhcmknIH0sXG4gICAgICB7IHZhbHVlOiAnRWRnZScsIG5hbWU6ICdFZGdlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgcHJpb3JpdHlTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdwcmlvcml0eScsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnUHJpb3JpdHknLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDcml0aWNhbCcsIG5hbWU6ICdDcml0aWNhbCcgfSxcbiAgICAgIHsgdmFsdWU6ICdNYWpvcicsIG5hbWU6ICdNYWpvcicgfSxcbiAgICAgIHsgdmFsdWU6ICdIaWdoJywgbmFtZTogJ0hpZ2gnIH0sXG4gICAgICB7IHZhbHVlOiAnTWVkaXVtJywgbmFtZTogJ01lZGl1bScgfSxcbiAgICAgIHsgdmFsdWU6ICdMb3cnLCBuYW1lOiAnTG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ01pbm9yJywgbmFtZTogJ01pbm9yJyB9LFxuICAgICAgeyB2YWx1ZTogJ05vdCBzZXQnLCBuYW1lOiAnTm90IHNldCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGVuYWJsZUFpU21hcnRuZXNzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZW5hYmxlQWlTbWFydG5lc3MnLFxuICAgIGxhYmVsOiAnRW5hYmxlIEFJIFNtYXJ0bmVzcycsXG4gICAgcGxhY2Vob2xkZXI6ICdBZHZhbmNlZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0Jhc2ljJywgbmFtZTogJ0Jhc2ljJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FkdmFuY2VkJywgbmFtZTogJ0FkdmFuY2VkJyB9LFxuICAgICAgeyB2YWx1ZTogJ09mZicsIG5hbWU6ICdPZmYnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QWlBY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0QWlBY3Rpb24nLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBBSSBBY3Rpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnU21hcnQgd2FpdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ1NtYXJ0IHdhaXQnLCBuYW1lOiAnU21hcnQgd2FpdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTbWFydCBXYWl0JywgbmFtZTogJ1NtYXJ0IFdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnV2FpdCBmb3IgZWxlbWVudCcsIG5hbWU6ICdXYWl0IGZvciBlbGVtZW50JyB9LFxuICAgICAgeyB2YWx1ZTogJ1JldHJ5JywgbmFtZTogJ1JldHJ5JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NraXAnLCBuYW1lOiAnU2tpcCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgICBsYWJlbDogJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdub25lJywgbmFtZTogJ05vbmUnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBtZXJnZWQgY29uZmlnIGZvciBhIHNlbGVjdDogYmFzZSBjb25maWcgKyBvdmVycmlkZS5cbiAgICogV2lyZXMgb25TZWFyY2gsIG9uTG9hZE1vcmUgdG8gYm90aCBvdmVycmlkZSBjYWxsYmFja3MgYW5kIG91dHB1dCBldmVudHMuXG4gICAqL1xuICBnZXRDb25maWdGb3JTZWxlY3Qoa2V5OiBzdHJpbmcsIGJhc2VDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2tleV07XG4gICAgaWYgKCFvdmVycmlkZSkgcmV0dXJuIGJhc2VDb25maWc7XG5cbiAgICBjb25zdCBtZXJnZWQ6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAuLi5vdmVycmlkZSxcbiAgICAgIG9wdGlvbnM6IG92ZXJyaWRlLm9wdGlvbnMgPz8gYmFzZUNvbmZpZy5vcHRpb25zLFxuICAgICAga2V5OiBiYXNlQ29uZmlnLmtleSxcbiAgICB9O1xuXG4gICAgaWYgKG92ZXJyaWRlLnNlcnZlclNlYXJjaCB8fCBvdmVycmlkZS5vblNlYXJjaCkge1xuICAgICAgbWVyZ2VkLm9uU2VhcmNoID0gKHF1ZXJ5KSA9PiB7XG4gICAgICAgIG92ZXJyaWRlLm9uU2VhcmNoPy4ocXVlcnkpO1xuICAgICAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KHsga2V5LCBxdWVyeSB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdmVycmlkZS5oYXNNb3JlIHx8IG92ZXJyaWRlLm9uTG9hZE1vcmUpIHtcbiAgICAgIG1lcmdlZC5vbkxvYWRNb3JlID0gKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyAnJztcbiAgICAgICAgb3ZlcnJpZGUub25Mb2FkTW9yZT8uKHEpO1xuICAgICAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgb25TZWxlY3RPcGVuZWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdE9wZW5lZC5lbWl0KHsga2V5IH0pO1xuICB9XG5cbiAgb25TZWxlY3RTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0U2VhcmNoLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vblNlYXJjaD8uKGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uU2VsZWN0TG9hZE1vcmUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0TG9hZE1vcmUuZW1pdChldmVudCk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2V2ZW50LmtleV07XG4gICAgb3ZlcnJpZGU/Lm9uTG9hZE1vcmU/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscykge1xuICAgICAgY29uc3QgdmFsID0gZXZlbnQudmFsdWU7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwubWFwKCh2KSA9PiBTdHJpbmcodikpLmZpbHRlcihCb29sZWFuKSA6IHZhbCAhPSBudWxsID8gW1N0cmluZyh2YWwpXSA6IFtdO1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vIEVudmlyb25tZW50IGNhc2NhZGU6IGNsZWFyIGRlcGVuZGVudCBUZXN0IERhdGEgUHJvZmlsZSAvIFNldCBzZWxlY3Rpb25zIHNvIHRoZSBob3N0XG4gICAgLy8gcmUtZmV0Y2hlcyBwcm9maWxlcyBmb3IgdGhlIG5ldyBlbnYuIE1hcmsgZGlydHkgdG8gcHJldmVudCBuZ09uQ2hhbmdlcyByZS1zZWVkLlxuICAgIGlmIChldmVudC5rZXkgPT09IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmVudmlyb25tZW50KSB7XG4gICAgICBjb25zdCB0ZHBDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMudGVzdERhdGFQcm9maWxlKTtcbiAgICAgIGNvbnN0IHRkc0N0cmwgPSB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVNldCk7XG4gICAgICB0ZHBDdHJsPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGRzQ3RybD8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRkcEN0cmw/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICB0ZHNDdHJsPy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICAvLyBNYXJrIFRlc3QgRGF0YSBzZWxlY3RzIGFzIGRpcnR5IHNvIGxhdGVyIGlucHV0IGNoYW5nZXMgKG9wdGlvbnMvY29uZmlnKSBkb24ndCBvdmVyd3JpdGUgdXNlciBjaG9pY2VcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVByb2ZpbGUgfHwgZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVNldCkge1xuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KGV2ZW50LmtleSk7XG4gICAgICBjdHJsPy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsga2V5OiBldmVudC5rZXksIHZhbHVlOiBldmVudC52YWx1ZSB9KTtcbiAgfVxuXG4gIG9uTGFiZWxzQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXYgfHwgdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHYpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgdl07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMubGFiZWxBZGRlZC5lbWl0KHYpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZSB8fFxuICAgICAgICBzLnRpdGxlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlY3Rpb25UaXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKFxuICAgICAgKGkpID0+XG4gICAgICAgIGkubGFiZWwgPT09IGl0ZW1MYWJlbCB8fFxuICAgICAgICBpLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgcmV0dXJuIChpdGVtPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIERldmljZSBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnRGV2aWNlJyBhbmQgJ0RldmljZSBTZXR0aW5nJyB0aXRsZXMgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VDb25maWdWYWx1ZShpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCBpdGVtTGFiZWwpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlIFNldHRpbmcnLCBpdGVtTGFiZWwpO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIFdhaXRzIHNlY3Rpb24gLSBzdXBwb3J0cyBib3RoICdXYWl0IGFuZCByZXRyaWVzJyBhbmQgJ1dhaXRzICYgUmV0cmllcycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0V2FpdHNSZXRyaWVzVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYxID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXQgYW5kIHJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGNvbnN0IHYyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsIGl0ZW1MYWJlbCk7XG4gICAgbGV0IHZhbCA9ICh2MSAhPT0gJycgJiYgdjEgIT0gbnVsbCkgPyB2MSA6IHYyO1xuXG4gICAgLy8gV2hlbiB2YWx1ZXMgYXJlIGNvbWluZyBmcm9tIG9yZ2FuaXphdGlvbiBzZXR0aW5ncywgdGhlIHBvcnRhbCB3cmFwcyB0aGVtIGFzXG4gICAgLy8gXCJPcmcgTGV2ZWwgKEFDVFVBTCBWQUxVRSlcIi4gRm9yIGVkaXQgaW5wdXRzIChSZXRyeSBGYWlsZWQgU3RlcHMsIFRlc3QgQ2FzZSBUaW1lb3V0LFxuICAgIC8vIFdhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMpLCB3ZSBvbmx5IHdhbnQgdG8gc2hvdyB0aGUgaW5uZXIgdmFsdWUsIG5vdCB0aGUgd3JhcHBlci5cbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJhdyA9IFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGxvd2VyID0gcmF3LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBwcmVmaXggPSAnb3JnIGxldmVsICgnO1xuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBvcGVuSWR4ID0gcmF3LmluZGV4T2YoJygnKTtcbiAgICAgICAgY29uc3QgY2xvc2VJZHggPSByYXcubGFzdEluZGV4T2YoJyknKTtcbiAgICAgICAgaWYgKG9wZW5JZHggPj0gMCAmJiBjbG9zZUlkeCA+IG9wZW5JZHgpIHtcbiAgICAgICAgICB2YWwgPSByYXcuc3Vic3RyaW5nKG9wZW5JZHggKyAxLCBjbG9zZUlkeCkudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IHJhdy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgJiYgU3RyaW5nKHZhbCkudHJpbSgpICE9PSAnJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICAvKiogU3RyaXAgdHJhaWxpbmcgJ3MnIGZyb20gdmFsdWUgKGUuZy4gXCIxMHNcIiAtPiBcIjEwXCIpIGZvciBkaXNwbGF5IGluIHRpbWVvdXQgaW5wdXRzICovXG4gIHByaXZhdGUgc3RyaXBUcmFpbGluZ1VuaXRTKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBzID0gU3RyaW5nKHZhbCkudHJpbSgpO1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1xccypzJC9pLCAnJyk7XG4gIH1cblxuICByZWFkb25seSB0ZXN0Q2FzZVRpbWVvdXRNb2RlT3B0aW9uczogRHJvcGRvd25PcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnT1JHIGxldmVsJywgdmFsdWU6ICdvcmcnIH0sXG4gICAgeyBsYWJlbDogJ0N1c3RvbScsIHZhbHVlOiAnY3VzdG9tJyB9LFxuICBdO1xuXG4gIC8qKiBWYWx1ZSBzaG93biBpbiB0aGUgZGlzYWJsZWQgKG9yZykgb3IgZW5hYmxlZCAoY3VzdG9tKSBUZXN0IENhc2UgVGltZW91dCBpbnB1dC4gKi9cbiAgZ2V0IHRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlc3RDYXNlVGltZW91dE1vZGUgPT09ICdvcmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmdMZXZlbFRlc3RDYXNlVGltZW91dCAhPSBudWxsID8gU3RyaW5nKHRoaXMub3JnTGV2ZWxUZXN0Q2FzZVRpbWVvdXQpIDogJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3RDYXNlVGltZW91dDtcbiAgfVxuXG4gIG9uVGVzdENhc2VUaW1lb3V0TW9kZUNoYW5nZShtb2RlOiAnb3JnJyB8ICdjdXN0b20nKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gbW9kZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHBvcnRhbCB3cmFwcGVkIHRoZSBUZXN0IENhc2UgVGltZW91dCB2YWx1ZSBhcyBcIk9yZyBMZXZlbCAoLi4uKVwiLCBtZWFuaW5nIHRoZSBUQyBBUEkgcmV0dXJuZWQgbnVsbC4gKi9cbiAgcHJpdmF0ZSBpc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0IGFuZCByZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpO1xuICAgIHJldHVybiByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChPUkdfTEVWRUxfU0VOVElORUwudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvKiogQWxsb3cgb25seSBkaWdpdHM7IHVzZWQgZm9yIFJldHJ5IEZhaWxlZCBTdGVwcywgVGVzdCBDYXNlIFRpbWVvdXQsIFdhaXQgVGltZW91dCBpbnB1dHMgKi9cbiAgb25seURpZ2l0cyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgfVxuXG4gIC8qKiBGb3IgdXBkYXRlOiB1c2UgXCIwXCIgd2hlbiB2YWx1ZSBpcyBlbXB0eSBzbyBBUEkgZ2V0cyBhIG51bWJlciAqL1xuICBwcml2YXRlIGVtcHR5TnVtVG9aZXJvKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgU3RyaW5nKHZhbCkudHJpbSgpID09PSAnJykgcmV0dXJuICcwJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB2YWwuaW5jbHVkZXMoJywnKSA/IHZhbC5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFt2YWxdO1xuICB9XG5cbiAgLyoqIEVkaXQgbW9kZSBzaG91bGQgc2hvdyBwbGFjZWhvbGRlciB3aGVuIGRhdGFzZXQgaXMgbm90IHNlbGVjdGVkLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ25vdCBzZXQnID8gJycgOiB2YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNQcmVyZXF1aXNpdGVDYXNlQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBbLi4udGhpcy5jb25maWdTZWN0aW9ucywgLi4udGhpcy5jb25maWdTZWN0aW9uc1JvdzJdLmZpbmQoXG4gICAgICAocykgPT4gcy50aXRsZSA9PT0gJ0V4ZWN1dGlvbidcbiAgICApO1xuICAgIHJldHVybiAhIXNlY3Rpb24/Lml0ZW1zPy5zb21lKChpKSA9PiBpLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQ7XG4gICAgdGhpcy5lZGl0U3RhdHVzID0gdGhpcy5zdGF0dXNJdGVtPy52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICBjb25zdCBlbnZpcm9ubWVudFJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRW52aXJvbm1lbnQnKSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRSYXcgPSB0aGlzLm5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUoXG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodHlwZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndHlwZSddPy5vcHRpb25zKSA/PyB0eXBlUmF3O1xuICAgIGNvbnN0IGVudmlyb25tZW50VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShlbnZpcm9ubWVudFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsnZW52aXJvbm1lbnQnXT8ub3B0aW9ucykgPz8gZW52aXJvbm1lbnRSYXc7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVByb2ZpbGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhUHJvZmlsZSddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVByb2ZpbGVSYXc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhU2V0UmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVNldCddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVNldFJhdztcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5sYWJlbHNdO1xuICAgIGNvbnN0IGF1dG9XYWl0VmFsID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnRW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHMnKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ0F1dG8gV2FpdCcpO1xuICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICB0aGlzLnJldHJ5RmFpbGVkU3RlcHMgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdSZXRyeSBGYWlsZWQgU3RlcHMnKTtcbiAgICB0aGlzLnRlc3RDYXNlVGltZW91dE1vZGUgPSB0aGlzLmlzVGVzdENhc2VUaW1lb3V0RnJvbU9yZygpID8gJ29yZycgOiAnY3VzdG9tJztcbiAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpKTtcbiAgICB0aGlzLndhaXRUaW1lb3V0TG9jYXRvcnMgPSB0aGlzLnN0cmlwVHJhaWxpbmdVbml0Uyh0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpKTtcbiAgICB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ01vYmlsZSBUZXN0aW5nJyk7XG4gICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0RhdGEgRHJpdmVuJyk7XG4gICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgU21hcnRuZXNzJyk7XG4gICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICBjb25zdCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICBjb25zdCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWydrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJ10/Lm9wdGlvbnMpID8/IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXc7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YSA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHVzZUFpTWV0YWRhdGFSYXcpO1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VzID0gdGhpcy5nZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9XG4gICAgICB0aGlzLnBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICA/IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgQnJvd3NlcicpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJylcbiAgICAgICAgOiB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ1R5cGUnKTtcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnT1MnKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrID0gISF0aGlzLmFwaU1vY2tpbmdSZXN0b3JlTW9jaztcbiAgICB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gISF0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2s7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHN0YXR1czogdGhpcy5lZGl0U3RhdHVzLFxuICAgICAgcHJpb3JpdHk6IHRoaXMuZWRpdFByaW9yaXR5LFxuICAgICAgdHlwZTogdHlwZVZhbCB8fCAnJyxcbiAgICAgIGxhYmVsczogdGhpcy5lZGl0TGFiZWxzLFxuICAgICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50VmFsIHx8ICcnLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVByb2ZpbGVWYWwgfHwgJycsXG4gICAgICB0ZXN0RGF0YVNldDogdGVzdERhdGFTZXRWYWwgPz8gJycsXG4gICAgICBwcmVyZXF1aXNpdGVDYXNlcyxcbiAgICAgIGRlZmF1bHRCcm93c2VyOiBkZWZhdWx0QnJvd3NlciB8fCAnQ2hyb21lJyxcbiAgICAgIHZpZGVvUmVjb3JkaW5nOiB2aWRlb1JlY29yZGluZyB8fCAnJyxcbiAgICAgIGRlZmF1bHRWaWV3cG9ydDogZGVmYXVsdFZpZXdwb3J0IHx8ICcnLFxuICAgICAgZGV2aWNlVHlwZTogZGV2aWNlVHlwZSB8fCAnJyxcbiAgICAgIGRldmljZU9TOiBkZXZpY2VPUyB8fCAnJyxcbiAgICAgIGVuYWJsZUFpU21hcnRuZXNzOiBlbmFibGVBaVNtYXJ0bmVzcyB8fCAnQWR2YW5jZWQnLFxuICAgICAgZGVmYXVsdEFpQWN0aW9uOiBkZWZhdWx0QWlBY3Rpb24gfHwgJ1NtYXJ0IHdhaXQnLFxuICAgICAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZToga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSB8fCAnbm9uZScsXG4gICAgICB1c2VBaU1ldGFkYXRhOiB1c2VBaU1ldGFkYXRhIHx8ICcnLFxuICAgIH0pO1xuICAgIHRoaXMuX2luaXRpYWxGb3JtU25hcHNob3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmJ1aWxkU2F2ZVBheWxvYWQoKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgaGFzVW5zYXZlZENoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxGb3JtU25hcHNob3QgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5idWlsZFNhdmVQYXlsb2FkKCkpICE9PSB0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNhdmVQYXlsb2FkKCk6IFRlc3RDYXNlRGV0YWlsc0VkaXRGb3JtRGF0YSB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpPy52YWx1ZSA/PyB0aGlzLmVkaXRTdGF0dXM7XG4gICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJpb3JpdHknKT8udmFsdWUgPz8gdGhpcy5lZGl0UHJpb3JpdHk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGVudmlyb25tZW50VmFsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFTZXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnMoKTtcbiAgICBjb25zdCBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uQ29udGVudDogdGhpcy5lZGl0RGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXMsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHR5cGU6IHR5cGVWYWwsXG4gICAgICBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyxcbiAgICAgIGVudmlyb25tZW50SWQ6IGVudmlyb25tZW50VmFsIHx8IG51bGwsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlVmFsIHx8IG51bGwsXG4gICAgICB0ZXN0RGF0YVNldEluZGV4OiB0ZXN0RGF0YVNldFZhbCA/PyBudWxsLFxuICAgICAgY29uZmlnU2VjdGlvbnM6IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkLFxuICAgICAgY29uZmlnU2VjdGlvbnNSb3cyOiBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQsXG4gICAgICBhcGlNb2NraW5nUmVzdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayxcbiAgICAgIGFwaU1vY2tpbmdTdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGJvdW5kIHRvIHRoZSBlbWJlZGRlZCBgPGNxYS1hcGktbW9ja2luZy1jYXJkPmAgYHJlc3RvcmVNb2NrQ2hhbmdlYCBvdXRwdXQuXG4gICAqIEtlZXBzIHRoZSBsb2NhbCBlZGl0LW1vZGUgbWlycm9yIGluIHN5bmMgKGluY2x1ZGluZyB0aGUgbXV0dWFsLWV4Y2x1c2l2aXR5IHJ1bGUg4oCUXG4gICAqIHR1cm5pbmcgVXNlLW1vY2sgb24gZm9yY2VzIHN0b3JlLW1vY2sgb2ZmKSBhbmQgcmUtZW1pdHMgdG8gdGhlIHBhcmVudCBzbyB0aGUgc2F2ZVxuICAgKiBwYXlsb2FkIHJlZmxlY3RzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBvbkFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gICAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE1pcnJvciBoYW5kbGVyIGZvciB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggVXNlLW1vY2suICovXG4gIG9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2sgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5lZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVUb09wdGlvblZhbHVlKFxuICAgIGNvbmZpZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29uZmlnVmFsdWUgPT0gbnVsbCB8fCBjb25maWdWYWx1ZSA9PT0gJycpIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyA/PyBbXTtcbiAgICBpZiAoIW9wdHMubGVuZ3RoKSByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIGNvbmZpZ1ZhbHVlID09PSAnbnVtYmVyJyA/IGNvbmZpZ1ZhbHVlIDogTnVtYmVyKGNvbmZpZ1ZhbHVlKTtcbiAgICBjb25zdCBpc051bWVyaWMgPSAhTnVtYmVyLmlzTmFOKG51bSkgJiYgU3RyaW5nKGNvbmZpZ1ZhbHVlKS50cmltKCkgPT09IFN0cmluZyhudW0pO1xuICAgIGlmIChpc051bWVyaWMpIHtcbiAgICAgIC8vIElmIG9wdGlvbnMgdXNlIG51bWVyaWMgdmFsdWVzIChlLmcuIGluZGljZXMgZm9yIFRlc3QgRGF0YSBTZXQpLFxuICAgICAgLy8gcmV0dXJuIHRoZSBudW1lcmljIGZvcm0gc28gdGhlIHNlbGVjdCBjYW4gbWF0Y2ggYnkgc3RyaWN0IGVxdWFsaXR5LlxuICAgICAgY29uc3QgaGFzTnVtZXJpY09wdGlvbiA9IG9wdHMuc29tZShcbiAgICAgICAgKG8pID0+IHR5cGVvZiBvLnZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgKG8gYXMgYW55KS5pZCA9PT0gJ251bWJlcidcbiAgICAgICk7XG4gICAgICByZXR1cm4gaGFzTnVtZXJpY09wdGlvbiA/IG51bSA6IGNvbmZpZ1ZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSBTdHJpbmcoY29uZmlnVmFsdWUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG1hdGNoID0gb3B0cy5maW5kKChvKSA9PiB7XG4gICAgICBjb25zdCBuID0gU3RyaW5nKG8ubmFtZSA/PyBvLmxhYmVsID8/IG8udmFsdWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIG4gPT09IHN0cjtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2ggIT0gbnVsbCA/IChtYXRjaC52YWx1ZSA/PyAobWF0Y2ggYXMgYW55KS5pZCA/PyBtYXRjaCkgOiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZhbDogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09ICd0cnVlJykgcmV0dXJuICd0cnVlJztcbiAgICBpZiAodmFsID09PSBmYWxzZSB8fCB2YWwgPT09ICdmYWxzZScpIHJldHVybiAnZmFsc2UnO1xuICAgIGlmIChcbiAgICAgIHZhbCA9PT0gJ09yZyBsZXZlbCcgfHxcbiAgICAgIHZhbCA9PT0gJ09yZyBMZXZlbCcgfHxcbiAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb3JnIGxldmVsICgnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiAnT3JnIGxldmVsJztcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gJ09uIFdhaXQnIHx8IHZhbCA9PT0gJ29uIHdhaXQnKSByZXR1cm4gJ3RydWUnO1xuICAgIHJldHVybiB2YWwgJiYgU3RyaW5nKHZhbCkudHJpbSgpID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSkge1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdENvbmZpZ092ZXJyaWRlcyddICYmIHRoaXMuZWRpdEZvcm0/LmdldCgndHlwZScpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3R5cGUnKTtcbiAgICAgICAgY29uc3QgZW52Q3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpO1xuICAgICAgICBjb25zdCB0ZHBDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpO1xuICAgICAgICBjb25zdCB0ZHNDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICAgIGNvbnN0IGVuYWJsZUFpQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmFibGVBaVNtYXJ0bmVzcycpO1xuICAgICAgICBjb25zdCBkZWZhdWx0QWlDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RlZmF1bHRBaUFjdGlvbicpO1xuICAgICAgICBjb25zdCBwYXRjaDogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj47XG4gICAgICAgIGlmICh0eXBlQ3RybCAmJiAhdHlwZUN0cmwuZGlydHkpIHtcbiAgICAgICAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndHlwZSddID0gKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodHlwZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndHlwZSddPy5vcHRpb25zKSA/PyB0eXBlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52Q3RybCAmJiAhZW52Q3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGVudlJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRW52aXJvbm1lbnQnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsnZW52aXJvbm1lbnQnXSA9XG4gICAgICAgICAgICAodGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShlbnZSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ2Vudmlyb25tZW50J10/Lm9wdGlvbnMpID8/IGVudlJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0LCBhbGxvdyBvbmUtdGltZSByZS1yZXNvbHZlIGZyb20gY29uZmlnIHdoZW4gb3B0aW9ucyBhcnJpdmUsXG4gICAgICAgIC8vIGJ1dCBuZXZlciBvdmVyd3JpdGUgYSB1c2VyLWVkaXRlZCAoZGlydHkpIHZhbHVlLlxuICAgICAgICBpZiAodGRwQ3RybCAmJiAhdGRwQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPVxuICAgICAgICAgICAgKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz9cbiAgICAgICAgICAgICAgdGVzdERhdGFQcm9maWxlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGRzQ3RybCAmJiAhdGRzQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoWyd0ZXN0RGF0YVNldCddID1cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICB0ZXN0RGF0YVNldFJhdyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZS1yZXNvbHZlIEFJIGZpZWxkcyB3aGVuIHRoZWlyIG9wdGlvbnMgYXJyaXZlICh0aGV5IHVzZSBkaXNwbGF5IG5hbWVzIGFzIHZhbHVlcykuXG4gICAgICAgIGlmIChlbmFibGVBaUN0cmwgJiYgIWVuYWJsZUFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGFpU21hcnRuZXNzUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgICAgIGlmIChhaVNtYXJ0bmVzc1JhdykgcGF0Y2hbJ2VuYWJsZUFpU21hcnRuZXNzJ10gPSBhaVNtYXJ0bmVzc1JhdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdEFpQ3RybCAmJiAhZGVmYXVsdEFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBaVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRBaVJhdykgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpUmF3O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtiQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyk7XG4gICAgICAgIGlmIChrYkN0cmwgJiYgIWtiQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGtiUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICAgICAgICBjb25zdCBrYlJlc29sdmVkID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrYlJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrYlJhdztcbiAgICAgICAgICBpZiAoa2JSZXNvbHZlZCkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtiUmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zJ10gfHwgY2hhbmdlc1snY29uZmlnU2VjdGlvbnNSb3cyJ10pIHtcbiAgICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3O1xuICAgICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCBlbnZpcm9ubWVudFJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRW52aXJvbm1lbnQnKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdztcbiAgICAgIGNvbnN0IGVudmlyb25tZW50VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShlbnZpcm9ubWVudFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsnZW52aXJvbm1lbnQnXT8ub3B0aW9ucykgPz8gZW52aXJvbm1lbnRSYXc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpKTtcbiAgICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoWydlbmFibGVBaVNtYXJ0bmVzcyddID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaFsnZGVmYXVsdEFpQWN0aW9uJ10gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2hbJ3VzZUFpTWV0YWRhdGEnXSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaFsncHJlcmVxdWlzaXRlQ2FzZXMnXSA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKHR5cGVWYWwpIHBhdGNoWyd0eXBlJ10gPSB0eXBlVmFsO1xuXG4gICAgICAvLyBSZS1zeW5jIEVudmlyb25tZW50IC8gVGVzdCBEYXRhIFByb2ZpbGUgLyBTZXQgZnJvbSBjb25maWcgb25seSB3aGVuIGNvbnRyb2xzIGFyZSBOT1QgZGlydHlcbiAgICAgIGNvbnN0IGVudkN0cmwyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk7XG4gICAgICBjb25zdCB0ZHBDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgIGNvbnN0IHRkc0N0cmwyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUVudjIgPSBlbnZDdHJsMj8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkcDIgPSB0ZHBDdHJsMj8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkczIgPSB0ZHNDdHJsMj8uZGlydHk7XG5cbiAgICAgIGlmIChlbnZpcm9ubWVudFZhbCAmJiAhcHJlc2VydmVFbnYyKSBwYXRjaFsnZW52aXJvbm1lbnQnXSA9IGVudmlyb25tZW50VmFsO1xuICAgICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbCAmJiAhcHJlc2VydmVUZHAyKSBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPSB0ZXN0RGF0YVByb2ZpbGVWYWw7XG4gICAgICBpZiAodGVzdERhdGFTZXRWYWwgIT0gbnVsbCAmJiB0ZXN0RGF0YVNldFZhbCAhPT0gJycgJiYgIXByZXNlcnZlVGRzMikgcGF0Y2hbJ3Rlc3REYXRhU2V0J10gPSB0ZXN0RGF0YVNldFZhbDtcbiAgICAgIGlmIChkZWZhdWx0QnJvd3NlcikgcGF0Y2hbJ2RlZmF1bHRCcm93c2VyJ10gPSBkZWZhdWx0QnJvd3NlcjtcbiAgICAgIGlmICh2aWRlb1JlY29yZGluZykgcGF0Y2hbJ3ZpZGVvUmVjb3JkaW5nJ10gPSB2aWRlb1JlY29yZGluZztcbiAgICAgIGlmIChkZWZhdWx0Vmlld3BvcnQpIHBhdGNoWydkZWZhdWx0Vmlld3BvcnQnXSA9IGRlZmF1bHRWaWV3cG9ydDtcbiAgICAgIGlmIChkZXZpY2VUeXBlKSBwYXRjaFsnZGV2aWNlVHlwZSddID0gZGV2aWNlVHlwZTtcbiAgICAgIGlmIChkZXZpY2VPUykgcGF0Y2hbJ2RldmljZU9TJ10gPSBkZXZpY2VPUztcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoKSB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVtb3ZlTGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZWRpdExhYmVscyA9IHRoaXMuZWRpdExhYmVscy5maWx0ZXIoKGwpID0+IGwgIT09IGxhYmVsKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUodGhpcy5lZGl0TGFiZWxzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNsZWFyQWxsTGFiZWxzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdExhYmVscyA9IFtdO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZShbXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25BZGRGcmVxdWVudExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdExhYmVscy5pbmNsdWRlcyhsYWJlbCkpIHtcbiAgICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmVkaXRMYWJlbHMsIGxhYmVsXTtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgb25TYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZS5lbWl0KHRoaXMuYnVpbGRTYXZlUGF5bG9hZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDb25maWdTZWN0aW9ucygpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZ1ZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ZpZGVvUmVjb3JkaW5nJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdmlkZW9SZWNvcmRpbmdWYWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZpZGVvUmVjb3JkaW5nVmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHZpZGVvUmVjb3JkaW5nVmFsdWU7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3VzZUFpTWV0YWRhdGEnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YSA9IHVzZUFpTWV0YWRhdGFWYWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IHVzZUFpTWV0YWRhdGFWYWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdXNlQWlNZXRhZGF0YVZhbHVlO1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VzUmF3ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ByZXJlcXVpc2l0ZUNhc2VzJyk/LnZhbHVlO1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VzID0gQXJyYXkuaXNBcnJheShwcmVyZXF1aXNpdGVDYXNlc1JhdylcbiAgICAgID8gcHJlcmVxdWlzaXRlQ2FzZXNSYXcubWFwKCh2KSA9PiBTdHJpbmcodikpLmZpbHRlcihCb29sZWFuKVxuICAgICAgOiBwcmVyZXF1aXNpdGVDYXNlc1JhdyAhPSBudWxsICYmIHByZXJlcXVpc2l0ZUNhc2VzUmF3ICE9PSAnJ1xuICAgICAgICA/IFtTdHJpbmcocHJlcmVxdWlzaXRlQ2FzZXNSYXcpXVxuICAgICAgICA6IFtdO1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VWYWx1ZSA9IHByZXJlcXVpc2l0ZUNhc2VzLmxlbmd0aCA/IHByZXJlcXVpc2l0ZUNhc2VzLmpvaW4oJywnKSA6IG51bGw7XG4gICAgY29uc3QgdHlwZVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3R5cGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgZW52aXJvbm1lbnRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpPy52YWx1ZSA/PyAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWdTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRXhlY3V0aW9uJykge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHNlY3Rpb24uaXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhKHBsYXRmb3JtID09PSAnd2ViJyAmJiBpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBCcm93c2VyJykpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdWaWRlbyBSZWNvcmRpbmcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdmlkZW9SZWNvcmRpbmcgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogcHJlcmVxdWlzaXRlQ2FzZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1R5cGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdHlwZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0Vudmlyb25tZW50JykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IGVudmlyb25tZW50VmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFByb2ZpbGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFQcm9maWxlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFNldCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0ZXN0RGF0YVNldFZhbHVlIH07XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnQUkgQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmFibGVBaVNtYXJ0bmVzcycpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdEFpQWN0aW9uJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBrbm93bGVkZ2VCYXNlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdXNlQWlNZXRhZGF0YSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIFNtYXJ0bmVzcycgJiYgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSAhPSBudWxsICYmIGVuYWJsZUFpU21hcnRuZXNzVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBBSSBBY3Rpb24nICYmIGRlZmF1bHRBaUFjdGlvblZhbHVlICE9IG51bGwgJiYgZGVmYXVsdEFpQWN0aW9uVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZGVmYXVsdEFpQWN0aW9uVmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT0gbnVsbCAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZToga25vd2xlZGdlQmFzZVZhbHVlIH07XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5zZWN0aW9uLCBpdGVtcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RlZmF1bHRCcm93c2VyJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0Vmlld3BvcnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VUeXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RldmljZU9TJyk/LnZhbHVlID8/ICcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuY29uZmlnU2VjdGlvbnNSb3cyLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdXYWl0cyAmIFJldHJpZXMnIHx8IHNlY3Rpb24udGl0bGUgPT09ICdXYWl0IGFuZCByZXRyaWVzJykge1xuICAgICAgICBjb25zdCBhdXRvV2FpdFZhbHVlID0gdGhpcy5hdXRvV2FpdEVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnQXV0byBXYWl0JykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IGF1dG9XYWl0VmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuYXV0b1dhaXRFbmFibGVkIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdSZXRyeSBGYWlsZWQgU3RlcHMnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGhpcy5lbXB0eU51bVRvWmVybyh0aGlzLnJldHJ5RmFpbGVkU3RlcHMpIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gKHRoaXMudGVzdENhc2VUaW1lb3V0ID8/ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID09PSAnb3JnJyB8fCB0cmltbWVkID09PSAnJyA/IE9SR19MRVZFTF9TRU5USU5FTCA6IHRyaW1tZWQ7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy53YWl0VGltZW91dExvY2F0b3JzKSB9O1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlIFNldHRpbmcnKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2UgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0RldmljZScgfHwgcy50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJyk7XG4gICAgaWYgKCFleGlzdGluZ0RldmljZSkge1xuICAgICAgY29uc3QgZGV2aWNlU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgICAgdGl0bGU6ICdEZXZpY2UnLFxuICAgICAgICBpY29uOiAnZGV2aWNlcycsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgLi4uKHBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsIHZhbHVlOiBkZWZhdWx0QnJvd3NlciB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JywgdmFsdWU6IGRlZmF1bHRWaWV3cG9ydCB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHZhbHVlOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ09TJywgdmFsdWU6IGRldmljZU9TIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGRldmljZVNlY3Rpb25dO1xuICAgIH1cblxuICAgIGNvbnN0IGtleUZsYWdzU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnS2V5IEZsYWdzJyxcbiAgICAgIGljb246ICdmbGFnJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUgVGVzdGluZycsIHZhbHVlOiB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4dGVuc2lvbiBVc2UnLCB2YWx1ZTogdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgRHJpdmVuJywgdmFsdWU6IHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5RmxhZ3MgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0tleSBGbGFncycpO1xuICAgIGlmIChleGlzdGluZ0tleUZsYWdzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChzKSA9PlxuICAgICAgICBzLnRpdGxlID09PSAnS2V5IEZsYWdzJyA/IGtleUZsYWdzU2VjdGlvbiA6IHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGtleUZsYWdzU2VjdGlvbl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICB0cmFja0J5TGFiZWwoX2k6IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgdHJhY2tCeUNvbmZpZ1RpdGxlKF9pOiBudW1iZXIsIHNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWN0aW9uLnRpdGxlO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgbGFiZWxzIHVzZSBjb25zaXN0ZW50IGluZGlnbyBzdHlsZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX0NISVBfU1RZTEUgPSB7XG4gICAgYmc6ICcjNjM2NkYxJyxcbiAgICBib3JkZXI6ICcjNjM2NkYxJyxcbiAgICB0ZXh0OiAnI0ZGRkZGRicsXG4gICAgaWNvbjogJyNGRkZGRkYnLFxuICB9O1xuXG4gIGdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShfbGFiZWw6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuTEFCRUxfQ0hJUF9TVFlMRTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBjb2xvcnMuYmcsXG4gICAgICAnYm9yZGVyLWNvbG9yJzogY29sb3JzLmJvcmRlcixcbiAgICAgICdib3JkZXItd2lkdGgnOiAnMXB4JyxcbiAgICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICAgY29sb3I6IGNvbG9ycy50ZXh0LFxuICAgIH07XG4gIH1cblxuICBnZXRMYWJlbENsb3NlSWNvbkNvbG9yKF9sYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5MQUJFTF9DSElQX1NUWUxFLmljb247XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtcHktNFwiPlxuICA8IS0tIEJhc2ljIGRldGFpbHM6IERlc2NyaXB0aW9uLCBTdGF0dXMvUHJpb3JpdHkvVHlwZSwgTGFiZWxzIChsaWdodCBiYWNrZ3JvdW5kIGNvbnRhaW5lcikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOEY5RkVdIGNxYS1wLTRcIj5cbiAgPCEtLSBEZXNjcmlwdGlvbiAoRmlnbWE6IGRvY3VtZW50IGljb24sIHRleHRhcmVhIHdpdGggbGlnaHQgcHVycGxlIGJnKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgZGVzY3JpcHRpb25UaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZWRpdERlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbcm93c109XCI0XCJcbiAgICAgIFtlbmFibGVNYXJrZG93bl09XCJlbmFibGVNYXJrZG93blwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGRlc2NyaXB0aW9uLi4uXCJcbiAgICAgIHRleHRhcmVhSW5saW5lU3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxMDAlXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGF0dXMsIFByaW9yaXR5ICYgVHlwZSAoRmlnbWE6IHNpZGUtYnktc2lkZSBkcm9wZG93bnMsIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnc3RhdHVzJywgc3RhdHVzU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3N0YXR1cycpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5Qcmlvcml0eTwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdwcmlvcml0eScsIHByaW9yaXR5U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByaW9yaXR5JylcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1N0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndHlwZScsIHR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndHlwZScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExhYmVscyAoRmlnbWE6IEN1cnJlbnQgTGFiZWxzIHdpdGggQ2xlYXIgQWxsLCBjcWEtYmFkZ2Ugd2l0aCB4LCBGcmVxdWVudGx5IHVzZWQsIFNlYXJjaCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTVweF0gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+Q3VycmVudCBMYWJlbHMgKHt7IGVkaXRMYWJlbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI0RDMjYyNl0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbExhYmVscygpXCI+XG4gICAgICAgIENsZWFyIEFsbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCIgKm5nSWY9XCJlZGl0TGFiZWxzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGVkaXRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShsYWJlbClcIj5cbiAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTMuNSBjcWEtaC0zLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0TGFiZWxDbG9zZUljb25Db2xvcihsYWJlbClcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUxhYmVsKGxhYmVsKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBsYWJlbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy0zLjUgY3FhLWgtMy41XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5GcmVxdWVudGx5IHVzZWQ8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBmcmVxdWVudGx5VXNlZExhYmVsczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbClcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFOEU5RkZcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzNGNDNFRVwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFOEU5RkZcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+QWRkIGxhYmVsczwvbGFiZWw+XG4gICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJsYWJlbHNTZWxlY3RDb25maWdcIlxuICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnbGFiZWxzJylcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDwhLS0gQ29uZmlndXJhdGlvbiAoRmlnbWE6IGNvbGxhcHNpYmxlLCBnZWFyIGljb24sIGxpZ2h0IGJhY2tncm91bmQgY29udGFpbmVyKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLWJnLVsjRjhGOUZFXSBjcWEtcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LWxlZnQgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS41cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTUgY3FhLXRleHQteHNcIj5cbiAgICAgIDwhLS0gRXhlY3V0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0aW9uRXhwYW5kZWQgPSAhZXhlY3V0aW9uRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+cGxheV9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4ZWN1dGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBleGVjdXRpb25FeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleGVjdXRpb25FeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj4gXG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5FbnZpcm9ubWVudDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZW52aXJvbm1lbnQnLCBlbnZpcm9ubWVudFNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdlbnZpcm9ubWVudCcpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFQcm9maWxlJywgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhUHJvZmlsZScpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2ODczODldIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBTZXQ8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3Rlc3REYXRhU2V0JywgdGVzdERhdGFTZXRTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFTZXQnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5WaWRlbyBSZWNvcmRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ZpZGVvUmVjb3JkaW5nJywgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndmlkZW9SZWNvcmRpbmcnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBSSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+QUkgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBhaUNvbmZpZ0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFpQ29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEFpQWN0aW9uJywgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRBaUFjdGlvbicpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJywga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIndhaXRzUmV0cmllc0V4cGFuZGVkID0gIXdhaXRzUmV0cmllc0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5XYWl0IGFuZCBSZXRyaWVzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IHdhaXRzUmV0cmllc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndhaXRzUmV0cmllc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImF1dG9XYWl0RW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImF1dG9XYWl0RW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmV0cnkgRmFpbGVkIFN0ZXBzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJldHJ5RmFpbGVkU3RlcHNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicmV0cnlGYWlsZWRTdGVwcyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQteHMgY3FhLW1iLTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICBUZXN0IENhc2UgVGltZW91dCAobWludXRlcylcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1kcm9wZG93bi1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInRlc3RDYXNlVGltZW91dE1vZGVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInRlc3RDYXNlVGltZW91dE1vZGVcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblRlc3RDYXNlVGltZW91dE1vZGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdENhc2VUaW1lb3V0TW9kZSA9PT0gJ29yZydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlc3RDYXNlVGltZW91dCA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMwXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWMpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhaXRUaW1lb3V0TG9jYXRvcnNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwid2FpdFRpbWVvdXRMb2NhdG9ycyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicGxhdGZvcm0gIT09ICdtb2JpbGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkRldmljZSBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBkZXZpY2VFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkZXZpY2VFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSBXZWIgb25seTogbW9iaWxlIERldmljZSBTZXR0aW5ncyBoaWRkZW4gdGVtcG9yYXJpbHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEJyb3dzZXInLCBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0QnJvd3NlcicpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdFZpZXdwb3J0JywgZGVmYXVsdFZpZXdwb3J0U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRWaWV3cG9ydCcpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEtleSBGbGFncyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImtleUZsYWdzRXhwYW5kZWQgPSAha2V5RmxhZ3NFeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5mbGFnPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5LZXkgRmxhZ3M8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sga2V5RmxhZ3NFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJrZXlGbGFnc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJtb2JpbGVUZXN0aW5nRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiTW9iaWxlIFRlc3RpbmdcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+TW9iaWxlIFRlc3Rpbmc8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJleHRlbnNpb25Vc2VFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkV4dGVuc2lvbiBVc2VcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RXh0ZW5zaW9uIFVzZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImRhdGFEcml2ZW5FbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZGF0YURyaXZlbkVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJEYXRhIERyaXZlblwiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5EYXRhIERyaXZlbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgXG4gICAgICA8IS0tIEFQSSBNb2NraW5nIENhcmQgKGVkaXQgbW9kZTogbXV0dWFsbHktZXhjbHVzaXZlIHRvZ2dsZXMgZHJpdmVuIGJ5IG9uZSBib29sZWFuKSAtLT5cbiAgICAgIDxjcWEtYXBpLW1vY2tpbmctY2FyZFxuICAgICAgICAqbmdJZj1cInNob3dBcGlNb2NraW5nQ2FyZFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgW3RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gICAgICAgIFtzdGF0dXNMYWJlbF09XCJhcGlNb2NraW5nU3RhdHVzTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUxhYmVsXT1cImFwaU1vY2tpbmdDYXB0dXJlTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgICAgICAgW3JlbmV3TGFiZWxdPVwiYXBpTW9ja2luZ1JlbmV3TGFiZWxcIlxuICAgICAgICBbcmVuZXdIaW50XT1cImFwaU1vY2tpbmdSZW5ld0hpbnRcIlxuICAgICAgICBbcmVzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gICAgICAgIFtzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2tcIlxuICAgICAgICBbbW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICAgICAgICBbdG90YWxBcGlzQ291bnRdPVwiYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XCJcbiAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJhcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XCJcbiAgICAgICAgW3Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgICAgICAgW3N1bW1hcnlUZXh0XT1cImFwaU1vY2tpbmdTdW1tYXJ5VGV4dFwiXG4gICAgICAgIFtwZXJjZW50VGV4dF09XCJhcGlNb2NraW5nUGVyY2VudFRleHRcIlxuICAgICAgICBbZWRpdGluZ109XCJ0cnVlXCJcbiAgICAgICAgKHJlc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmZpZ3VyZSk9XCJjb25maWd1cmVBcGlNb2NraW5nLmVtaXQoKVwiPlxuICAgICAgPC9jcWEtYXBpLW1vY2tpbmctY2FyZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFpc1NhdmluZ1wiXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVW5zYXZlZENoYW5nZXNcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICBsYWJlbD1cIlNhdmluZ+KAplwiXG4gICAgICAgICAgaWNvbj1cImF1dG9yZW5ld1wiXG4gICAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|