@cqa-lib/cqa-ui 1.1.557-beta.24 → 1.1.557-beta.25
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/esm2022/lib/custom-input/custom-input.component.mjs +7 -4
- package/esm2022/lib/custom-textarea/custom-textarea.component.mjs +42 -4
- package/esm2022/lib/dialogs/name-prompt-modal.component.mjs +1 -1
- package/esm2022/lib/dynamic-select/dynamic-select-field.component.mjs +5 -1
- package/esm2022/lib/export-code-modal/export-code-modal.component.mjs +1 -1
- package/esm2022/lib/manage-columns-dialog/manage-columns-dialog.component.mjs +1 -1
- package/esm2022/lib/new-db-config-dialog/new-db-config-dialog.component.mjs +1 -1
- package/esm2022/lib/new-environment-dialog/new-environment-dialog.component.mjs +1 -1
- package/esm2022/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.mjs +1 -1
- package/esm2022/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +1 -1
- package/esm2022/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +1 -1
- package/esm2022/lib/questionnaire-list/questionnaire-list.component.mjs +1 -1
- package/esm2022/lib/step-builder/advanced-variables-form/advanced-variables-form.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-database/step-builder-database.component.mjs +71 -17
- package/esm2022/lib/step-builder/step-builder-document/step-builder-document.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-group/step-builder-group.component.mjs +1 -1
- package/esm2022/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +1 -1
- package/esm2022/lib/step-builder/template-variables-form/template-variables-form.component.mjs +1 -1
- package/esm2022/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +1 -1
- package/esm2022/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1 -1
- package/esm2022/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
- package/esm2022/lib/test-case-details/create-step-group/create-step-group.component.mjs +1 -1
- package/esm2022/lib/test-case-details/element-popup/element-form/element-form.component.mjs +1 -1
- package/esm2022/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +1 -1
- package/esm2022/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +1 -1
- package/esm2022/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +1 -1
- package/esm2022/lib/test-suite/move-test-suite-dialog/move-test-suite-dialog.component.mjs +1 -1
- package/esm2022/lib/ui-kit.module.mjs +10 -2
- package/esm2022/lib/viewport-selector/viewport-selector.component.mjs +1 -1
- package/fesm2022/cqa-lib-cqa-ui.mjs +149 -37
- package/fesm2022/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-input/custom-input.component.d.ts +2 -1
- package/lib/custom-textarea/custom-textarea.component.d.ts +8 -1
- package/lib/step-builder/step-builder-database/step-builder-database.component.d.ts +11 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -3,20 +3,13 @@ import { UntypedFormGroup, UntypedFormArray, Validators, } from "@angular/forms"
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/forms";
|
|
5
5
|
import * as i2 from "@angular/common";
|
|
6
|
-
import * as i3 from "@angular/material/
|
|
7
|
-
import * as i4 from "
|
|
8
|
-
import * as i5 from "
|
|
9
|
-
import * as i6 from "
|
|
10
|
-
import * as i7 from "
|
|
11
|
-
import * as i8 from "
|
|
12
|
-
import * as i9 from "
|
|
13
|
-
import * as i10 from "@angular/material/input";
|
|
14
|
-
import * as i11 from "../../button/button.component";
|
|
15
|
-
import * as i12 from "../../dynamic-select/dynamic-select-field.component";
|
|
16
|
-
import * as i13 from "../../badge/badge.component";
|
|
17
|
-
import * as i14 from "../../custom-input/custom-input.component";
|
|
18
|
-
import * as i15 from "../../custom-textarea/custom-textarea.component";
|
|
19
|
-
import * as i16 from "../advanced-variables-form/advanced-variables-form.component";
|
|
6
|
+
import * as i3 from "@angular/material/table";
|
|
7
|
+
import * as i4 from "../../button/button.component";
|
|
8
|
+
import * as i5 from "../../dynamic-select/dynamic-select-field.component";
|
|
9
|
+
import * as i6 from "../../badge/badge.component";
|
|
10
|
+
import * as i7 from "../../custom-input/custom-input.component";
|
|
11
|
+
import * as i8 from "../../custom-textarea/custom-textarea.component";
|
|
12
|
+
import * as i9 from "../advanced-variables-form/advanced-variables-form.component";
|
|
20
13
|
export class StepBuilderDatabaseComponent {
|
|
21
14
|
fb;
|
|
22
15
|
cdr;
|
|
@@ -73,6 +66,67 @@ export class StepBuilderDatabaseComponent {
|
|
|
73
66
|
defaultExpectedType = "string";
|
|
74
67
|
formSubscriptions = new Map();
|
|
75
68
|
assertionsTable;
|
|
69
|
+
/** Options + cqa-dynamic-select configs for the assertion-row dropdowns. */
|
|
70
|
+
verificationTypeOptions = [
|
|
71
|
+
{ value: "equals", label: "Equals" },
|
|
72
|
+
{ value: "not_equals", label: "Not Equals" },
|
|
73
|
+
{ value: "contains", label: "Contains" },
|
|
74
|
+
{ value: "not_contains", label: "Not Contains" },
|
|
75
|
+
{ value: "greater_than", label: "Greater Than" },
|
|
76
|
+
{ value: "less_than", label: "Less Than" },
|
|
77
|
+
{ value: "greater_than_or_equals", label: "Greater Than Or Equals" },
|
|
78
|
+
{ value: "less_than_or_equals", label: "Less Than Or Equals" },
|
|
79
|
+
{ value: "exists", label: "Exists" },
|
|
80
|
+
{ value: "not_exists", label: "Not Exists" },
|
|
81
|
+
];
|
|
82
|
+
expectedTypeOptions = [
|
|
83
|
+
{ value: "string", label: "String" },
|
|
84
|
+
{ value: "number", label: "Number" },
|
|
85
|
+
{ value: "boolean", label: "Boolean" },
|
|
86
|
+
{ value: "object", label: "Object" },
|
|
87
|
+
{ value: "array", label: "Array" },
|
|
88
|
+
{ value: "null", label: "Null" },
|
|
89
|
+
];
|
|
90
|
+
booleanExpectedValueOptions = [
|
|
91
|
+
{ value: "true", label: "true" },
|
|
92
|
+
{ value: "false", label: "false" },
|
|
93
|
+
];
|
|
94
|
+
verificationTypeSelectConfig = {
|
|
95
|
+
key: "verificationType",
|
|
96
|
+
searchable: false,
|
|
97
|
+
options: this.verificationTypeOptions,
|
|
98
|
+
};
|
|
99
|
+
expectedTypeSelectConfig = {
|
|
100
|
+
key: "expectedType",
|
|
101
|
+
searchable: false,
|
|
102
|
+
options: this.expectedTypeOptions,
|
|
103
|
+
};
|
|
104
|
+
booleanExpectedValueSelectConfig = {
|
|
105
|
+
key: "expectedValue",
|
|
106
|
+
searchable: false,
|
|
107
|
+
options: this.booleanExpectedValueOptions,
|
|
108
|
+
};
|
|
109
|
+
/** Returns the per-row FormGroup so cqa-dynamic-select can bind to it. */
|
|
110
|
+
getAssertionFormGroupAt(index) {
|
|
111
|
+
const formArray = this.getAssertionsFormArray();
|
|
112
|
+
if (index < 0 || index >= formArray.length)
|
|
113
|
+
return null;
|
|
114
|
+
return formArray.at(index);
|
|
115
|
+
}
|
|
116
|
+
/** Returns validation errors for a per-row control, in the shape cqa-custom-input expects. */
|
|
117
|
+
getAssertionFieldErrors(index, controlName) {
|
|
118
|
+
const control = this.getFormControlAt(index, controlName);
|
|
119
|
+
if (!control || !control.touched || !control.errors)
|
|
120
|
+
return [];
|
|
121
|
+
const errors = [];
|
|
122
|
+
if (control.errors["required"]) {
|
|
123
|
+
errors.push(controlName === "jsonPath" ? "JSONPath is required" : "Expected value is required");
|
|
124
|
+
}
|
|
125
|
+
if (control.errors["invalidType"]) {
|
|
126
|
+
errors.push(control.errors["message"] || "Invalid value");
|
|
127
|
+
}
|
|
128
|
+
return errors;
|
|
129
|
+
}
|
|
76
130
|
// Advanced settings variables (generic per step, can be provided by parent)
|
|
77
131
|
advancedSettingsVariables = [];
|
|
78
132
|
advancedVariablesForm = new UntypedFormArray([]);
|
|
@@ -943,11 +997,11 @@ export class StepBuilderDatabaseComponent {
|
|
|
943
997
|
}
|
|
944
998
|
}
|
|
945
999
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StepBuilderDatabaseComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
946
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StepBuilderDatabaseComponent, selector: "cqa-step-builder-database", inputs: { dbEnvironmentOptions: "dbEnvironmentOptions", normalEnvironmentOptions: "normalEnvironmentOptions", queries: "queries", queryResults: "queryResults", isLoading: "isLoading", initialDbEnvironment: "initialDbEnvironment", initialNormalEnvironment: "initialNormalEnvironment", editMode: "editMode", isCreatingStep: "isCreatingStep", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { createStep: "createStep", cancelled: "cancelled", runQuery: "runQuery", searchDbEnvironment: "searchDbEnvironment", searchNormalEnvironment: "searchNormalEnvironment", addQuery: "addQuery", deleteQuery: "deleteQuery", assertionDataChange: "assertionDataChange", selectedQueryIndexChange: "selectedQueryIndexChange", activeTabChange: "activeTabChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "assertionsTable", first: true, predicate: ["assertionsTable"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Update Database Test Step' : 'Create Database Test Step' }}\n </h2>\n\n <!-- Environment Section (separator line only on bottom) -->\n <div class=\"cqa-flex cqa-w-full cqa-justify-between cqa-gap-1.5 cqa-pb-[0.5rem] cqa-mb-4 cqa-border-0 cqa-border-b cqa-border-solid cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-gap-4 cqa-items-start\">\n <!-- DB Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n DB Environment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getDbEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Database environments from Environments.\n </p>\n </div>\n\n <!-- Normal Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n Normal Environment\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getNormalEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Normal environments from Environments.\n </p>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end cqa-mt-2\">\n <cqa-button variant=\"filled\" text=\"Run Query\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[24px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[37px] hover:!cqa-bg-[#1B1FEB] cqa-flex-shrink-0'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Main Content: Two Column Layout -->\n <div class=\"cqa-flex cqa-gap-[12px] cqa-flex-1 cqa-overflow-hidden cqa-mb-6\">\n <!-- Left Panel: Query List -->\n <div\n class=\"cqa-w-[175px] cqa-min-w-[175px] cqa-flex-shrink-0 cqa-flex cqa-flex-col cqa-border-0 cqa-border-r cqa-border-r-[1px] cqa-border-solid cqa-border-[#E0E0E0] cqa-bg-[#FAFAFA] cqa-overflow-hidden\">\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-p-2\">\n <div *ngFor=\"let query of queries; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-[10px] cqa-w-full cqa-pt-[14px] cqa-pb-[14px] cqa-pl-[16px] cqa-pr-[16px] cqa-rounded-[8px] cqa-cursor-pointer cqa-mb-1\"\n [class.cqa-bg-blue-50]=\"selectedQueryIndex === i\"\n [class.cqa-border]=\"selectedQueryIndex === i\"\n [class.cqa-border-blue-500]=\"selectedQueryIndex === i\"\n [class.cqa-bg-grey-400]=\"selectedQueryIndex !== i\"\n (click)=\"onSelectQuery(i)\"\n style=\"height: 49px; min-height: 49px;\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Query {{ i + 1 }}</span>\n <cqa-badge *ngIf=\"query.status\"\n [label]=\"query.status === 'passed' ? 'Passed' : query.status === 'failed' ? 'Failed' : 'Pending'\"\n [variant]=\"query.status === 'passed' ? 'success' : query.status === 'failed' ? 'error' : 'default'\"\n size=\"small\">\n </cqa-badge>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: Query Editor -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-overflow-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-gap-[10px] cqa-mb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px]\" style=\"width: 50%;\">\n <div class=\"\">\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900 cqa-text-[14px]\">Query & Store Response<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span></h3>\n </div>\n\n <div class=\"cqa-flex cqa-justify-between\">\n <!-- SQL Query Textarea -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0 cqa-w-full cqa-rounded-md cqa-bg-gray-50/50\">\n <cqa-custom-textarea [placeholder]=\"'Enter your SQL query here...'\"\n [value]=\"getCurrentQueryFormGroup()?.get('query')?.value || ''\" [fullWidth]=\"true\" [rows]=\"8\"\n [textareaInlineStyle]=\"'padding: 1rem;'\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('query')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-flex cqa-flex-col cqa-gap-[10px] cqa-mb-[8px]\">\n\n\n <!-- Variable Input -->\n <div class=\"cqa-flex cqa-gap-4\">\n <div class=\"cqa-flex-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5 cqa-block cqa-text-[14px] cqa-font-semibold\">\n Variable<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Variable name'\"\n [value]=\"getCurrentQueryFormGroup()?.get('variable')?.value || ''\" [fullWidth]=\"true\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('variable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Use letters, numbers, underscore. No spaces. Unique per step. Case sensitive.\n </p>\n </div>\n </div>\n <!-- Action Buttons (pinned to bottom) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mt-auto\">\n <cqa-button variant=\"outlined\" text=\"Add Query\" icon=\"add\" (clicked)=\"addNewQuery()\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#414146] cqa-text-sm cqa-font-semibold cqa-text-[#414146] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[10px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#414146] hover:cqa-bg-gray-50'\"\n [iconColor]=\"'#414146'\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [tooltip]=\"'Delete query'\" (clicked)=\"deleteQueryById(getCurrentQuery()?.id || '')\"\n [disabled]=\"queries.length <= 1\" [attr.aria-label]=\"'Delete query'\">\n <svg class=\"cqa-flex-shrink-0\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#6B7280\" />\n </svg>\n </cqa-button>\n <cqa-button variant=\"filled\" text=\"Run\" icon=\"play_arrow\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!getCurrentQueryFormGroup()?.get('query')?.value || !databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[16px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[38px] hover:!cqa-bg-[#1B1FEB] !cqa-border-none'\"\n [iconColor]=\"'#FBFCFF'\">\n </cqa-button>\n </div>\n </div>\n </div>\n <!-- Results Section -->\n <div class=\"cqa-flex cqa-flex-col cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-mb-6\">\n <!-- Tabs -->\n <div class=\"cqa-flex cqa-items-center cqa-border-b cqa-border-gray-200 cqa-bg-gray-50\">\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'output'\" [class.cqa-border-blue-600]=\"selectedTab === 'output'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'output'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'output'\" (click)=\"onTabChange('output')\">\n Output\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'verification'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'verification'\" (click)=\"onTabChange('verification')\">\n Verification\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'advanced'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'advanced'\" (click)=\"onTabChange('advanced')\">\n Advanced\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"cqa-p-4\">\n <!-- Output Tab -->\n <div *ngIf=\"selectedTab === 'output'\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-3\">\n <h4 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900\">Query Results</h4>\n <cqa-button variant=\"text\" text=\"Copy\" icon=\"content_copy\" [customClass]=\"'cqa-text-blue-600'\"\n (clicked)=\"onCopyResults()\">\n </cqa-button>\n </div>\n\n <!-- Results Table -->\n <div *ngIf=\"getCurrentQueryResult().length > 0\" class=\"cqa-overflow-x-auto\">\n <table class=\"cqa-w-full cqa-border-collapse\">\n <thead>\n <tr class=\"cqa-bg-gray-50 cqa-border-b cqa-border-gray-200\">\n <th *ngFor=\"let key of getTableColumns()\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-left cqa-text-xs cqa-font-semibold cqa-text-gray-700 cqa-uppercase\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of getCurrentQueryResult()\" class=\"cqa-border-b cqa-border-gray-200 hover:cqa-bg-gray-50\">\n <td *ngFor=\"let key of getTableColumns()\" class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-text-gray-900\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"getCurrentQueryResult().length === 0\"\n class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-sm\">\n No results yet. Run a query to see results.\n </div>\n </div>\n\n <!-- Verification Tab -->\n <div *ngIf=\"selectedTab === 'verification'\" class=\"assertions-container\">\n <!-- Header Section -->\n <div class=\"assertions-header\">\n <div class=\"header-content\">\n <h3 class=\"header-title\">Assertions</h3>\n <p class=\"header-subtitle\">Use JSONPath to target values in the query output.</p>\n </div>\n <button \n mat-stroked-button \n color=\"primary\" \n class=\"add-assertion-button\"\n (click)=\"addAssertion()\">\n <mat-icon>add</mat-icon>\n Add Assertion\n </button>\n </div>\n\n <!-- Table Section -->\n <form *ngIf=\"getCurrentAssertionsForm()\" [formGroup]=\"getCurrentAssertionsForm()!\" class=\"assertions-form\">\n <div formArrayName=\"assertions\">\n <div class=\"table-scroll-container\">\n <table mat-table [dataSource]=\"assertionsDataSource\" class=\"assertions-table\" #assertionsTable>\n <!-- JSONPath Column -->\n <ng-container matColumnDef=\"jsonPath\">\n <th mat-header-cell *matHeaderCellDef>jsonPath</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <input \n matInput \n formControlName=\"jsonPath\"\n placeholder=\"username\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'jsonPath')?.hasError('required') && \n getFormControlAt(i, 'jsonPath')?.touched\">\n JSONPath is required\n </mat-error>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Verification Type Column -->\n <ng-container matColumnDef=\"verificationType\">\n <th mat-header-cell *matHeaderCellDef>verificationType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <mat-select formControlName=\"verificationType\">\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"not_equals\">Not Equals</mat-option>\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"not_contains\">Not Contains</mat-option>\n <mat-option value=\"greater_than\">Greater Than</mat-option>\n <mat-option value=\"less_than\">Less Than</mat-option>\n <mat-option value=\"greater_than_or_equals\">Greater Than Or Equals</mat-option>\n <mat-option value=\"less_than_or_equals\">Less Than Or Equals</mat-option>\n <mat-option value=\"exists\">Exists</mat-option>\n <mat-option value=\"not_exists\">Not Exists</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Expected Type Column -->\n <ng-container matColumnDef=\"expectedType\">\n <th mat-header-cell *matHeaderCellDef>expectedType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <mat-select \n formControlName=\"expectedType\"\n (selectionChange)=\"onExpectedTypeChange(i, $event.value)\">\n <mat-option value=\"string\">String</mat-option>\n <mat-option value=\"number\">Number</mat-option>\n <mat-option value=\"boolean\">Boolean</mat-option>\n <mat-option value=\"object\">Object</mat-option>\n <mat-option value=\"array\">Array</mat-option>\n <mat-option value=\"null\">Null</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Expected Value Column -->\n <ng-container matColumnDef=\"expectedValue\">\n <th mat-header-cell *matHeaderCellDef>expectedValue</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <!-- String, Array, Object Input -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'string' || getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <textarea \n *ngIf=\"getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n rows=\"3\"\n required></textarea>\n <input \n *ngIf=\"getExpectedType(i) === 'string'\"\n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('invalidType')\">\n {{ getFormControlAt(i, 'expectedValue')?.errors?.message }}\n </mat-error>\n </mat-form-field>\n\n <!-- Null Type Display -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'null'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <input \n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [disabled]=\"true\">\n </mat-form-field>\n\n <!-- Number Input -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'number'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <input \n matInput \n type=\"number\"\n formControlName=\"expectedValue\"\n placeholder=\"Expected Value in Number\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n </mat-form-field>\n\n <!-- Boolean Select -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'boolean'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <mat-select formControlName=\"expectedValue\" required>\n <mat-option value=\"true\">true</mat-option>\n <mat-option value=\"false\">false</mat-option>\n </mat-select>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <button \n mat-icon-button \n color=\"warn\"\n class=\"delete-button\"\n (click)=\"removeAssertion(i)\"\n [matTooltip]=\"'Delete assertion'\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"getAssertionsFormArray().length === 0\" class=\"empty-state\">\n <p>No assertions added. Click \"Add Assertion\" to create one.</p>\n </div>\n </div>\n </form>\n </div>\n\n <div *ngIf=\"selectedTab === 'advanced'\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { kind: "component", type: i12.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { kind: "component", type: i13.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"] }, { kind: "component", type: i14.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"] }, { kind: "component", type: i15.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"] }, { kind: "component", type: i16.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }] });
|
|
1000
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StepBuilderDatabaseComponent, selector: "cqa-step-builder-database", inputs: { dbEnvironmentOptions: "dbEnvironmentOptions", normalEnvironmentOptions: "normalEnvironmentOptions", queries: "queries", queryResults: "queryResults", isLoading: "isLoading", initialDbEnvironment: "initialDbEnvironment", initialNormalEnvironment: "initialNormalEnvironment", editMode: "editMode", isCreatingStep: "isCreatingStep", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { createStep: "createStep", cancelled: "cancelled", runQuery: "runQuery", searchDbEnvironment: "searchDbEnvironment", searchNormalEnvironment: "searchNormalEnvironment", addQuery: "addQuery", deleteQuery: "deleteQuery", assertionDataChange: "assertionDataChange", selectedQueryIndexChange: "selectedQueryIndexChange", activeTabChange: "activeTabChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "assertionsTable", first: true, predicate: ["assertionsTable"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Update Database Test Step' : 'Create Database Test Step' }}\n </h2>\n\n <!-- Environment Section (separator line only on bottom) -->\n <div class=\"cqa-flex cqa-w-full cqa-justify-between cqa-gap-1.5 cqa-pb-[0.5rem] cqa-mb-4 cqa-border-0 cqa-border-b cqa-border-solid cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-gap-4 cqa-items-start\">\n <!-- DB Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n DB Environment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getDbEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Database environments from Environments.\n </p>\n </div>\n\n <!-- Normal Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n Normal Environment\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getNormalEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Normal environments from Environments.\n </p>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end cqa-mt-2\">\n <cqa-button variant=\"filled\" text=\"Run Query\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[24px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[37px] hover:!cqa-bg-[#1B1FEB] cqa-flex-shrink-0'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Main Content: Two Column Layout -->\n <div class=\"cqa-flex cqa-gap-[12px] cqa-flex-1 cqa-overflow-hidden cqa-mb-6\">\n <!-- Left Panel: Query List -->\n <div\n class=\"cqa-w-[175px] cqa-min-w-[175px] cqa-flex-shrink-0 cqa-flex cqa-flex-col cqa-border-0 cqa-border-r cqa-border-r-[1px] cqa-border-solid cqa-border-[#E0E0E0] cqa-bg-[#FAFAFA] cqa-overflow-hidden\">\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-p-2\">\n <div *ngFor=\"let query of queries; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-[10px] cqa-w-full cqa-pt-[14px] cqa-pb-[14px] cqa-pl-[16px] cqa-pr-[16px] cqa-rounded-[8px] cqa-cursor-pointer cqa-mb-1\"\n [class.cqa-bg-blue-50]=\"selectedQueryIndex === i\"\n [class.cqa-border]=\"selectedQueryIndex === i\"\n [class.cqa-border-blue-500]=\"selectedQueryIndex === i\"\n [class.cqa-bg-grey-400]=\"selectedQueryIndex !== i\"\n (click)=\"onSelectQuery(i)\"\n style=\"height: 49px; min-height: 49px;\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Query {{ i + 1 }}</span>\n <cqa-badge *ngIf=\"query.status\"\n [label]=\"query.status === 'passed' ? 'Passed' : query.status === 'failed' ? 'Failed' : 'Pending'\"\n [variant]=\"query.status === 'passed' ? 'success' : query.status === 'failed' ? 'error' : 'default'\"\n size=\"small\">\n </cqa-badge>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: Query Editor -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-overflow-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-gap-[10px] cqa-mb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px]\" style=\"width: 50%;\">\n <div class=\"\">\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900 cqa-text-[14px]\">Query & Store Response<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span></h3>\n </div>\n\n <div class=\"cqa-flex cqa-justify-between\">\n <!-- SQL Query Textarea -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0 cqa-w-full cqa-rounded-md cqa-bg-gray-50/50\">\n <cqa-custom-textarea [placeholder]=\"'Enter your SQL query here...'\"\n [value]=\"getCurrentQueryFormGroup()?.get('query')?.value || ''\" [fullWidth]=\"true\" [rows]=\"8\"\n [textareaInlineStyle]=\"'padding: 1rem;'\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('query')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-flex cqa-flex-col cqa-gap-[10px] cqa-mb-[8px]\">\n\n\n <!-- Variable Input -->\n <div class=\"cqa-flex cqa-gap-4\">\n <div class=\"cqa-flex-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5 cqa-block cqa-text-[14px] cqa-font-semibold\">\n Variable<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Variable name'\"\n [value]=\"getCurrentQueryFormGroup()?.get('variable')?.value || ''\" [fullWidth]=\"true\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('variable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Use letters, numbers, underscore. No spaces. Unique per step. Case sensitive.\n </p>\n </div>\n </div>\n <!-- Action Buttons (pinned to bottom) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mt-auto\">\n <cqa-button variant=\"outlined\" text=\"Add Query\" icon=\"add\" (clicked)=\"addNewQuery()\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#414146] cqa-text-sm cqa-font-semibold cqa-text-[#414146] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[10px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#414146] hover:cqa-bg-gray-50'\"\n [iconColor]=\"'#414146'\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [tooltip]=\"'Delete query'\" (clicked)=\"deleteQueryById(getCurrentQuery()?.id || '')\"\n [disabled]=\"queries.length <= 1\" [attr.aria-label]=\"'Delete query'\">\n <svg class=\"cqa-flex-shrink-0\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#6B7280\" />\n </svg>\n </cqa-button>\n <cqa-button variant=\"filled\" text=\"Run\" icon=\"play_arrow\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!getCurrentQueryFormGroup()?.get('query')?.value || !databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[16px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[38px] hover:!cqa-bg-[#1B1FEB] !cqa-border-none'\"\n [iconColor]=\"'#FBFCFF'\">\n </cqa-button>\n </div>\n </div>\n </div>\n <!-- Results Section -->\n <div class=\"cqa-flex cqa-flex-col cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-mb-6\">\n <!-- Tabs -->\n <div class=\"cqa-flex cqa-items-center cqa-border-b cqa-border-gray-200 cqa-bg-gray-50\">\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'output'\" [class.cqa-border-blue-600]=\"selectedTab === 'output'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'output'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'output'\" (click)=\"onTabChange('output')\">\n Output\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'verification'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'verification'\" (click)=\"onTabChange('verification')\">\n Verification\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'advanced'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'advanced'\" (click)=\"onTabChange('advanced')\">\n Advanced\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"cqa-p-4\">\n <!-- Output Tab -->\n <div *ngIf=\"selectedTab === 'output'\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-3\">\n <h4 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900\">Query Results</h4>\n <cqa-button variant=\"text\" text=\"Copy\" icon=\"content_copy\" [customClass]=\"'cqa-text-blue-600'\"\n (clicked)=\"onCopyResults()\">\n </cqa-button>\n </div>\n\n <!-- Results Table -->\n <div *ngIf=\"getCurrentQueryResult().length > 0\" class=\"cqa-overflow-x-auto\">\n <table class=\"cqa-w-full cqa-border-collapse\">\n <thead>\n <tr class=\"cqa-bg-gray-50 cqa-border-b cqa-border-gray-200\">\n <th *ngFor=\"let key of getTableColumns()\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-left cqa-text-xs cqa-font-semibold cqa-text-gray-700 cqa-uppercase\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of getCurrentQueryResult()\" class=\"cqa-border-b cqa-border-gray-200 hover:cqa-bg-gray-50\">\n <td *ngFor=\"let key of getTableColumns()\" class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-text-gray-900\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"getCurrentQueryResult().length === 0\"\n class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-sm\">\n No results yet. Run a query to see results.\n </div>\n </div>\n\n <!-- Verification Tab -->\n <div *ngIf=\"selectedTab === 'verification'\" class=\"assertions-container\">\n <!-- Header Section -->\n <div class=\"assertions-header\">\n <div class=\"header-content\">\n <h3 class=\"header-title\">Assertions</h3>\n <p class=\"header-subtitle\">Use JSONPath to target values in the query output.</p>\n </div>\n <cqa-button\n variant=\"outlined\"\n text=\"Add Assertion\"\n icon=\"add\"\n class=\"add-assertion-button\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#3F43EE] cqa-text-sm cqa-font-semibold !cqa-text-[#3F43EE] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[16px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#1B1FEB] hover:!cqa-text-[#1B1FEB] hover:cqa-bg-[#F5F5FF]'\"\n [iconColor]=\"'#3F43EE'\"\n (clicked)=\"addAssertion()\">\n </cqa-button>\n </div>\n\n <!-- Table Section -->\n <form *ngIf=\"getCurrentAssertionsForm()\" [formGroup]=\"getCurrentAssertionsForm()!\" class=\"assertions-form\">\n <div formArrayName=\"assertions\">\n <div class=\"table-scroll-container\">\n <table mat-table [dataSource]=\"assertionsDataSource\" class=\"assertions-table\" #assertionsTable>\n <!-- JSONPath Column -->\n <ng-container matColumnDef=\"jsonPath\">\n <th mat-header-cell *matHeaderCellDef>jsonPath</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-custom-input\n [placeholder]=\"'username'\"\n [value]=\"getFormControlAt(i, 'jsonPath')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'jsonPath')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'jsonPath')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'jsonPath')?.markAsTouched()\">\n </cqa-custom-input>\n </td>\n </ng-container>\n\n <!-- Verification Type Column -->\n <ng-container matColumnDef=\"verificationType\">\n <th mat-header-cell *matHeaderCellDef>verificationType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-dynamic-select\n *ngIf=\"getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"verificationTypeSelectConfig\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Expected Type Column -->\n <ng-container matColumnDef=\"expectedType\">\n <th mat-header-cell *matHeaderCellDef>expectedType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-dynamic-select\n *ngIf=\"getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"expectedTypeSelectConfig\"\n (selectionChange)=\"onExpectedTypeChange(i, $event.value)\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Expected Value Column -->\n <ng-container matColumnDef=\"expectedValue\">\n <th mat-header-cell *matHeaderCellDef>expectedValue</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <!-- String -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'string'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-input>\n\n <!-- Array / Object -->\n <cqa-custom-textarea\n *ngIf=\"getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [rows]=\"3\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-textarea>\n\n <!-- Null -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'null'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [disabled]=\"true\"\n [fullWidth]=\"true\">\n </cqa-custom-input>\n\n <!-- Number -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'number'\"\n [type]=\"'number'\"\n [placeholder]=\"'Expected Value in Number'\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-input>\n\n <!-- Boolean -->\n <cqa-dynamic-select\n *ngIf=\"getExpectedType(i) === 'boolean' && getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"booleanExpectedValueSelectConfig\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-button\n variant=\"text\"\n icon=\"delete\"\n [tooltip]=\"'Delete assertion'\"\n [iconColor]=\"'#EF4444'\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [attr.aria-label]=\"'Delete assertion'\"\n (clicked)=\"removeAssertion(i)\">\n </cqa-button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"getAssertionsFormArray().length === 0\" class=\"empty-state\">\n <p>No assertions added. Click \"Add Assertion\" to create one.</p>\n </div>\n </div>\n </form>\n </div>\n\n <div *ngIf=\"selectedTab === 'advanced'\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { kind: "component", type: i5.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { kind: "component", type: i6.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { kind: "component", type: i7.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "readonly", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { kind: "component", type: i8.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { kind: "component", type: i9.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }] });
|
|
947
1001
|
}
|
|
948
1002
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StepBuilderDatabaseComponent, decorators: [{
|
|
949
1003
|
type: Component,
|
|
950
|
-
args: [{ selector: "cqa-step-builder-database", host: { class: "cqa-ui-root" }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Update Database Test Step' : 'Create Database Test Step' }}\n </h2>\n\n <!-- Environment Section (separator line only on bottom) -->\n <div class=\"cqa-flex cqa-w-full cqa-justify-between cqa-gap-1.5 cqa-pb-[0.5rem] cqa-mb-4 cqa-border-0 cqa-border-b cqa-border-solid cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-gap-4 cqa-items-start\">\n <!-- DB Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n DB Environment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getDbEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Database environments from Environments.\n </p>\n </div>\n\n <!-- Normal Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n Normal Environment\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getNormalEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Normal environments from Environments.\n </p>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end cqa-mt-2\">\n <cqa-button variant=\"filled\" text=\"Run Query\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[24px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[37px] hover:!cqa-bg-[#1B1FEB] cqa-flex-shrink-0'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Main Content: Two Column Layout -->\n <div class=\"cqa-flex cqa-gap-[12px] cqa-flex-1 cqa-overflow-hidden cqa-mb-6\">\n <!-- Left Panel: Query List -->\n <div\n class=\"cqa-w-[175px] cqa-min-w-[175px] cqa-flex-shrink-0 cqa-flex cqa-flex-col cqa-border-0 cqa-border-r cqa-border-r-[1px] cqa-border-solid cqa-border-[#E0E0E0] cqa-bg-[#FAFAFA] cqa-overflow-hidden\">\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-p-2\">\n <div *ngFor=\"let query of queries; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-[10px] cqa-w-full cqa-pt-[14px] cqa-pb-[14px] cqa-pl-[16px] cqa-pr-[16px] cqa-rounded-[8px] cqa-cursor-pointer cqa-mb-1\"\n [class.cqa-bg-blue-50]=\"selectedQueryIndex === i\"\n [class.cqa-border]=\"selectedQueryIndex === i\"\n [class.cqa-border-blue-500]=\"selectedQueryIndex === i\"\n [class.cqa-bg-grey-400]=\"selectedQueryIndex !== i\"\n (click)=\"onSelectQuery(i)\"\n style=\"height: 49px; min-height: 49px;\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Query {{ i + 1 }}</span>\n <cqa-badge *ngIf=\"query.status\"\n [label]=\"query.status === 'passed' ? 'Passed' : query.status === 'failed' ? 'Failed' : 'Pending'\"\n [variant]=\"query.status === 'passed' ? 'success' : query.status === 'failed' ? 'error' : 'default'\"\n size=\"small\">\n </cqa-badge>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: Query Editor -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-overflow-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-gap-[10px] cqa-mb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px]\" style=\"width: 50%;\">\n <div class=\"\">\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900 cqa-text-[14px]\">Query & Store Response<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span></h3>\n </div>\n\n <div class=\"cqa-flex cqa-justify-between\">\n <!-- SQL Query Textarea -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0 cqa-w-full cqa-rounded-md cqa-bg-gray-50/50\">\n <cqa-custom-textarea [placeholder]=\"'Enter your SQL query here...'\"\n [value]=\"getCurrentQueryFormGroup()?.get('query')?.value || ''\" [fullWidth]=\"true\" [rows]=\"8\"\n [textareaInlineStyle]=\"'padding: 1rem;'\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('query')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-flex cqa-flex-col cqa-gap-[10px] cqa-mb-[8px]\">\n\n\n <!-- Variable Input -->\n <div class=\"cqa-flex cqa-gap-4\">\n <div class=\"cqa-flex-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5 cqa-block cqa-text-[14px] cqa-font-semibold\">\n Variable<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Variable name'\"\n [value]=\"getCurrentQueryFormGroup()?.get('variable')?.value || ''\" [fullWidth]=\"true\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('variable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Use letters, numbers, underscore. No spaces. Unique per step. Case sensitive.\n </p>\n </div>\n </div>\n <!-- Action Buttons (pinned to bottom) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mt-auto\">\n <cqa-button variant=\"outlined\" text=\"Add Query\" icon=\"add\" (clicked)=\"addNewQuery()\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#414146] cqa-text-sm cqa-font-semibold cqa-text-[#414146] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[10px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#414146] hover:cqa-bg-gray-50'\"\n [iconColor]=\"'#414146'\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [tooltip]=\"'Delete query'\" (clicked)=\"deleteQueryById(getCurrentQuery()?.id || '')\"\n [disabled]=\"queries.length <= 1\" [attr.aria-label]=\"'Delete query'\">\n <svg class=\"cqa-flex-shrink-0\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#6B7280\" />\n </svg>\n </cqa-button>\n <cqa-button variant=\"filled\" text=\"Run\" icon=\"play_arrow\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!getCurrentQueryFormGroup()?.get('query')?.value || !databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[16px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[38px] hover:!cqa-bg-[#1B1FEB] !cqa-border-none'\"\n [iconColor]=\"'#FBFCFF'\">\n </cqa-button>\n </div>\n </div>\n </div>\n <!-- Results Section -->\n <div class=\"cqa-flex cqa-flex-col cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-mb-6\">\n <!-- Tabs -->\n <div class=\"cqa-flex cqa-items-center cqa-border-b cqa-border-gray-200 cqa-bg-gray-50\">\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'output'\" [class.cqa-border-blue-600]=\"selectedTab === 'output'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'output'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'output'\" (click)=\"onTabChange('output')\">\n Output\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'verification'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'verification'\" (click)=\"onTabChange('verification')\">\n Verification\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'advanced'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'advanced'\" (click)=\"onTabChange('advanced')\">\n Advanced\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"cqa-p-4\">\n <!-- Output Tab -->\n <div *ngIf=\"selectedTab === 'output'\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-3\">\n <h4 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900\">Query Results</h4>\n <cqa-button variant=\"text\" text=\"Copy\" icon=\"content_copy\" [customClass]=\"'cqa-text-blue-600'\"\n (clicked)=\"onCopyResults()\">\n </cqa-button>\n </div>\n\n <!-- Results Table -->\n <div *ngIf=\"getCurrentQueryResult().length > 0\" class=\"cqa-overflow-x-auto\">\n <table class=\"cqa-w-full cqa-border-collapse\">\n <thead>\n <tr class=\"cqa-bg-gray-50 cqa-border-b cqa-border-gray-200\">\n <th *ngFor=\"let key of getTableColumns()\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-left cqa-text-xs cqa-font-semibold cqa-text-gray-700 cqa-uppercase\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of getCurrentQueryResult()\" class=\"cqa-border-b cqa-border-gray-200 hover:cqa-bg-gray-50\">\n <td *ngFor=\"let key of getTableColumns()\" class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-text-gray-900\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"getCurrentQueryResult().length === 0\"\n class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-sm\">\n No results yet. Run a query to see results.\n </div>\n </div>\n\n <!-- Verification Tab -->\n <div *ngIf=\"selectedTab === 'verification'\" class=\"assertions-container\">\n <!-- Header Section -->\n <div class=\"assertions-header\">\n <div class=\"header-content\">\n <h3 class=\"header-title\">Assertions</h3>\n <p class=\"header-subtitle\">Use JSONPath to target values in the query output.</p>\n </div>\n <button \n mat-stroked-button \n color=\"primary\" \n class=\"add-assertion-button\"\n (click)=\"addAssertion()\">\n <mat-icon>add</mat-icon>\n Add Assertion\n </button>\n </div>\n\n <!-- Table Section -->\n <form *ngIf=\"getCurrentAssertionsForm()\" [formGroup]=\"getCurrentAssertionsForm()!\" class=\"assertions-form\">\n <div formArrayName=\"assertions\">\n <div class=\"table-scroll-container\">\n <table mat-table [dataSource]=\"assertionsDataSource\" class=\"assertions-table\" #assertionsTable>\n <!-- JSONPath Column -->\n <ng-container matColumnDef=\"jsonPath\">\n <th mat-header-cell *matHeaderCellDef>jsonPath</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <input \n matInput \n formControlName=\"jsonPath\"\n placeholder=\"username\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'jsonPath')?.hasError('required') && \n getFormControlAt(i, 'jsonPath')?.touched\">\n JSONPath is required\n </mat-error>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Verification Type Column -->\n <ng-container matColumnDef=\"verificationType\">\n <th mat-header-cell *matHeaderCellDef>verificationType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <mat-select formControlName=\"verificationType\">\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"not_equals\">Not Equals</mat-option>\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"not_contains\">Not Contains</mat-option>\n <mat-option value=\"greater_than\">Greater Than</mat-option>\n <mat-option value=\"less_than\">Less Than</mat-option>\n <mat-option value=\"greater_than_or_equals\">Greater Than Or Equals</mat-option>\n <mat-option value=\"less_than_or_equals\">Less Than Or Equals</mat-option>\n <mat-option value=\"exists\">Exists</mat-option>\n <mat-option value=\"not_exists\">Not Exists</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Expected Type Column -->\n <ng-container matColumnDef=\"expectedType\">\n <th mat-header-cell *matHeaderCellDef>expectedType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <mat-form-field appearance=\"outline\" class=\"full-width-field\">\n <mat-select \n formControlName=\"expectedType\"\n (selectionChange)=\"onExpectedTypeChange(i, $event.value)\">\n <mat-option value=\"string\">String</mat-option>\n <mat-option value=\"number\">Number</mat-option>\n <mat-option value=\"boolean\">Boolean</mat-option>\n <mat-option value=\"object\">Object</mat-option>\n <mat-option value=\"array\">Array</mat-option>\n <mat-option value=\"null\">Null</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Expected Value Column -->\n <ng-container matColumnDef=\"expectedValue\">\n <th mat-header-cell *matHeaderCellDef>expectedValue</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <ng-container [formGroupName]=\"i\">\n <!-- String, Array, Object Input -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'string' || getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <textarea \n *ngIf=\"getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n rows=\"3\"\n required></textarea>\n <input \n *ngIf=\"getExpectedType(i) === 'string'\"\n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('invalidType')\">\n {{ getFormControlAt(i, 'expectedValue')?.errors?.message }}\n </mat-error>\n </mat-form-field>\n\n <!-- Null Type Display -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'null'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <input \n matInput \n formControlName=\"expectedValue\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [disabled]=\"true\">\n </mat-form-field>\n\n <!-- Number Input -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'number'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <input \n matInput \n type=\"number\"\n formControlName=\"expectedValue\"\n placeholder=\"Expected Value in Number\"\n required>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n </mat-form-field>\n\n <!-- Boolean Select -->\n <mat-form-field \n *ngIf=\"getExpectedType(i) === 'boolean'\"\n appearance=\"outline\" \n class=\"full-width-field\">\n <mat-select formControlName=\"expectedValue\" required>\n <mat-option value=\"true\">true</mat-option>\n <mat-option value=\"false\">false</mat-option>\n </mat-select>\n <mat-error *ngIf=\"getFormControlAt(i, 'expectedValue')?.hasError('required') && \n getFormControlAt(i, 'expectedValue')?.touched\">\n Expected value is required\n </mat-error>\n </mat-form-field>\n </ng-container>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <button \n mat-icon-button \n color=\"warn\"\n class=\"delete-button\"\n (click)=\"removeAssertion(i)\"\n [matTooltip]=\"'Delete assertion'\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"getAssertionsFormArray().length === 0\" class=\"empty-state\">\n <p>No assertions added. Click \"Add Assertion\" to create one.</p>\n </div>\n </div>\n </form>\n </div>\n\n <div *ngIf=\"selectedTab === 'advanced'\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>" }]
|
|
1004
|
+
args: [{ selector: "cqa-step-builder-database", host: { class: "cqa-ui-root" }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Update Database Test Step' : 'Create Database Test Step' }}\n </h2>\n\n <!-- Environment Section (separator line only on bottom) -->\n <div class=\"cqa-flex cqa-w-full cqa-justify-between cqa-gap-1.5 cqa-pb-[0.5rem] cqa-mb-4 cqa-border-0 cqa-border-b cqa-border-solid cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-gap-4 cqa-items-start\">\n <!-- DB Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n DB Environment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getDbEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Database environments from Environments.\n </p>\n </div>\n\n <!-- Normal Environment -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-block\">\n Normal Environment\n </label>\n <div class=\"cqa-min-w-0\">\n <cqa-dynamic-select [form]=\"databaseForm\" [config]=\"getNormalEnvironmentConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-gray-500\">\n Uses Normal environments from Environments.\n </p>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end cqa-mt-2\">\n <cqa-button variant=\"filled\" text=\"Run Query\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[24px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[37px] hover:!cqa-bg-[#1B1FEB] cqa-flex-shrink-0'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Main Content: Two Column Layout -->\n <div class=\"cqa-flex cqa-gap-[12px] cqa-flex-1 cqa-overflow-hidden cqa-mb-6\">\n <!-- Left Panel: Query List -->\n <div\n class=\"cqa-w-[175px] cqa-min-w-[175px] cqa-flex-shrink-0 cqa-flex cqa-flex-col cqa-border-0 cqa-border-r cqa-border-r-[1px] cqa-border-solid cqa-border-[#E0E0E0] cqa-bg-[#FAFAFA] cqa-overflow-hidden\">\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-p-2\">\n <div *ngFor=\"let query of queries; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-[10px] cqa-w-full cqa-pt-[14px] cqa-pb-[14px] cqa-pl-[16px] cqa-pr-[16px] cqa-rounded-[8px] cqa-cursor-pointer cqa-mb-1\"\n [class.cqa-bg-blue-50]=\"selectedQueryIndex === i\"\n [class.cqa-border]=\"selectedQueryIndex === i\"\n [class.cqa-border-blue-500]=\"selectedQueryIndex === i\"\n [class.cqa-bg-grey-400]=\"selectedQueryIndex !== i\"\n (click)=\"onSelectQuery(i)\"\n style=\"height: 49px; min-height: 49px;\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Query {{ i + 1 }}</span>\n <cqa-badge *ngIf=\"query.status\"\n [label]=\"query.status === 'passed' ? 'Passed' : query.status === 'failed' ? 'Failed' : 'Pending'\"\n [variant]=\"query.status === 'passed' ? 'success' : query.status === 'failed' ? 'error' : 'default'\"\n size=\"small\">\n </cqa-badge>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: Query Editor -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-overflow-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-gap-[10px] cqa-mb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px]\" style=\"width: 50%;\">\n <div class=\"\">\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900 cqa-text-[14px]\">Query & Store Response<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span></h3>\n </div>\n\n <div class=\"cqa-flex cqa-justify-between\">\n <!-- SQL Query Textarea -->\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0 cqa-w-full cqa-rounded-md cqa-bg-gray-50/50\">\n <cqa-custom-textarea [placeholder]=\"'Enter your SQL query here...'\"\n [value]=\"getCurrentQueryFormGroup()?.get('query')?.value || ''\" [fullWidth]=\"true\" [rows]=\"8\"\n [textareaInlineStyle]=\"'padding: 1rem;'\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('query')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-flex cqa-flex-col cqa-gap-[10px] cqa-mb-[8px]\">\n\n\n <!-- Variable Input -->\n <div class=\"cqa-flex cqa-gap-4\">\n <div class=\"cqa-flex-1\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5 cqa-block cqa-text-[14px] cqa-font-semibold\">\n Variable<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-custom-input [placeholder]=\"'Variable name'\"\n [value]=\"getCurrentQueryFormGroup()?.get('variable')?.value || ''\" [fullWidth]=\"true\"\n (valueChange)=\"getCurrentQueryFormGroup()?.get('variable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Use letters, numbers, underscore. No spaces. Unique per step. Case sensitive.\n </p>\n </div>\n </div>\n <!-- Action Buttons (pinned to bottom) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mt-auto\">\n <cqa-button variant=\"outlined\" text=\"Add Query\" icon=\"add\" (clicked)=\"addNewQuery()\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#414146] cqa-text-sm cqa-font-semibold cqa-text-[#414146] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[10px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#414146] hover:cqa-bg-gray-50'\"\n [iconColor]=\"'#414146'\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [tooltip]=\"'Delete query'\" (clicked)=\"deleteQueryById(getCurrentQuery()?.id || '')\"\n [disabled]=\"queries.length <= 1\" [attr.aria-label]=\"'Delete query'\">\n <svg class=\"cqa-flex-shrink-0\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#6B7280\" />\n </svg>\n </cqa-button>\n <cqa-button variant=\"filled\" text=\"Run\" icon=\"play_arrow\" (clicked)=\"onRunQuery()\"\n [disabled]=\"!getCurrentQueryFormGroup()?.get('query')?.value || !databaseForm.get('dbEnvironment')?.value || isLoading\"\n [customClass]=\"'!cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] cqa-text-sm cqa-font-semibold cqa-whitespace-nowrap !cqa-pt-[10px] !cqa-pb-[10px] !cqa-pl-[16px] !cqa-pr-[24px] !cqa-gap-[8px] cqa-rounded-lg cqa-min-h-[38px] hover:!cqa-bg-[#1B1FEB] !cqa-border-none'\"\n [iconColor]=\"'#FBFCFF'\">\n </cqa-button>\n </div>\n </div>\n </div>\n <!-- Results Section -->\n <div class=\"cqa-flex cqa-flex-col cqa-border cqa-border-gray-200 cqa-rounded-lg cqa-mb-6\">\n <!-- Tabs -->\n <div class=\"cqa-flex cqa-items-center cqa-border-b cqa-border-gray-200 cqa-bg-gray-50\">\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'output'\" [class.cqa-border-blue-600]=\"selectedTab === 'output'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'output'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'output'\" (click)=\"onTabChange('output')\">\n Output\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'verification'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'verification'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'verification'\" (click)=\"onTabChange('verification')\">\n Verification\n </button>\n <button type=\"button\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-font-medium cqa-transition-colors cqa-border-b-2\"\n [class.cqa-text-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-border-blue-600]=\"selectedTab === 'advanced'\"\n [class.cqa-text-gray-600]=\"selectedTab !== 'advanced'\"\n [class.cqa-border-transparent]=\"selectedTab !== 'advanced'\" (click)=\"onTabChange('advanced')\">\n Advanced\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"cqa-p-4\">\n <!-- Output Tab -->\n <div *ngIf=\"selectedTab === 'output'\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-3\">\n <h4 class=\"cqa-text-sm cqa-font-semibold cqa-text-gray-900\">Query Results</h4>\n <cqa-button variant=\"text\" text=\"Copy\" icon=\"content_copy\" [customClass]=\"'cqa-text-blue-600'\"\n (clicked)=\"onCopyResults()\">\n </cqa-button>\n </div>\n\n <!-- Results Table -->\n <div *ngIf=\"getCurrentQueryResult().length > 0\" class=\"cqa-overflow-x-auto\">\n <table class=\"cqa-w-full cqa-border-collapse\">\n <thead>\n <tr class=\"cqa-bg-gray-50 cqa-border-b cqa-border-gray-200\">\n <th *ngFor=\"let key of getTableColumns()\"\n class=\"cqa-px-4 cqa-py-2 cqa-text-left cqa-text-xs cqa-font-semibold cqa-text-gray-700 cqa-uppercase\">\n {{ key }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of getCurrentQueryResult()\" class=\"cqa-border-b cqa-border-gray-200 hover:cqa-bg-gray-50\">\n <td *ngFor=\"let key of getTableColumns()\" class=\"cqa-px-4 cqa-py-2 cqa-text-sm cqa-text-gray-900\">\n {{ row[key] }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"getCurrentQueryResult().length === 0\"\n class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-sm\">\n No results yet. Run a query to see results.\n </div>\n </div>\n\n <!-- Verification Tab -->\n <div *ngIf=\"selectedTab === 'verification'\" class=\"assertions-container\">\n <!-- Header Section -->\n <div class=\"assertions-header\">\n <div class=\"header-content\">\n <h3 class=\"header-title\">Assertions</h3>\n <p class=\"header-subtitle\">Use JSONPath to target values in the query output.</p>\n </div>\n <cqa-button\n variant=\"outlined\"\n text=\"Add Assertion\"\n icon=\"add\"\n class=\"add-assertion-button\"\n [customClass]=\"'cqa-bg-white !cqa-border-[#3F43EE] cqa-text-sm cqa-font-semibold !cqa-text-[#3F43EE] cqa-whitespace-nowrap !cqa-py-[10px] !cqa-px-[16px] !cqa-gap-[8px] cqa-rounded-lg hover:!cqa-border-[#1B1FEB] hover:!cqa-text-[#1B1FEB] hover:cqa-bg-[#F5F5FF]'\"\n [iconColor]=\"'#3F43EE'\"\n (clicked)=\"addAssertion()\">\n </cqa-button>\n </div>\n\n <!-- Table Section -->\n <form *ngIf=\"getCurrentAssertionsForm()\" [formGroup]=\"getCurrentAssertionsForm()!\" class=\"assertions-form\">\n <div formArrayName=\"assertions\">\n <div class=\"table-scroll-container\">\n <table mat-table [dataSource]=\"assertionsDataSource\" class=\"assertions-table\" #assertionsTable>\n <!-- JSONPath Column -->\n <ng-container matColumnDef=\"jsonPath\">\n <th mat-header-cell *matHeaderCellDef>jsonPath</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-custom-input\n [placeholder]=\"'username'\"\n [value]=\"getFormControlAt(i, 'jsonPath')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'jsonPath')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'jsonPath')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'jsonPath')?.markAsTouched()\">\n </cqa-custom-input>\n </td>\n </ng-container>\n\n <!-- Verification Type Column -->\n <ng-container matColumnDef=\"verificationType\">\n <th mat-header-cell *matHeaderCellDef>verificationType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-dynamic-select\n *ngIf=\"getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"verificationTypeSelectConfig\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Expected Type Column -->\n <ng-container matColumnDef=\"expectedType\">\n <th mat-header-cell *matHeaderCellDef>expectedType</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-dynamic-select\n *ngIf=\"getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"expectedTypeSelectConfig\"\n (selectionChange)=\"onExpectedTypeChange(i, $event.value)\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Expected Value Column -->\n <ng-container matColumnDef=\"expectedValue\">\n <th mat-header-cell *matHeaderCellDef>expectedValue</th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <!-- String -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'string'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-input>\n\n <!-- Array / Object -->\n <cqa-custom-textarea\n *ngIf=\"getExpectedType(i) === 'array' || getExpectedType(i) === 'object'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [rows]=\"3\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-textarea>\n\n <!-- Null -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'null'\"\n [placeholder]=\"getExpectedValuePlaceholder(i)\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [disabled]=\"true\"\n [fullWidth]=\"true\">\n </cqa-custom-input>\n\n <!-- Number -->\n <cqa-custom-input\n *ngIf=\"getExpectedType(i) === 'number'\"\n [type]=\"'number'\"\n [placeholder]=\"'Expected Value in Number'\"\n [value]=\"getFormControlAt(i, 'expectedValue')?.value || ''\"\n [errors]=\"getAssertionFieldErrors(i, 'expectedValue')\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"getFormControlAt(i, 'expectedValue')?.setValue($event)\"\n (blurred)=\"getFormControlAt(i, 'expectedValue')?.markAsTouched()\">\n </cqa-custom-input>\n\n <!-- Boolean -->\n <cqa-dynamic-select\n *ngIf=\"getExpectedType(i) === 'boolean' && getAssertionFormGroupAt(i) as rowForm\"\n [form]=\"rowForm\"\n [config]=\"booleanExpectedValueSelectConfig\">\n </cqa-dynamic-select>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let assertion; let i = index\">\n <cqa-button\n variant=\"text\"\n icon=\"delete\"\n [tooltip]=\"'Delete assertion'\"\n [iconColor]=\"'#EF4444'\"\n [customClass]=\"'cqa-min-w-[40px] cqa-w-10 cqa-h-9 cqa-rounded cqa-bg-gray-100 cqa-flex cqa-items-center cqa-justify-center hover:cqa-bg-gray-200 cqa-p-0'\"\n [attr.aria-label]=\"'Delete assertion'\"\n (clicked)=\"removeAssertion(i)\">\n </cqa-button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"getAssertionsFormArray().length === 0\" class=\"empty-state\">\n <p>No assertions added. Click \"Add Assertion\" to create one.</p>\n </div>\n </div>\n </form>\n </div>\n\n <div *ngIf=\"selectedTab === 'advanced'\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>" }]
|
|
951
1005
|
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { dbEnvironmentOptions: [{
|
|
952
1006
|
type: Input
|
|
953
1007
|
}], normalEnvironmentOptions: [{
|
|
@@ -992,4 +1046,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
992
1046
|
}], advancedSettingsVariables: [{
|
|
993
1047
|
type: Input
|
|
994
1048
|
}] } });
|
|
995
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWRhdGFiYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1kYXRhYmFzZS9zdGVwLWJ1aWxkZXItZGF0YWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWRhdGFiYXNlL3N0ZXAtYnVpbGRlci1kYXRhYmFzZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixVQUFVLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0J4QixNQUFNLE9BQU8sNEJBQTRCO0lBNEZuQjtJQUFnQztJQXpGcEQsMENBQTBDO0lBQ2pDLG9CQUFvQixHQUFtQixFQUFFLENBQUM7SUFFbkQsOENBQThDO0lBQ3JDLHdCQUF3QixHQUFtQixFQUFFLENBQUM7SUFFdkQsMkJBQTJCO0lBQ2xCLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBRXZDLHdFQUF3RTtJQUMvRCxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBRWxDLG9CQUFvQjtJQUNYLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFcEMsMkNBQTJDO0lBQ2xDLG9CQUFvQixDQUFVO0lBRXZDLCtDQUErQztJQUN0Qyx3QkFBd0IsQ0FBVTtJQUUzQywyQkFBMkI7SUFDbEIsUUFBUSxDQUFXO0lBRTVCLHlHQUF5RztJQUNoRyxjQUFjLEdBQVksS0FBSyxDQUFDO0lBRXpDLGdDQUFnQztJQUN0QixVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7SUFFNUQsMEJB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QUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO3dHQWhpQ1UsNEJBQTRCOzRGQUE1Qiw0QkFBNEIsOCtCQ2xEekMsNnh2QkF1YU07OzRGRHJYTyw0QkFBNEI7a0JBTnhDLFNBQVM7K0JBQ0UsMkJBQTJCLFFBRy9CLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTt1SEFNckIsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNO2dCQVNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFNRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFtQnVCLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUduQix5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgRm9ybUNvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbCxcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSBcIi4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VRdWVyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHZhcmlhYmxlOiBzdHJpbmc7XG4gIHN0YXR1cz86IFwicGFzc2VkXCIgfCBcImZhaWxlZFwiIHwgXCJwZW5kaW5nXCI7XG4gIGFzc2VydGlvbkRhdGE/OiBhbnlbXTsgLy8gQXNzZXJ0aW9uIGRhdGEgZm9yIHZlcmlmaWNhdGlvblxuICAvKiogUmVzdWx0IHJvd3MgZm9yIHRoaXMgcXVlcnkgKHNob3duIGluIE91dHB1dCB0YWIpLiAqL1xuICBxdWVyeVJlc3VsdD86IGFueVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlRm9ybURhdGEge1xuICBkYkVudmlyb25tZW50OiBzdHJpbmc7XG4gIG5vcm1hbEVudmlyb25tZW50Pzogc3RyaW5nO1xuICBxdWVyaWVzOiBEYXRhYmFzZVF1ZXJ5W107XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNxYS1zdGVwLWJ1aWxkZXItZGF0YWJhc2VcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9zdGVwLWJ1aWxkZXItZGF0YWJhc2UuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogXCJjcWEtdWktcm9vdFwiIH0sXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyRGF0YWJhc2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gIC8qKiBPcHRpb25zIGZvciBEQiBlbnZpcm9ubWVudCBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkYkVudmlyb25tZW50T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogT3B0aW9ucyBmb3IgTm9ybWFsIGVudmlyb25tZW50IGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIG5vcm1hbEVudmlyb25tZW50T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5pdGlhbCBxdWVyaWVzIGxpc3QgKi9cbiAgQElucHV0KCkgcXVlcmllczogRGF0YWJhc2VRdWVyeVtdID0gW107XG5cbiAgLyoqIFF1ZXJ5IHJlc3VsdHMgZGF0YSAoZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBwZXItcXVlcnkgcXVlcnlSZXN1bHQpICovXG4gIEBJbnB1dCgpIHF1ZXJ5UmVzdWx0czogYW55W10gPSBbXTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSW5pdGlhbCBEQiBlbnZpcm9ubWVudCBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxEYkVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsIE5vcm1hbCBlbnZpcm9ubWVudCBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxOb3JtYWxFbnZpcm9ubWVudD86IHN0cmluZztcblxuICAvKiogV2hldGhlciBpbiBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhYmFzZUZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBxdWVyeSBpcyBydW4gKi9cbiAgQE91dHB1dCgpIHJ1blF1ZXJ5ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgY3VycmVudFF1ZXJ5OiBEYXRhYmFzZVF1ZXJ5O1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgdmFyaWFibGU6IHN0cmluZztcbiAgICBkYkVudmlyb25tZW50OiBzdHJpbmc7XG4gICAgbm9ybWFsRW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIH0+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBEQiBlbnZpcm9ubWVudCBzZWFyY2ggaXMgdHJpZ2dlcmVkICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYkVudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBOb3JtYWwgZW52aXJvbm1lbnQgc2VhcmNoIGlzIHRyaWdnZXJlZCAqL1xuICBAT3V0cHV0KCkgc2VhcmNoTm9ybWFsRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHF1ZXJ5IGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBhZGRRdWVyeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIHF1ZXJ5IGlzIGRlbGV0ZWQgKi9cbiAgQE91dHB1dCgpIGRlbGV0ZVF1ZXJ5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBhc3NlcnRpb24gZGF0YSBjaGFuZ2VzIGZvciBhIHF1ZXJ5ICovXG4gIEBPdXRwdXQoKSBhc3NlcnRpb25EYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgcXVlcnlJbmRleDogbnVtYmVyO1xuICAgIGFzc2VydGlvbkRhdGE6IGFueVtdO1xuICB9PigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gc2VsZWN0ZWQgcXVlcnkgaW5kZXggY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRRdWVyeUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBhY3RpdmUgdGFiIGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIGFjdGl2ZVRhYkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgXCJvdXRwdXRcIiB8IFwidmVyaWZpY2F0aW9uXCIgfCBcImFkdmFuY2VkXCJcbiAgPigpO1xuXG4gIGRhdGFiYXNlRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgc2VsZWN0ZWRUYWI6IFwib3V0cHV0XCIgfCBcInZlcmlmaWNhdGlvblwiIHwgXCJhZHZhbmNlZFwiID0gXCJvdXRwdXRcIjtcbiAgc2VsZWN0ZWRRdWVyeUluZGV4OiBudW1iZXIgPSAwO1xuXG4gIC8vIEFzc2VydGlvbnMgZm9ybSBtYW5hZ2VtZW50IC0gb25lIGZvcm0gcGVyIHF1ZXJ5XG4gIGFzc2VydGlvbnNGb3JtczogTWFwPG51bWJlciwgVW50eXBlZEZvcm1Hcm91cD4gPSBuZXcgTWFwKCk7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgIFwianNvblBhdGhcIixcbiAgICBcInZlcmlmaWNhdGlvblR5cGVcIixcbiAgICBcImV4cGVjdGVkVHlwZVwiLFxuICAgIFwiZXhwZWN0ZWRWYWx1ZVwiLFxuICAgIFwiYWN0aW9uc1wiLFxuICBdO1xuICBkZWZhdWx0RXhwZWN0ZWRUeXBlID0gXCJzdHJpbmdcIjtcbiAgcHJpdmF0ZSBmb3JtU3Vic2NyaXB0aW9uczogTWFwPG51bWJlciwgU3Vic2NyaXB0aW9uPiA9IG5ldyBNYXAoKTtcbiAgQFZpZXdDaGlsZChcImFzc2VydGlvbnNUYWJsZVwiKSBhc3NlcnRpb25zVGFibGU/OiBNYXRUYWJsZTxhbnk+O1xuXG4gIC8vIEFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyAoZ2VuZXJpYyBwZXIgc3RlcCwgY2FuIGJlIHByb3ZpZGVkIGJ5IHBhcmVudClcbiAgQElucHV0KCkgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBVbnR5cGVkRm9ybUFycmF5ID0gbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5kYXRhYmFzZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGRiRW52aXJvbm1lbnQ6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG5vcm1hbEVudmlyb25tZW50OiBbXCJcIl0sXG4gICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1XaXRoSW5pdGlhbFZhbHVlcygpO1xuICAgIC8vIElmIHBhcmVudCBwcm92aWRlZCBhZHZhbmNlZCBzZXR0aW5ncywgYnVpbGQgZnJvbSB0aGVtOyBvdGhlcndpc2UgaW5pdGlhbGl6ZSBkZWZhdWx0c1xuICAgIGlmIChcbiAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyAmJlxuICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0aWFsaXplQWR2YW5jZWRTZXR0aW5ncygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInF1ZXJpZXNcIl0gJiYgIWNoYW5nZXNbXCJxdWVyaWVzXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAvLyBSZWJ1aWxkIGZvcm0gYXJyYXkgd2hlbiBxdWVyaWVzIGNoYW5nZVxuICAgICAgY29uc3QgcXVlcmllc0FycmF5ID0gdGhpcy5kYXRhYmFzZUZvcm0uZ2V0KFwicXVlcmllc1wiKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgd2hpbGUgKHF1ZXJpZXNBcnJheS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcXVlcmllc0FycmF5LnJlbW92ZUF0KDApO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYXIgb2xkIGFzc2VydGlvbnMgZm9ybXNcbiAgICAgIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmZvckVhY2goKGZvcm0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmdldChpbmRleCkhLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hc3NlcnRpb25zRm9ybXMuY2xlYXIoKTtcbiAgICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblxuICAgICAgLy8gUmVidWlsZCBxdWVyaWVzIGFuZCBhc3NlcnRpb25zIGZvcm1zXG4gICAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocXVlcnksIGluZGV4KSA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSBhc3NlcnRpb24gZGF0YSBpcyBpbml0aWFsaXplZFxuICAgICAgICBpZiAoIXF1ZXJ5LmFzc2VydGlvbkRhdGEpIHtcbiAgICAgICAgICBxdWVyeS5hc3NlcnRpb25EYXRhID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRRdWVyeVRvRm9ybShxdWVyeSk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgYXNzZXJ0aW9ucyBmb3JtIGZvciBlYWNoIHF1ZXJ5XG4gICAgICAgIHRoaXMuZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKGluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbnN1cmUgc2VsZWN0ZWQgcXVlcnkgaW5kZXggaXMgdmFsaWRcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA+PSB0aGlzLnF1ZXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID0gTWF0aC5tYXgoMCwgdGhpcy5xdWVyaWVzLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiaW5pdGlhbERiRW52aXJvbm1lbnRcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJpbml0aWFsRGJFbnZpcm9ubWVudFwiXS5jdXJyZW50VmFsdWVcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBkYkVudmlyb25tZW50OiBjaGFuZ2VzW1wiaW5pdGlhbERiRW52aXJvbm1lbnRcIl0uY3VycmVudFZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJpbml0aWFsTm9ybWFsRW52aXJvbm1lbnRcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJpbml0aWFsTm9ybWFsRW52aXJvbm1lbnRcIl0uY3VycmVudFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGFiYXNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgbm9ybWFsRW52aXJvbm1lbnQ6IGNoYW5nZXNbXCJpbml0aWFsTm9ybWFsRW52aXJvbm1lbnRcIl0uY3VycmVudFZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBwYXJlbnQgdXBkYXRlcyBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLCByZWJ1aWxkIGFkdmFuY2VkIGZvcm1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXSAmJlxuICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQWR2YW5jZWRTZXR0aW5ncygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm1XaXRoSW5pdGlhbFZhbHVlcygpOiB2b2lkIHtcbiAgICAvLyBTZXQgaW5pdGlhbCBEQiBlbnZpcm9ubWVudCBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLmluaXRpYWxEYkVudmlyb25tZW50KSB7XG4gICAgICB0aGlzLmRhdGFiYXNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgZGJFbnZpcm9ubWVudDogdGhpcy5pbml0aWFsRGJFbnZpcm9ubWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTZXQgaW5pdGlhbCBOb3JtYWwgZW52aXJvbm1lbnQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5pbml0aWFsTm9ybWFsRW52aXJvbm1lbnQpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBub3JtYWxFbnZpcm9ubWVudDogdGhpcy5pbml0aWFsTm9ybWFsRW52aXJvbm1lbnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHdpdGggcXVlcmllcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGFkZCBkZWZhdWx0IHF1ZXJ5XG4gICAgaWYgKHRoaXMucXVlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkTmV3UXVlcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHF1ZXJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBFbnN1cmUgYXNzZXJ0aW9uIGRhdGEgaXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgaWYgKCFxdWVyeS5hc3NlcnRpb25EYXRhKSB7XG4gICAgICAgICAgcXVlcnkuYXNzZXJ0aW9uRGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkUXVlcnlUb0Zvcm0ocXVlcnkpO1xuICAgICAgICAvLyBJbml0aWFsaXplIGFzc2VydGlvbnMgZm9ybSBmb3IgZWFjaCBxdWVyeVxuICAgICAgICB0aGlzLmVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZChpbmRleCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID0gMDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleENoYW5nZS5lbWl0KDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgcXVlcmllc0Zvcm1BcnJheSgpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUZvcm0uZ2V0KFwicXVlcmllc1wiKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgYWRkTmV3UXVlcnkoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3UXVlcnk6IERhdGFiYXNlUXVlcnkgPSB7XG4gICAgICBpZDogYHF1ZXJ5XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgcXVlcnk6IFwiXCIsXG4gICAgICB2YXJpYWJsZTogXCJcIixcbiAgICAgIHN0YXR1czogXCJwZW5kaW5nXCIsXG4gICAgICBhc3NlcnRpb25EYXRhOiBbXSwgLy8gSW5pdGlhbGl6ZSB3aXRoIGVtcHR5IGFzc2VydGlvbiBkYXRhXG4gICAgfTtcbiAgICB0aGlzLnF1ZXJpZXMucHVzaChuZXdRdWVyeSk7XG4gICAgdGhpcy5hZGRRdWVyeVRvRm9ybShuZXdRdWVyeSk7XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLnF1ZXJpZXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA9IG5ld0luZGV4O1xuICAgIC8vIEluaXRpYWxpemUgYXNzZXJ0aW9ucyBmb3JtIGZvciB0aGUgbmV3IHF1ZXJ5XG4gICAgdGhpcy5lbnN1cmVBc3NlcnRpb25EYXRhSW5pdGlhbGl6ZWQobmV3SW5kZXgpO1xuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXgpO1xuICAgIHRoaXMuYWRkUXVlcnkuZW1pdCgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUXVlcnlUb0Zvcm0ocXVlcnk6IERhdGFiYXNlUXVlcnkpOiB2b2lkIHtcbiAgICBjb25zdCBxdWVyeUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBpZDogW3F1ZXJ5LmlkXSxcbiAgICAgIHF1ZXJ5OiBbcXVlcnkucXVlcnksIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFyaWFibGU6IFtxdWVyeS52YXJpYWJsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgfSk7XG4gICAgdGhpcy5xdWVyaWVzRm9ybUFycmF5LnB1c2gocXVlcnlHcm91cCk7XG4gIH1cblxuICBkZWxldGVRdWVyeUJ5SWQocXVlcnlJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnF1ZXJpZXMuZmluZEluZGV4KChxKSA9PiBxLmlkID09PSBxdWVyeUlkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAvLyBDbGVhbiB1cCBhc3NlcnRpb25zIGZvcm0gYW5kIHN1YnNjcmlwdGlvbiBmb3IgdGhpcyBxdWVyeVxuICAgICAgaWYgKHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMuaGFzKGluZGV4KSkge1xuICAgICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmdldChpbmRleCkhLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMuZGVsZXRlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmRlbGV0ZShpbmRleCk7XG5cbiAgICAgIC8vIFJlaW5kZXggcmVtYWluaW5nIGZvcm1zIGFuZCBzdWJzY3JpcHRpb25zXG4gICAgICBjb25zdCBmb3Jtc1RvUmVpbmRleCA9IG5ldyBNYXA8bnVtYmVyLCBVbnR5cGVkRm9ybUdyb3VwPigpO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uc1RvUmVpbmRleCA9IG5ldyBNYXA8bnVtYmVyLCBTdWJzY3JpcHRpb24+KCk7XG5cbiAgICAgIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmZvckVhY2goKGZvcm0sIG9sZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChvbGRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgICAgZm9ybXNUb1JlaW5kZXguc2V0KG9sZEluZGV4IC0gMSwgZm9ybSk7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPCBpbmRleCkge1xuICAgICAgICAgIGZvcm1zVG9SZWluZGV4LnNldChvbGRJbmRleCwgZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmZvckVhY2goKHN1Yiwgb2xkSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKG9sZEluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zVG9SZWluZGV4LnNldChvbGRJbmRleCAtIDEsIHN1Yik7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPCBpbmRleCkge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbnNUb1JlaW5kZXguc2V0KG9sZEluZGV4LCBzdWIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hc3NlcnRpb25zRm9ybXMgPSBmb3Jtc1RvUmVpbmRleDtcbiAgICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zVG9SZWluZGV4O1xuXG4gICAgICB0aGlzLnF1ZXJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMucXVlcmllc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXggPj0gdGhpcy5xdWVyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA9IE1hdGgubWF4KDAsIHRoaXMucXVlcmllcy5sZW5ndGggLSAxKTtcbiAgICAgICAgLy8gRW5zdXJlIGFzc2VydGlvbnMgZm9ybSBpcyBpbml0aWFsaXplZCBmb3IgdGhlIG5ldyBzZWxlY3RlZCBxdWVyeVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXggPj0gMCkge1xuICAgICAgICAgIHRoaXMuZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGVRdWVyeS5lbWl0KHF1ZXJ5SWQpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGdldERiRW52aXJvbm1lbnRDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBcImRiRW52aXJvbm1lbnRcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBcIlNlbGVjdCBEQiBlbnZpcm9ubWVudFwiLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGJFbnZpcm9ubWVudE9wdGlvbnMsXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hEYkVudmlyb25tZW50LmVtaXQocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0Tm9ybWFsRW52aXJvbm1lbnRDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBcIm5vcm1hbEVudmlyb25tZW50XCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJTZWxlY3QgTm9ybWFsIGVudmlyb25tZW50XCIsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogdGhpcy5ub3JtYWxFbnZpcm9ubWVudE9wdGlvbnMsXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hOb3JtYWxFbnZpcm9ubWVudC5lbWl0KHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEN1cnJlbnRRdWVyeSgpOiBEYXRhYmFzZVF1ZXJ5IHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5xdWVyaWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID49IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4IDwgdGhpcy5xdWVyaWVzLmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcmllc1t0aGlzLnNlbGVjdGVkUXVlcnlJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk6IFVudHlwZWRGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID49IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4IDwgdGhpcy5xdWVyaWVzRm9ybUFycmF5Lmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcmllc0Zvcm1BcnJheS5hdChcbiAgICAgICAgdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXhcbiAgICAgICkgYXMgVW50eXBlZEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvblJ1blF1ZXJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IGRiRW52aXJvbm1lbnQgPSB0aGlzLmRhdGFiYXNlRm9ybS5nZXQoXCJkYkVudmlyb25tZW50XCIpPy52YWx1ZTtcbiAgICBjb25zdCBub3JtYWxFbnZpcm9ubWVudCA9IHRoaXMuZGF0YWJhc2VGb3JtLmdldChcIm5vcm1hbEVudmlyb25tZW50XCIpPy52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50UXVlcnkgPSB0aGlzLmdldEN1cnJlbnRRdWVyeSgpO1xuICAgIGNvbnN0IHF1ZXJ5Rm9ybUdyb3VwID0gdGhpcy5nZXRDdXJyZW50UXVlcnlGb3JtR3JvdXAoKTtcblxuICAgIGlmIChjdXJyZW50UXVlcnkgJiYgcXVlcnlGb3JtR3JvdXAgJiYgZGJFbnZpcm9ubWVudCkge1xuICAgICAgY29uc3QgcXVlcnkgPSBxdWVyeUZvcm1Hcm91cC5nZXQoXCJxdWVyeVwiKT8udmFsdWUgfHwgXCJcIjtcbiAgICAgIGNvbnN0IHZhcmlhYmxlID0gcXVlcnlGb3JtR3JvdXAuZ2V0KFwidmFyaWFibGVcIik/LnZhbHVlIHx8IFwiXCI7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcXVlcnkgb2JqZWN0XG4gICAgICBjdXJyZW50UXVlcnkucXVlcnkgPSBxdWVyeTtcbiAgICAgIGN1cnJlbnRRdWVyeS52YXJpYWJsZSA9IHZhcmlhYmxlO1xuXG4gICAgICB0aGlzLnJ1blF1ZXJ5LmVtaXQoe1xuICAgICAgICBjdXJyZW50UXVlcnksXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgZGJFbnZpcm9ubWVudCxcbiAgICAgICAgbm9ybWFsRW52aXJvbm1lbnQ6IG5vcm1hbEVudmlyb25tZW50IHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0UXVlcnkoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEVuc3VyZSBhc3NlcnRpb24gZGF0YSBpcyBpbml0aWFsaXplZCBmb3IgdGhlIHNlbGVjdGVkIHF1ZXJ5XG4gICAgdGhpcy5lbnN1cmVBc3NlcnRpb25EYXRhSW5pdGlhbGl6ZWQoaW5kZXgpO1xuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXhDaGFuZ2UuZW1pdChpbmRleCk7XG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIGVuc3VyZSBhc3NlcnRpb25zIGZvcm0gaXMgZGlzcGxheWVkXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXJ5IGluZGV4XG4gICAqL1xuICBnZXRTZWxlY3RlZFF1ZXJ5SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYlxuICAgKi9cbiAgZ2V0QWN0aXZlVGFiKCk6IFwib3V0cHV0XCIgfCBcInZlcmlmaWNhdGlvblwiIHwgXCJhZHZhbmNlZFwiIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYjtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogXCJvdXRwdXRcIiB8IFwidmVyaWZpY2F0aW9uXCIgfCBcImFkdmFuY2VkXCIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiO1xuICAgIHRoaXMuYWN0aXZlVGFiQ2hhbmdlLmVtaXQodGFiKTtcbiAgICAvLyBFbnN1cmUgYXNzZXJ0aW9ucyBmb3JtIGlzIGluaXRpYWxpemVkIHdoZW4gc3dpdGNoaW5nIHRvIHZlcmlmaWNhdGlvbiB0YWJcbiAgICBpZiAodGFiID09PSBcInZlcmlmaWNhdGlvblwiKSB7XG4gICAgICB0aGlzLmVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZCh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgb25Db3B5UmVzdWx0cygpOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRDdXJyZW50UXVlcnlSZXN1bHQoKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRleHQgPSBKU09OLnN0cmluZ2lmeShyb3dzLCBudWxsLCAyKTtcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBDb3VsZCBlbWl0IGFuIGV2ZW50IG9yIHNob3cgYSB0b2FzdCBub3RpZmljYXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIGlzRm9ybVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIG1haW4gZm9ybSBpcyB2YWxpZCAoZGJFbnZpcm9ubWVudCBpcyByZXF1aXJlZClcbiAgICBpZiAoIXRoaXMuZGF0YWJhc2VGb3JtLnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhdCBsZWFzdCBvbmUgcXVlcnlcbiAgICBpZiAodGhpcy5xdWVyaWVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHF1ZXJpZXMgaGF2ZSB2YWxpZCBxdWVyeSBhbmQgdmFyaWFibGUgZmllbGRzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHF1ZXJ5Rm9ybUdyb3VwID0gdGhpcy5xdWVyaWVzRm9ybUFycmF5LmF0KGkpIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICBpZiAoIXF1ZXJ5Rm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmRhdGFiYXNlRm9ybS52YWx1ZTtcblxuICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSBiZWZvcmUgZW1pdHRpbmdcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChcbiAgICAgICAgaW5kZXhcbiAgICAgICkgYXMgVW50eXBlZEZvcm1Hcm91cDtcbiAgICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoXCJ2YWx1ZVwiKT8udmFsdWU7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlQ29udHJvbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0ZXBEYXRhOiBEYXRhYmFzZUZvcm1EYXRhID0ge1xuICAgICAgZGJFbnZpcm9ubWVudDogZm9ybVZhbHVlLmRiRW52aXJvbm1lbnQsXG4gICAgICBub3JtYWxFbnZpcm9ubWVudDogZm9ybVZhbHVlLm5vcm1hbEVudmlyb25tZW50IHx8IHVuZGVmaW5lZCxcbiAgICAgIHF1ZXJpZXM6IHRoaXMucXVlcmllcy5tYXAoKHF1ZXJ5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeUZvcm1Hcm91cCA9IHRoaXMucXVlcmllc0Zvcm1BcnJheS5hdChcbiAgICAgICAgICBpbmRleFxuICAgICAgICApIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IHF1ZXJ5LmlkLFxuICAgICAgICAgIHF1ZXJ5OiBxdWVyeUZvcm1Hcm91cC5nZXQoXCJxdWVyeVwiKT8udmFsdWUgfHwgXCJcIixcbiAgICAgICAgICB2YXJpYWJsZTogcXVlcnlGb3JtR3JvdXAuZ2V0KFwidmFyaWFibGVcIik/LnZhbHVlIHx8IFwiXCIsXG4gICAgICAgICAgc3RhdHVzOiBxdWVyeS5zdGF0dXMsXG4gICAgICAgICAgYXNzZXJ0aW9uRGF0YTogcXVlcnkuYXNzZXJ0aW9uRGF0YSB8fCBbXSwgLy8gSW5jbHVkZSBhc3NlcnRpb24gZGF0YVxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdldEN1cnJlbnRRdWVyeVJlc3VsdCgpO1xuICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocm93c1swXSk7XG4gIH1cblxuICAvKiogR2V0IHJlc3VsdCByb3dzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgcXVlcnkuICovXG4gIGdldEN1cnJlbnRRdWVyeVJlc3VsdCgpOiBhbnlbXSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucXVlcmllc1t0aGlzLnNlbGVjdGVkUXVlcnlJbmRleF07XG4gICAgaWYgKFxuICAgICAgY3VycmVudCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50LnF1ZXJ5UmVzdWx0KSAmJlxuICAgICAgY3VycmVudC5xdWVyeVJlc3VsdC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3VycmVudC5xdWVyeVJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhc3NlcnRpb24gZGF0YSBmb3IgYSBzcGVjaWZpYyBxdWVyeVxuICAgKi9cbiAgZ2V0QXNzZXJ0aW9uRGF0YUZvclF1ZXJ5KHF1ZXJ5SW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcmllc1txdWVyeUluZGV4XTtcbiAgICBpZiAocXVlcnkgJiYgcXVlcnkuYXNzZXJ0aW9uRGF0YSkge1xuICAgICAgcmV0dXJuIHF1ZXJ5LmFzc2VydGlvbkRhdGE7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYXNzZXJ0aW9uIGRhdGEgY2hhbmdlIGZyb20gZXh0ZXJuYWwgY29tcG9uZW50XG4gICAqL1xuICBvbkFzc2VydGlvbkRhdGFDaGFuZ2UoYXNzZXJ0aW9uRGF0YTogYW55W10sIHF1ZXJ5SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0pIHtcbiAgICAgIC8vIENyZWF0ZSBhIGRlZXAgY29weSB0byBlbnN1cmUgZWFjaCBxdWVyeSBoYXMgaXRzIG93biBkYXRhXG4gICAgICBpZiAoYXNzZXJ0aW9uRGF0YSAmJiBhc3NlcnRpb25EYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdLmFzc2VydGlvbkRhdGEgPSBhc3NlcnRpb25EYXRhLm1hcChcbiAgICAgICAgICAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgZXhwZWN0ZWRWYWx1ZSBpcyBwcm9wZXJseSBmb3JtYXR0ZWRcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGl0ZW0uZXhwZWN0ZWRUeXBlIHx8IFwic3RyaW5nXCI7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWRWYWx1ZSA9IGl0ZW0uZXhwZWN0ZWRWYWx1ZTtcblxuICAgICAgICAgICAgLy8gRm9yIG9iamVjdC9hcnJheSB0eXBlcywgZW5zdXJlIGV4cGVjdGVkVmFsdWUgaXMgYW4gb2JqZWN0L2FycmF5LCBub3QgYSBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUudHJpbSgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID0gSlNPTi5wYXJzZShleHBlY3RlZFZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhcnNpbmcgZmFpbHMsIGtlZXAgYXMgc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUudHJpbSgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID0gSlNPTi5wYXJzZShleHBlY3RlZFZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhcnNpbmcgZmFpbHMsIGtlZXAgYXMgc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgICB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPVxuICAgICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUgIT09IFwiXCIgPyBOdW1iZXIoZXhwZWN0ZWRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgIGlmIChleHBlY3RlZFZhbHVlID09PSBcInRydWVcIiB8fCBleHBlY3RlZFZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSA9PT0gXCJmYWxzZVwiIHx8IGV4cGVjdGVkVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGpzb25QYXRoOiBpdGVtLmpzb25QYXRoIHx8IFwiXCIsXG4gICAgICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGU6IGl0ZW0udmVyaWZpY2F0aW9uVHlwZSB8fCBcImVxdWFsc1wiLFxuICAgICAgICAgICAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZSxcbiAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZTogZXhwZWN0ZWRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdLmFzc2VydGlvbkRhdGEgPSBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCB0aGUgY2hhbmdlIHRvIHBhcmVudFxuICAgICAgdGhpcy5hc3NlcnRpb25EYXRhQ2hhbmdlLmVtaXQoe1xuICAgICAgICBxdWVyeUluZGV4OiBxdWVyeUluZGV4LFxuICAgICAgICBhc3NlcnRpb25EYXRhOiB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0uYXNzZXJ0aW9uRGF0YSB8fCBbXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFzc2VydGlvbiBkYXRhIGZvciBhIHF1ZXJ5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKHF1ZXJ5SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0gJiYgIXRoaXMucXVlcmllc1txdWVyeUluZGV4XS5hc3NlcnRpb25EYXRhKSB7XG4gICAgICB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0uYXNzZXJ0aW9uRGF0YSA9IFtdO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGFzc2VydGlvbnMgZm9ybSBmb3IgdGhpcyBxdWVyeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCF0aGlzLmFzc2VydGlvbnNGb3Jtcy5oYXMocXVlcnlJbmRleCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFzc2VydGlvbnNGb3JtKHF1ZXJ5SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFzc2VydGlvbnMgZm9ybSBmb3IgYSBzcGVjaWZpYyBxdWVyeVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQXNzZXJ0aW9uc0Zvcm0ocXVlcnlJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgYXNzZXJ0aW9uc0FycmF5ID0gdGhpcy5mYi5hcnJheShbXSk7XG4gICAgY29uc3QgYXNzZXJ0aW9uc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGFzc2VydGlvbnM6IGFzc2VydGlvbnNBcnJheSxcbiAgICB9KTtcbiAgICB0aGlzLmFzc2VydGlvbnNGb3Jtcy5zZXQocXVlcnlJbmRleCwgYXNzZXJ0aW9uc0Zvcm0pO1xuXG4gICAgLy8gTG9hZCBleGlzdGluZyBhc3NlcnRpb25zIGlmIHRoZXkgZXhpc3RcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcmllc1txdWVyeUluZGV4XTtcbiAgICBpZiAocXVlcnkgJiYgcXVlcnkuYXNzZXJ0aW9uRGF0YSAmJiBxdWVyeS5hc3NlcnRpb25EYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9hZEFzc2VydGlvbnNGb3JRdWVyeShxdWVyeUluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9ybSBjaGFuZ2VzXG4gICAgdGhpcy5zdWJzY3JpYmVUb0Fzc2VydGlvbnNGb3JtQ2hhbmdlcyhxdWVyeUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXNzZXJ0aW9ucyBmb3JtIGZvciBjdXJyZW50IHF1ZXJ5XG4gICAqL1xuICBnZXRDdXJyZW50QXNzZXJ0aW9uc0Zvcm0oKTogVW50eXBlZEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFzc2VydGlvbnNGb3Jtcy5oYXModGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRpb25zRm9ybXMuZ2V0KHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KSE7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KTtcbiAgICByZXR1cm4gdGhpcy5hc3NlcnRpb25zRm9ybXMuZ2V0KHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhc3NlcnRpb25zIGZvcm0gYXJyYXkgZm9yIGN1cnJlbnQgcXVlcnlcbiAgICovXG4gIGdldEFzc2VydGlvbnNGb3JtQXJyYXkoKTogVW50eXBlZEZvcm1BcnJheSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Q3VycmVudEFzc2VydGlvbnNGb3JtKCk7XG4gICAgaWYgKGZvcm0pIHtcbiAgICAgIHJldHVybiBmb3JtLmdldChcImFzc2VydGlvbnNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmIuYXJyYXkoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYXNzZXJ0aW9ucyBpbnRvIGZvcm0gZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAgICovXG4gIHByaXZhdGUgbG9hZEFzc2VydGlvbnNGb3JRdWVyeShxdWVyeUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5hc3NlcnRpb25zRm9ybXMuZ2V0KHF1ZXJ5SW5kZXgpO1xuICAgIGlmICghZm9ybSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoXCJhc3NlcnRpb25zXCIpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF07XG4gICAgaWYgKCFxdWVyeSB8fCAhcXVlcnkuYXNzZXJ0aW9uRGF0YSkgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlIChmb3JtQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICBmb3JtQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhc3NlcnRpb25zXG4gICAgcXVlcnkuYXNzZXJ0aW9uRGF0YS5mb3JFYWNoKChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gYXNzZXJ0aW9uLmV4cGVjdGVkVHlwZSB8fCBcInN0cmluZ1wiO1xuICAgICAgbGV0IGV4cGVjdGVkVmFsdWU6IGFueSA9IFwiXCI7XG5cbiAgICAgIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgICAgIGV4cGVjdGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwib2JqZWN0XCIgfHwgZXhwZWN0ZWRUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIGFzc2VydGlvbi5leHBlY3RlZFZhbHVlICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSwgbnVsbCwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IGFzc2VydGlvbi5leHBlY3RlZFZhbHVlIHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBleHBlY3RlZFZhbHVlID1cbiAgICAgICAgICBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSA9PT0gdHJ1ZSB8fCBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSA9PT0gXCJ0cnVlXCJcbiAgICAgICAgICAgID8gXCJ0cnVlXCJcbiAgICAgICAgICAgIDogXCJmYWxzZVwiO1xuICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9XG4gICAgICAgICAgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFN0cmluZyhhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSlcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGVjdGVkVmFsdWUgPVxuICAgICAgICAgIGFzc2VydGlvbi5leHBlY3RlZFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBTdHJpbmcoYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUpXG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBqc29uUGF0aDogW2Fzc2VydGlvbi5qc29uUGF0aCB8fCBcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uVHlwZTogW2Fzc2VydGlvbi52ZXJpZmljYXRpb25UeXBlIHx8IFwiZXF1YWxzXCJdLFxuICAgICAgICBleHBlY3RlZFR5cGU6IFtleHBlY3RlZFR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbXG4gICAgICAgICAgZXhwZWN0ZWRWYWx1ZSxcbiAgICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5leHBlY3RlZFZhbHVlVmFsaWRhdG9yXSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtQXJyYXkucHVzaChmb3JtR3JvdXApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhc3NlcnRpb25zIGZvcm0gY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0Fzc2VydGlvbnNGb3JtQ2hhbmdlcyhxdWVyeUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5hc3NlcnRpb25zRm9ybXMuZ2V0KHF1ZXJ5SW5kZXgpO1xuICAgIGlmICghZm9ybSkgcmV0dXJuO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91cyBzdWJzY3JpcHRpb24gaWYgZXhpc3RzXG4gICAgaWYgKHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMuaGFzKHF1ZXJ5SW5kZXgpKSB7XG4gICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmdldChxdWVyeUluZGV4KSEudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldChcImFzc2VydGlvbnNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBmb3JtQXJyYXkudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmVtaXRBc3NlcnRpb25EYXRhRm9yUXVlcnkocXVlcnlJbmRleCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLnNldChxdWVyeUluZGV4LCBzdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYXNzZXJ0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAgICovXG4gIHByaXZhdGUgZW1pdEFzc2VydGlvbkRhdGFGb3JRdWVyeShxdWVyeUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5hc3NlcnRpb25zRm9ybXMuZ2V0KHF1ZXJ5SW5kZXgpO1xuICAgIGlmICghZm9ybSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoXCJhc3NlcnRpb25zXCIpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgY29uc3QgYXNzZXJ0aW9uRGF0YSA9IGZvcm1BcnJheS5jb250cm9sc1xuICAgICAgLm1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoIShjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gdmFsdWUuZXhwZWN0ZWRUeXBlIHx8IFwic3RyaW5nXCI7XG4gICAgICAgIGxldCBleHBlY3RlZFZhbHVlOiBhbnkgPSB2YWx1ZS5leHBlY3RlZFZhbHVlO1xuXG4gICAgICAgIC8vIFBhcnNlIGV4cGVjdGVkVmFsdWUgYmFzZWQgb24gdHlwZVxuICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBleHBlY3RlZFZhbHVlICE9PSBcIlwiID8gTnVtYmVyKGV4cGVjdGVkVmFsdWUpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IGV4cGVjdGVkVmFsdWUgPT09IFwidHJ1ZVwiIHx8IGV4cGVjdGVkVmFsdWUgPT09IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcImFycmF5XCIgfHwgZXhwZWN0ZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiICYmIGV4cGVjdGVkVmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID0gSlNPTi5wYXJzZShleHBlY3RlZFZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgLy8gS2VlcCBhcyBzdHJpbmcgaWYgcGFyc2luZyBmYWlsc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHBlY3RlZFZhbHVlID0gU3RyaW5nKGV4cGVjdGVkVmFsdWUgfHwgXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGpzb25QYXRoOiAodmFsdWUuanNvblBhdGggfHwgXCJcIikudHJpbSgpLFxuICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGU6IHZhbHVlLnZlcmlmaWNhdGlvblR5cGUgfHwgXCJlcXVhbHNcIixcbiAgICAgICAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZSxcbiAgICAgICAgICBleHBlY3RlZFZhbHVlOiBleHBlY3RlZFZhbHVlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IG51bGwgJiYgaXRlbSEuanNvblBhdGgpIGFzIGFueVtdO1xuXG4gICAgLy8gVXBkYXRlIHF1ZXJ5J3MgYXNzZXJ0aW9uIGRhdGFcbiAgICBpZiAodGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdKSB7XG4gICAgICB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0uYXNzZXJ0aW9uRGF0YSA9IGFzc2VydGlvbkRhdGE7XG4gICAgfVxuXG4gICAgLy8gRW1pdCB0byBwYXJlbnRcbiAgICB0aGlzLmFzc2VydGlvbkRhdGFDaGFuZ2UuZW1pdCh7XG4gICAgICBxdWVyeUluZGV4OiBxdWVyeUluZGV4LFxuICAgICAgYXNzZXJ0aW9uRGF0YTogYXNzZXJ0aW9uRGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgYXNzZXJ0aW9uXG4gICAqL1xuICBhZGRBc3NlcnRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCk7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBqc29uUGF0aDogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmVyaWZpY2F0aW9uVHlwZTogW1wiZXF1YWxzXCJdLFxuICAgICAgZXhwZWN0ZWRUeXBlOiBbdGhpcy5kZWZhdWx0RXhwZWN0ZWRUeXBlXSxcbiAgICAgIGV4cGVjdGVkVmFsdWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5leHBlY3RlZFZhbHVlVmFsaWRhdG9yXV0sXG4gICAgfSk7XG4gICAgZm9ybUFycmF5LnB1c2goZm9ybUdyb3VwKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuYXNzZXJ0aW9uc1RhYmxlKSB7XG4gICAgICB0aGlzLmFzc2VydGlvbnNUYWJsZS5yZW5kZXJSb3dzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhc3NlcnRpb25cbiAgICovXG4gIHJlbW92ZUFzc2VydGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCk7XG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuYXNzZXJ0aW9uc1RhYmxlKSB7XG4gICAgICB0aGlzLmFzc2VydGlvbnNUYWJsZS5yZW5kZXJSb3dzKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdEFzc2VydGlvbkRhdGFGb3JRdWVyeSh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcm0gY29udHJvbCBhdCBzcGVjaWZpYyBpbmRleFxuICAgKi9cbiAgZ2V0Rm9ybUNvbnRyb2xBdChpbmRleDogbnVtYmVyLCBjb250cm9sTmFtZTogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCk7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmb3JtQXJyYXkubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtQXJyYXkuYXQoaW5kZXgpIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgcmV0dXJuIGZvcm1Hcm91cD8uZ2V0KGNvbnRyb2xOYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBleHBlY3RlZCB0eXBlIGZvciBhbiBhc3NlcnRpb25cbiAgICovXG4gIGdldEV4cGVjdGVkVHlwZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmdldEFzc2VydGlvbnNGb3JtQXJyYXkoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZvcm1BcnJheS5sZW5ndGgpIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgVW50eXBlZEZvcm1Hcm91cDtcbiAgICByZXR1cm4gZm9ybUdyb3VwPy5nZXQoXCJleHBlY3RlZFR5cGVcIik/LnZhbHVlIHx8IFwic3RyaW5nXCI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGV4cGVjdGVkIHZhbHVlIHBsYWNlaG9sZGVyXG4gICAqL1xuICBnZXRFeHBlY3RlZFZhbHVlUGxhY2Vob2xkZXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gdGhpcy5nZXRFeHBlY3RlZFR5cGUoaW5kZXgpO1xuICAgIHN3aXRjaCAoZXhwZWN0ZWRUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBcIkVudGVyIHZhbHVlXCI7XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIFwiRW50ZXIgSlNPTiBhcnJheVwiO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gXCJFbnRlciBKU09OIG9iamVjdFwiO1xuICAgICAgY2FzZSBcIm51bGxcIjpcbiAgICAgICAgcmV0dXJuIFwiTm8gdmFsdWUgcmVxdWlyZWRcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIkVudGVyIHZhbHVlXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBleHBlY3RlZCB0eXBlIGNoYW5nZVxuICAgKi9cbiAgb25FeHBlY3RlZFR5cGVDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZm9ybUFycmF5Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybUFycmF5LmF0KGluZGV4KSBhcyBVbnR5cGVkRm9ybUdyb3VwO1xuICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVDb250cm9sID0gZm9ybUdyb3VwLmdldChcImV4cGVjdGVkVmFsdWVcIik7XG4gICAgaWYgKCFleHBlY3RlZFZhbHVlQ29udHJvbCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1ZhbHVlOiBhbnkgPSBcIlwiO1xuICAgIGlmICh2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIG5ld1ZhbHVlID0gXCJ0cnVlXCI7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgIG5ld1ZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICBleHBlY3RlZFZhbHVlQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICBleHBlY3RlZFZhbHVlQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgaWYgKHZhbHVlID09PSBcIm51bGxcIikge1xuICAgICAgZXhwZWN0ZWRWYWx1ZUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbdGhpcy5leHBlY3RlZFZhbHVlVmFsaWRhdG9yXSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBleHBlY3RlZFZhbHVlQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGVjdGVkVmFsdWVDb250cm9sLnNldFZhbGlkYXRvcnMoW1xuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICB0aGlzLmV4cGVjdGVkVmFsdWVWYWxpZGF0b3IsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGV4cGVjdGVkVmFsdWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0ZWQgdmFsdWUgdmFsaWRhdG9yXG4gICAqL1xuICBleHBlY3RlZFZhbHVlVmFsaWRhdG9yID0gKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICApOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gY29udHJvbC5wYXJlbnQ/LmdldChcImV4cGVjdGVkVHlwZVwiKT8udmFsdWU7XG4gICAgaWYgKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAhPT0gZmFsc2UpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB7IGludmFsaWRUeXBlOiB0cnVlLCBtZXNzYWdlOiBcIkludmFsaWQgbnVtYmVyIHZhbHVlXCIgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgIT09IFwidHJ1ZVwiICYmXG4gICAgICAgIHZhbHVlICE9PSBcImZhbHNlXCIgJiZcbiAgICAgICAgdmFsdWUgIT09IHRydWUgJiZcbiAgICAgICAgdmFsdWUgIT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHsgaW52YWxpZFR5cGU6IHRydWUsIG1lc3NhZ2U6IFwiSW52YWxpZCBib29sZWFuIHZhbHVlXCIgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpbnZhbGlkVHlwZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgSlNPTiBhcnJheVwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW52YWxpZFR5cGU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBcIkludmFsaWQgQXJyYXkgdmFsdWUgLSBtdXN0IGJlIHZhbGlkIEpTT05cIixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJ7fVwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyc2VkID09PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2YgcGFyc2VkICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcnNlZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGludmFsaWRUeXBlOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcIlZhbHVlIG11c3QgYmUgYSB2YWxpZCBKU09OIG9iamVjdFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW52YWxpZFR5cGU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBcIkludmFsaWQgT2JqZWN0IHZhbHVlIC0gbXVzdCBiZSB2YWxpZCBKU09OXCIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYXNzZXJ0aW9ucyBkYXRhIHNvdXJjZSBmb3IgdGFibGVcbiAgICovXG4gIGdldCBhc3NlcnRpb25zRGF0YVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCkuY29udHJvbHM7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYnkgZnVuY3Rpb24gZm9yIHRhYmxlIHJvd3NcbiAgICovXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZm9yIGRhdGFiYXNlIHN0ZXBzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQWR2YW5jZWRTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiaXNTdGVwT3B0aW9uYWxcIixcbiAgICAgICAgbGFiZWw6IFwiRG9uJ3QgZmFpbCB0aGUgdGVzdCBpZiB0aGlzIHN0ZXAgZmFpbHMuXCIsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBcInNob3VsZFNraXBcIixcbiAgICAgICAgbGFiZWw6IFwiU2tpcCB0aGlzIHN0ZXAgZHVyaW5nIGV4ZWN1dGlvbi5cIixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCByZWFjdGl2ZSBmb3JtIGZvciBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID1cbiAgICAgICAgdmFyaWFibGUudHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgID8gdmFyaWFibGUudmFsdWUgPT09IHRydWUgfHxcbiAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID09PSBcInRydWVcIiB8fFxuICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPT09IDFcbiAgICAgICAgICA6IHZhcmlhYmxlLnZhbHVlIHx8IFwiXCI7XG5cbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8IFwic3RyaW5nXCJdLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8IFwiXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gY2hhbmdlcyBhbmQga2VlcCBkYXRhL2Zvcm0gaW4gc3luYy5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZChcbiAgICAgICh2KSA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICAoY29udHJvbCkgPT4gY29udHJvbC5nZXQoXCJuYW1lXCIpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtXG4gICAgICAgIC5hdCh2YXJpYWJsZUluZGV4KVxuICAgICAgICAuZ2V0KFwidmFsdWVcIilcbiAgICAgICAgPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbm9uLWJvb2xlYW4gYWR2YW5jZWQgdmFyaWFibGUgY2hhbmdlcyAocmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UpLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKFxuICAgICAgKHYpID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIChjb250cm9sKSA9PiBjb250cm9sLmdldChcIm5hbWVcIik/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm1cbiAgICAgICAgLmF0KHZhcmlhYmxlSW5kZXgpXG4gICAgICAgIC5nZXQoXCJ2YWx1ZVwiKVxuICAgICAgICA/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yXCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi00XCI+XG4gICAge3sgZWRpdE1vZGUgPyAnVXBkYXRlIERhdGFiYXNlIFRlc3QgU3RlcCcgOiAnQ3JlYXRlIERhdGFiYXNlIFRlc3QgU3RlcCcgfX1cbiAgPC9oMj5cblxuICA8IS0tIEVudmlyb25tZW50IFNlY3Rpb24gKHNlcGFyYXRvciBsaW5lIG9ubHkgb24gYm90dG9tKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTEuNSBjcWEtcGItWzAuNXJlbV0gY3FhLW1iLTQgY3FhLWJvcmRlci0wIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1pdGVtcy1zdGFydFwiPlxuICAgICAgPCEtLSBEQiBFbnZpcm9ubWVudCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgREIgRW52aXJvbm1lbnQgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJkYXRhYmFzZUZvcm1cIiBbY29uZmlnXT1cImdldERiRW52aXJvbm1lbnRDb25maWcoKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgIFVzZXMgRGF0YWJhc2UgZW52aXJvbm1lbnRzIGZyb20gRW52aXJvbm1lbnRzLlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOb3JtYWwgRW52aXJvbm1lbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1ibG9ja1wiPlxuICAgICAgICAgIE5vcm1hbCBFbnZpcm9ubWVudFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImRhdGFiYXNlRm9ybVwiIFtjb25maWddPVwiZ2V0Tm9ybWFsRW52aXJvbm1lbnRDb25maWcoKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgIFVzZXMgTm9ybWFsIGVudmlyb25tZW50cyBmcm9tIEVudmlyb25tZW50cy5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtbXQtMlwiPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIHRleHQ9XCJSdW4gUXVlcnlcIiAoY2xpY2tlZCk9XCJvblJ1blF1ZXJ5KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWRhdGFiYXNlRm9ybS5nZXQoJ2RiRW52aXJvbm1lbnQnKT8udmFsdWUgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIichY3FhLWJnLVsjM0Y0M0VFXSBjcWEtdGV4dC1bI0ZCRkNGRl0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXdoaXRlc3BhY2Utbm93cmFwICFjcWEtcHQtWzEwcHhdICFjcWEtcGItWzEwcHhdICFjcWEtcGwtWzI0cHhdICFjcWEtcHItWzI0cHhdICFjcWEtZ2FwLVs4cHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1taW4taC1bMzdweF0gaG92ZXI6IWNxYS1iZy1bIzFCMUZFQl0gY3FhLWZsZXgtc2hyaW5rLTAnXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTWFpbiBDb250ZW50OiBUd28gQ29sdW1uIExheW91dCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtWzEycHhdIGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtbWItNlwiPlxuICAgIDwhLS0gTGVmdCBQYW5lbDogUXVlcnkgTGlzdCAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNxYS13LVsxNzVweF0gY3FhLW1pbi13LVsxNzVweF0gY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1ib3JkZXItMCBjcWEtYm9yZGVyLXIgY3FhLWJvcmRlci1yLVsxcHhdIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UwRTBFMF0gY3FhLWJnLVsjRkFGQUZBXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1wLTJcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcXVlcnkgb2YgcXVlcmllczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC1bMTBweF0gY3FhLXctZnVsbCBjcWEtcHQtWzE0cHhdIGNxYS1wYi1bMTRweF0gY3FhLXBsLVsxNnB4XSBjcWEtcHItWzE2cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtbWItMVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1iZy1ibHVlLTUwXT1cInNlbGVjdGVkUXVlcnlJbmRleCA9PT0gaVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXJdPVwic2VsZWN0ZWRRdWVyeUluZGV4ID09PSBpXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1ibHVlLTUwMF09XCJzZWxlY3RlZFF1ZXJ5SW5kZXggPT09IGlcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtYmctZ3JleS00MDBdPVwic2VsZWN0ZWRRdWVyeUluZGV4ICE9PSBpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RRdWVyeShpKVwiXG4gICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDQ5cHg7IG1pbi1oZWlnaHQ6IDQ5cHg7XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS05MDBcIj5RdWVyeSB7eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICA8Y3FhLWJhZGdlICpuZ0lmPVwicXVlcnkuc3RhdHVzXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJxdWVyeS5zdGF0dXMgPT09ICdwYXNzZWQnID8gJ1Bhc3NlZCcgOiBxdWVyeS5zdGF0dXMgPT09ICdmYWlsZWQnID8gJ0ZhaWxlZCcgOiAnUGVuZGluZydcIlxuICAgICAgICAgICAgW3ZhcmlhbnRdPVwicXVlcnkuc3RhdHVzID09PSAncGFzc2VkJyA/ICdzdWNjZXNzJyA6IHF1ZXJ5LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyAnZXJyb3InIDogJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSaWdodCBQYW5lbDogUXVlcnkgRWRpdG9yIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWJvcmRlciBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1yb3VuZGVkLWxnIGNxYS1nYXAtWzEwcHhdIGNxYS1tYi00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bNnB4XVwiIHN0eWxlPVwid2lkdGg6IDUwJTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ncmF5LTkwMCBjcWEtdGV4dC1bMTRweF1cIj5RdWVyeSAmIFN0b3JlIFJlc3BvbnNlPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bI0VGNDQ0NF0gY3FhLW1sLTAuNVwiPio8L3NwYW4+PC9oMz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8IS0tIFNRTCBRdWVyeSBUZXh0YXJlYSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMCBjcWEtdy1mdWxsIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy1ncmF5LTUwLzUwXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgeW91ciBTUUwgcXVlcnkgaGVyZS4uLidcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRDdXJyZW50UXVlcnlGb3JtR3JvdXAoKT8uZ2V0KCdxdWVyeScpPy52YWx1ZSB8fCAnJ1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIFt0ZXh0YXJlYUlubGluZVN0eWxlXT1cIidwYWRkaW5nOiAxcmVtOydcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJnZXRDdXJyZW50UXVlcnlGb3JtR3JvdXAoKT8uZ2V0KCdxdWVyeScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxMHB4XSBjcWEtbWItWzhweF1cIj5cblxuXG4gICAgICAgICAgPCEtLSBWYXJpYWJsZSBJbnB1dCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNSBjcWEtYmxvY2sgY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAgVmFyaWFibGU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjRUY0NDQ0XSBjcWEtbWwtMC41XCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidWYXJpYWJsZSBuYW1lJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEN1cnJlbnRRdWVyeUZvcm1Hcm91cCgpPy5nZXQoJ3ZhcmlhYmxlJyk/LnZhbHVlIHx8ICcnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk/LmdldCgndmFyaWFibGUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtZ3JheS01MDAgY3FhLW10LTFcIj5cbiAgICAgICAgICAgICAgICBVc2UgbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZS4gTm8gc3BhY2VzLiBVbmlxdWUgcGVyIHN0ZXAuIENhc2Ugc2Vuc2l0aXZlLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIChwaW5uZWQgdG8gYm90dG9tKSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW10LWF1dG9cIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJBZGQgUXVlcnlcIiBpY29uPVwiYWRkXCIgKGNsaWNrZWQpPVwiYWRkTmV3UXVlcnkoKVwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWJnLXdoaXRlICFjcWEtYm9yZGVyLVsjNDE0MTQ2XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLXdoaXRlc3BhY2Utbm93cmFwICFjcWEtcHktWzEwcHhdICFjcWEtcHgtWzEwcHhdICFjcWEtZ2FwLVs4cHhdIGNxYS1yb3VuZGVkLWxnIGhvdmVyOiFjcWEtYm9yZGVyLVsjNDE0MTQ2XSBob3ZlcjpjcWEtYmctZ3JheS01MCdcIlxuICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cIicjNDE0MTQ2J1wiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtbWluLXctWzQwcHhdIGNxYS13LTEwIGNxYS1oLTkgY3FhLXJvdW5kZWQgY3FhLWJnLWdyYXktMTAwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1iZy1ncmF5LTIwMCBjcWEtcC0wJ1wiXG4gICAgICAgICAgICAgIFt0b29sdGlwXT1cIidEZWxldGUgcXVlcnknXCIgKGNsaWNrZWQpPVwiZGVsZXRlUXVlcnlCeUlkKGdldEN1cnJlbnRRdWVyeSgpPy5pZCB8fCAnJylcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPD0gMVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZSBxdWVyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzZCNzI4MFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIHRleHQ9XCJSdW5cIiBpY29uPVwicGxheV9hcnJvd1wiIChjbGlja2VkKT1cIm9uUnVuUXVlcnkoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk/LmdldCgncXVlcnknKT8udmFsdWUgfHwgIWRhdGFiYXNlRm9ybS5nZXQoJ2RiRW52aXJvbm1lbnQnKT8udmFsdWUgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIichY3FhLWJnLVsjM0Y0M0VFXSBjcWEtdGV4dC1bI0ZCRkNGRl0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXdoaXRlc3BhY2Utbm93cmFwICFjcWEtcHQtWzEwcHhdICFjcWEtcGItWzEwcHhdICFjcWEtcGwtWzE2cHhdICFjcWEtcHItWzI0cHhdICFjcWEtZ2FwLVs4cHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1taW4taC1bMzhweF0gaG92ZXI6IWNxYS1iZy1bIzFCMUZFQl0gIWNxYS1ib3JkZXItbm9uZSdcIlxuICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cIicjRkJGQ0ZGJ1wiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBSZXN1bHRzIFNlY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtcm91bmRlZC1sZyBjcWEtbWItNlwiPlxuICAgICAgICA8IS0tIFRhYnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1iZy1ncmF5LTUwXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYm9yZGVyLWItMlwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLXRleHQtYmx1ZS02MDBdPVwic2VsZWN0ZWRUYWIgPT09ICdvdXRwdXQnXCIgW2NsYXNzLmNxYS1ib3JkZXItYmx1ZS02MDBdPVwic2VsZWN0ZWRUYWIgPT09ICdvdXRwdXQnXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC1ncmF5LTYwMF09XCJzZWxlY3RlZFRhYiAhPT0gJ291dHB1dCdcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItdHJhbnNwYXJlbnRdPVwic2VsZWN0ZWRUYWIgIT09ICdvdXRwdXQnXCIgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKCdvdXRwdXQnKVwiPlxuICAgICAgICAgICAgT3V0cHV0XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYm9yZGVyLWItMlwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLXRleHQtYmx1ZS02MDBdPVwic2VsZWN0ZWRUYWIgPT09ICd2ZXJpZmljYXRpb24nXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAndmVyaWZpY2F0aW9uJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLXRleHQtZ3JheS02MDBdPVwic2VsZWN0ZWRUYWIgIT09ICd2ZXJpZmljYXRpb24nXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLXRyYW5zcGFyZW50XT1cInNlbGVjdGVkVGFiICE9PSAndmVyaWZpY2F0aW9uJ1wiIChjbGljayk9XCJvblRhYkNoYW5nZSgndmVyaWZpY2F0aW9uJylcIj5cbiAgICAgICAgICAgIFZlcmlmaWNhdGlvblxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJvcmRlci1iLTJcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC1ncmF5LTYwMF09XCJzZWxlY3RlZFRhYiAhPT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci10cmFuc3BhcmVudF09XCJzZWxlY3RlZFRhYiAhPT0gJ2FkdmFuY2VkJ1wiIChjbGljayk9XCJvblRhYkNoYW5nZSgnYWR2YW5jZWQnKVwiPlxuICAgICAgICAgICAgQWR2YW5jZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWIgQ29udGVudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTRcIj5cbiAgICAgICAgICA8IS0tIE91dHB1dCBUYWIgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnb3V0cHV0J1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtbWItM1wiPlxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ncmF5LTkwMFwiPlF1ZXJ5IFJlc3VsdHM8L2g0PlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCJDb3B5XCIgaWNvbj1cImNvbnRlbnRfY29weVwiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtYmx1ZS02MDAnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNvcHlSZXN1bHRzKClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUmVzdWx0cyBUYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRDdXJyZW50UXVlcnlSZXN1bHQoKS5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJvcmRlci1jb2xsYXBzZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImNxYS1iZy1ncmF5LTUwIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQga2V5IG9mIGdldFRhYmxlQ29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS03MDAgY3FhLXVwcGVyY2FzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGtleSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGdldEN1cnJlbnRRdWVyeVJlc3VsdCgpXCIgY2xhc3M9XCJjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMCBob3ZlcjpjcWEtYmctZ3JheS01MFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRUYWJsZUNvbHVtbnMoKVwiIGNsYXNzPVwiY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3dba2V5XSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRDdXJyZW50UXVlcnlSZXN1bHQoKS5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtcHktOCBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgICBObyByZXN1bHRzIHlldC4gUnVuIGEgcXVlcnkgdG8gc2VlIHJlc3VsdHMuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVmVyaWZpY2F0aW9uIFRhYiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICd2ZXJpZmljYXRpb24nXCIgY2xhc3M9XCJhc3NlcnRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhc3NlcnRpb25zLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Bc3NlcnRpb25zPC9oMz5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlYWRlci1zdWJ0aXRsZVwiPlVzZSBKU09OUGF0aCB0byB0YXJnZXQgdmFsdWVzIGluIHRoZSBxdWVyeSBvdXRwdXQuPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b24gXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhZGQtYXNzZXJ0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFzc2VydGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgQWRkIEFzc2VydGlvblxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFRhYmxlIFNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8Zm9ybSAqbmdJZj1cImdldEN1cnJlbnRBc3NlcnRpb25zRm9ybSgpXCIgW2Zvcm1Hcm91cF09XCJnZXRDdXJyZW50QXNzZXJ0aW9uc0Zvcm0oKSFcIiBjbGFzcz1cImFzc2VydGlvbnMtZm9ybVwiPlxuICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJhc3NlcnRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiYXNzZXJ0aW9uc0RhdGFTb3VyY2VcIiBjbGFzcz1cImFzc2VydGlvbnMtdGFibGVcIiAjYXNzZXJ0aW9uc1RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIEpTT05QYXRoIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJqc29uUGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+anNvblBhdGg8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBhc3NlcnRpb247IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZ1bGwtd2lkdGgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImpzb25QYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldEZvcm1Db250cm9sQXQoaSwgJ2pzb25QYXRoJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvcm1Db250cm9sQXQoaSwgJ2pzb25QYXRoJyk/LnRvdWNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05QYXRoIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZlcmlmaWNhdGlvbiBUeXBlIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ2ZXJpZmljYXRpb25UeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj52ZXJpZmljYXRpb25UeXBlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgYXNzZXJ0aW9uOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmdWxsLXdpZHRoLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidmVyaWZpY2F0aW9uVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJlcXVhbHNcIj5FcXVhbHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdF9lcXVhbHNcIj5Ob3QgRXF1YWxzPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjb250YWluc1wiPkNvbnRhaW5zPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RfY29udGFpbnNcIj5Ob3QgQ29udGFpbnM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImdyZWF0ZXJfdGhhblwiPkdyZWF0ZXIgVGhhbjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGVzc190aGFuXCI+TGVzcyBUaGFuPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJncmVhdGVyX3RoYW5fb3JfZXF1YWxzXCI+R3JlYXRlciBUaGFuIE9yIEVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGVzc190aGFuX29yX2VxdWFsc1wiPkxlc3MgVGhhbiBPciBFcXVhbHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImV4aXN0c1wiPkV4aXN0czwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90X2V4aXN0c1wiPk5vdCBFeGlzdHM8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBlY3RlZCBUeXBlIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBlY3RlZFR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPmV4cGVjdGVkVHlwZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGFzc2VydGlvbjsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZnVsbC13aWR0aC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXhwZWN0ZWRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25FeHBlY3RlZFR5cGVDaGFuZ2UoaSwgJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJzdHJpbmdcIj5TdHJpbmc8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm51bWJlclwiPk51bWJlcjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiYm9vbGVhblwiPkJvb2xlYW48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm9iamVjdFwiPk9iamVjdDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiYXJyYXlcIj5BcnJheTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibnVsbFwiPk51bGw8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBlY3RlZCBWYWx1ZSBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwZWN0ZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+ZXhwZWN0ZWRWYWx1ZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGFzc2VydGlvbjsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nLCBBcnJheSwgT2JqZWN0IElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdzdHJpbmcnIHx8IGdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ2FycmF5JyB8fCBnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdvYmplY3QnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0RXhwZWN0ZWRUeXBlKGkpID09PSAnYXJyYXknIHx8IGdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ29iamVjdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHBlY3RlZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRFeHBlY3RlZFZhbHVlUGxhY2Vob2xkZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ3N0cmluZydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHBlY3RlZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRFeHBlY3RlZFZhbHVlUGxhY2Vob2xkZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy50b3VjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZCB2YWx1ZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJnZXRGb3JtQ29udHJvbEF0KGksICdleHBlY3RlZFZhbHVlJyk/Lmhhc0Vycm9yKCdpbnZhbGlkVHlwZScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtQ29udHJvbEF0KGksICdleHBlY3RlZFZhbHVlJyk/LmVycm9ycz8ubWVzc2FnZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVsbCBUeXBlIERpc3BsYXkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ251bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXhwZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RXhwZWN0ZWRWYWx1ZVBsYWNlaG9sZGVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ251bWJlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV4cGVjdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy50b3VjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZCB2YWx1ZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQm9vbGVhbiBTZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ2Jvb2xlYW4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImV4cGVjdGVkVmFsdWVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwidHJ1ZVwiPnRydWU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImZhbHNlXCI+ZmFsc2U8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJnZXRGb3JtQ29udHJvbEF0KGksICdleHBlY3RlZFZhbHVlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8udG91Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQgdmFsdWUgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgYXNzZXJ0aW9uOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGVsZXRlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVBc3NlcnRpb24oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInRGVsZXRlIGFzc2VydGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gRW1wdHkgU3RhdGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEFzc2VydGlvbnNGb3JtQXJyYXkoKS5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cD5ObyBhc3NlcnRpb25zIGFkZGVkLiBDbGljayBcIkFkZCBBc3NlcnRpb25cIiB0byBjcmVhdGUgb25lLjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdhZHZhbmNlZCdcIj5cbiAgICAgICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0gXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cblxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgW3RleHRdPVwiZWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0NyZWF0ZSBTdGVwJ1wiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGRpdiAqbmdJZj1cImlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzM4cHhdIGNxYS1yb3VuZGVkLVs4cHhdXCI+XG4gICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQ3JlYXRpbmfigKZcIiBpY29uPVwiYXV0b3JlbmV3XCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCIgc2l6ZT1cIm1lZGl1bVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
1049
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWRhdGFiYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1kYXRhYmFzZS9zdGVwLWJ1aWxkZXItZGF0YWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWRhdGFiYXNlL3N0ZXAtYnVpbGRlci1kYXRhYmFzZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixVQUFVLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUErQnhCLE1BQU0sT0FBTyw0QkFBNEI7SUFpS25CO0lBQWdDO0lBOUpwRCwwQ0FBMEM7SUFDakMsb0JBQW9CLEdBQW1CLEVBQUUsQ0FBQztJQUVuRCw4Q0FBOEM7SUFDckMsd0JBQXdCLEdBQW1CLEVBQUUsQ0FBQztJQUV2RCwyQkFBMkI7SUFDbEIsT0FBTyxHQUFvQixFQUFFLENBQUM7SUFFdkMsd0VBQXdFO0lBQy9ELFlBQVksR0FBVSxFQUFFLENBQUM7SUFFbEMsb0JBQW9CO0lBQ1gsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVwQywyQ0FBMkM7SUFDbEMsb0JBQW9CLENBQVU7SUFFdkMsK0NBQStDO0lBQ3RDLHdCQUF3QixDQUFVO0lBRTNDLDJCQUEyQjtJQUNsQixRQUFRLENBQVc7SUFFNUIseUdBQXlHO0lBQ2hHLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFekMsZ0NBQWdDO0lBQ3RCLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUU1RCwwQkFBMEI7SUFD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QjtzQkFBakMsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQW1CdUIsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBd0VuQix5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgRm9ybUNvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbCxcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSBcIi4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VRdWVyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHZhcmlhYmxlOiBzdHJpbmc7XG4gIHN0YXR1cz86IFwicGFzc2VkXCIgfCBcImZhaWxlZFwiIHwgXCJwZW5kaW5nXCI7XG4gIGFzc2VydGlvbkRhdGE/OiBhbnlbXTsgLy8gQXNzZXJ0aW9uIGRhdGEgZm9yIHZlcmlmaWNhdGlvblxuICAvKiogUmVzdWx0IHJvd3MgZm9yIHRoaXMgcXVlcnkgKHNob3duIGluIE91dHB1dCB0YWIpLiAqL1xuICBxdWVyeVJlc3VsdD86IGFueVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlRm9ybURhdGEge1xuICBkYkVudmlyb25tZW50OiBzdHJpbmc7XG4gIG5vcm1hbEVudmlyb25tZW50Pzogc3RyaW5nO1xuICBxdWVyaWVzOiBEYXRhYmFzZVF1ZXJ5W107XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNxYS1zdGVwLWJ1aWxkZXItZGF0YWJhc2VcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9zdGVwLWJ1aWxkZXItZGF0YWJhc2UuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogXCJjcWEtdWktcm9vdFwiIH0sXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyRGF0YWJhc2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gIC8qKiBPcHRpb25zIGZvciBEQiBlbnZpcm9ubWVudCBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkYkVudmlyb25tZW50T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogT3B0aW9ucyBmb3IgTm9ybWFsIGVudmlyb25tZW50IGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIG5vcm1hbEVudmlyb25tZW50T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5pdGlhbCBxdWVyaWVzIGxpc3QgKi9cbiAgQElucHV0KCkgcXVlcmllczogRGF0YWJhc2VRdWVyeVtdID0gW107XG5cbiAgLyoqIFF1ZXJ5IHJlc3VsdHMgZGF0YSAoZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBwZXItcXVlcnkgcXVlcnlSZXN1bHQpICovXG4gIEBJbnB1dCgpIHF1ZXJ5UmVzdWx0czogYW55W10gPSBbXTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSW5pdGlhbCBEQiBlbnZpcm9ubWVudCBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxEYkVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsIE5vcm1hbCBlbnZpcm9ubWVudCBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxOb3JtYWxFbnZpcm9ubWVudD86IHN0cmluZztcblxuICAvKiogV2hldGhlciBpbiBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhYmFzZUZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBxdWVyeSBpcyBydW4gKi9cbiAgQE91dHB1dCgpIHJ1blF1ZXJ5ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgY3VycmVudFF1ZXJ5OiBEYXRhYmFzZVF1ZXJ5O1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgdmFyaWFibGU6IHN0cmluZztcbiAgICBkYkVudmlyb25tZW50OiBzdHJpbmc7XG4gICAgbm9ybWFsRW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIH0+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBEQiBlbnZpcm9ubWVudCBzZWFyY2ggaXMgdHJpZ2dlcmVkICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYkVudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBOb3JtYWwgZW52aXJvbm1lbnQgc2VhcmNoIGlzIHRyaWdnZXJlZCAqL1xuICBAT3V0cHV0KCkgc2VhcmNoTm9ybWFsRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHF1ZXJ5IGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBhZGRRdWVyeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIHF1ZXJ5IGlzIGRlbGV0ZWQgKi9cbiAgQE91dHB1dCgpIGRlbGV0ZVF1ZXJ5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBhc3NlcnRpb24gZGF0YSBjaGFuZ2VzIGZvciBhIHF1ZXJ5ICovXG4gIEBPdXRwdXQoKSBhc3NlcnRpb25EYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgcXVlcnlJbmRleDogbnVtYmVyO1xuICAgIGFzc2VydGlvbkRhdGE6IGFueVtdO1xuICB9PigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gc2VsZWN0ZWQgcXVlcnkgaW5kZXggY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRRdWVyeUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBhY3RpdmUgdGFiIGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIGFjdGl2ZVRhYkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgXCJvdXRwdXRcIiB8IFwidmVyaWZpY2F0aW9uXCIgfCBcImFkdmFuY2VkXCJcbiAgPigpO1xuXG4gIGRhdGFiYXNlRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgc2VsZWN0ZWRUYWI6IFwib3V0cHV0XCIgfCBcInZlcmlmaWNhdGlvblwiIHwgXCJhZHZhbmNlZFwiID0gXCJvdXRwdXRcIjtcbiAgc2VsZWN0ZWRRdWVyeUluZGV4OiBudW1iZXIgPSAwO1xuXG4gIC8vIEFzc2VydGlvbnMgZm9ybSBtYW5hZ2VtZW50IC0gb25lIGZvcm0gcGVyIHF1ZXJ5XG4gIGFzc2VydGlvbnNGb3JtczogTWFwPG51bWJlciwgVW50eXBlZEZvcm1Hcm91cD4gPSBuZXcgTWFwKCk7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgIFwianNvblBhdGhcIixcbiAgICBcInZlcmlmaWNhdGlvblR5cGVcIixcbiAgICBcImV4cGVjdGVkVHlwZVwiLFxuICAgIFwiZXhwZWN0ZWRWYWx1ZVwiLFxuICAgIFwiYWN0aW9uc1wiLFxuICBdO1xuICBkZWZhdWx0RXhwZWN0ZWRUeXBlID0gXCJzdHJpbmdcIjtcbiAgcHJpdmF0ZSBmb3JtU3Vic2NyaXB0aW9uczogTWFwPG51bWJlciwgU3Vic2NyaXB0aW9uPiA9IG5ldyBNYXAoKTtcbiAgQFZpZXdDaGlsZChcImFzc2VydGlvbnNUYWJsZVwiKSBhc3NlcnRpb25zVGFibGU/OiBNYXRUYWJsZTxhbnk+O1xuXG4gIC8qKiBPcHRpb25zICsgY3FhLWR5bmFtaWMtc2VsZWN0IGNvbmZpZ3MgZm9yIHRoZSBhc3NlcnRpb24tcm93IGRyb3Bkb3ducy4gKi9cbiAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgdmFsdWU6IFwiZXF1YWxzXCIsIGxhYmVsOiBcIkVxdWFsc1wiIH0sXG4gICAgeyB2YWx1ZTogXCJub3RfZXF1YWxzXCIsIGxhYmVsOiBcIk5vdCBFcXVhbHNcIiB9LFxuICAgIHsgdmFsdWU6IFwiY29udGFpbnNcIiwgbGFiZWw6IFwiQ29udGFpbnNcIiB9LFxuICAgIHsgdmFsdWU6IFwibm90X2NvbnRhaW5zXCIsIGxhYmVsOiBcIk5vdCBDb250YWluc1wiIH0sXG4gICAgeyB2YWx1ZTogXCJncmVhdGVyX3RoYW5cIiwgbGFiZWw6IFwiR3JlYXRlciBUaGFuXCIgfSxcbiAgICB7IHZhbHVlOiBcImxlc3NfdGhhblwiLCBsYWJlbDogXCJMZXNzIFRoYW5cIiB9LFxuICAgIHsgdmFsdWU6IFwiZ3JlYXRlcl90aGFuX29yX2VxdWFsc1wiLCBsYWJlbDogXCJHcmVhdGVyIFRoYW4gT3IgRXF1YWxzXCIgfSxcbiAgICB7IHZhbHVlOiBcImxlc3NfdGhhbl9vcl9lcXVhbHNcIiwgbGFiZWw6IFwiTGVzcyBUaGFuIE9yIEVxdWFsc1wiIH0sXG4gICAgeyB2YWx1ZTogXCJleGlzdHNcIiwgbGFiZWw6IFwiRXhpc3RzXCIgfSxcbiAgICB7IHZhbHVlOiBcIm5vdF9leGlzdHNcIiwgbGFiZWw6IFwiTm90IEV4aXN0c1wiIH0sXG4gIF07XG5cbiAgcmVhZG9ubHkgZXhwZWN0ZWRUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyB2YWx1ZTogXCJzdHJpbmdcIiwgbGFiZWw6IFwiU3RyaW5nXCIgfSxcbiAgICB7IHZhbHVlOiBcIm51bWJlclwiLCBsYWJlbDogXCJOdW1iZXJcIiB9LFxuICAgIHsgdmFsdWU6IFwiYm9vbGVhblwiLCBsYWJlbDogXCJCb29sZWFuXCIgfSxcbiAgICB7IHZhbHVlOiBcIm9iamVjdFwiLCBsYWJlbDogXCJPYmplY3RcIiB9LFxuICAgIHsgdmFsdWU6IFwiYXJyYXlcIiwgbGFiZWw6IFwiQXJyYXlcIiB9LFxuICAgIHsgdmFsdWU6IFwibnVsbFwiLCBsYWJlbDogXCJOdWxsXCIgfSxcbiAgXTtcblxuICByZWFkb25seSBib29sZWFuRXhwZWN0ZWRWYWx1ZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgdmFsdWU6IFwidHJ1ZVwiLCBsYWJlbDogXCJ0cnVlXCIgfSxcbiAgICB7IHZhbHVlOiBcImZhbHNlXCIsIGxhYmVsOiBcImZhbHNlXCIgfSxcbiAgXTtcblxuICByZWFkb25seSB2ZXJpZmljYXRpb25UeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiBcInZlcmlmaWNhdGlvblR5cGVcIixcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiB0aGlzLnZlcmlmaWNhdGlvblR5cGVPcHRpb25zLFxuICB9O1xuXG4gIHJlYWRvbmx5IGV4cGVjdGVkVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogXCJleHBlY3RlZFR5cGVcIixcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiB0aGlzLmV4cGVjdGVkVHlwZU9wdGlvbnMsXG4gIH07XG5cbiAgcmVhZG9ubHkgYm9vbGVhbkV4cGVjdGVkVmFsdWVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6IFwiZXhwZWN0ZWRWYWx1ZVwiLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IHRoaXMuYm9vbGVhbkV4cGVjdGVkVmFsdWVPcHRpb25zLFxuICB9O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBwZXItcm93IEZvcm1Hcm91cCBzbyBjcWEtZHluYW1pYy1zZWxlY3QgY2FuIGJpbmQgdG8gaXQuICovXG4gIGdldEFzc2VydGlvbkZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIpOiBVbnR5cGVkRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCk7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmb3JtQXJyYXkubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZm9ybUFycmF5LmF0KGluZGV4KSBhcyBVbnR5cGVkRm9ybUdyb3VwO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGEgcGVyLXJvdyBjb250cm9sLCBpbiB0aGUgc2hhcGUgY3FhLWN1c3RvbS1pbnB1dCBleHBlY3RzLiAqL1xuICBnZXRBc3NlcnRpb25GaWVsZEVycm9ycyhpbmRleDogbnVtYmVyLCBjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1Db250cm9sQXQoaW5kZXgsIGNvbnRyb2xOYW1lKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wudG91Y2hlZCB8fCAhY29udHJvbC5lcnJvcnMpIHJldHVybiBbXTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzW1wicmVxdWlyZWRcIl0pIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBjb250cm9sTmFtZSA9PT0gXCJqc29uUGF0aFwiID8gXCJKU09OUGF0aCBpcyByZXF1aXJlZFwiIDogXCJFeHBlY3RlZCB2YWx1ZSBpcyByZXF1aXJlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzW1wiaW52YWxpZFR5cGVcIl0pIHtcbiAgICAgIGVycm9ycy5wdXNoKGNvbnRyb2wuZXJyb3JzW1wibWVzc2FnZVwiXSB8fCBcIkludmFsaWQgdmFsdWVcIik7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvLyBBZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgKGdlbmVyaWMgcGVyIHN0ZXAsIGNhbiBiZSBwcm92aWRlZCBieSBwYXJlbnQpXG4gIEBJbnB1dCgpIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIGFkdmFuY2VkVmFyaWFibGVzRm9ybTogVW50eXBlZEZvcm1BcnJheSA9IG5ldyBVbnR5cGVkRm9ybUFycmF5KFtdKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuZGF0YWJhc2VGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkYkVudmlyb25tZW50OiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBub3JtYWxFbnZpcm9ubWVudDogW1wiXCJdLFxuICAgICAgcXVlcmllczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTtcbiAgICAvLyBJZiBwYXJlbnQgcHJvdmlkZWQgYWR2YW5jZWQgc2V0dGluZ3MsIGJ1aWxkIGZyb20gdGhlbTsgb3RoZXJ3aXNlIGluaXRpYWxpemUgZGVmYXVsdHNcbiAgICBpZiAoXG4gICAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgJiZcbiAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkU2V0dGluZ3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJxdWVyaWVzXCJdICYmICFjaGFuZ2VzW1wicXVlcmllc1wiXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gUmVidWlsZCBmb3JtIGFycmF5IHdoZW4gcXVlcmllcyBjaGFuZ2VcbiAgICAgIGNvbnN0IHF1ZXJpZXNBcnJheSA9IHRoaXMuZGF0YWJhc2VGb3JtLmdldChcInF1ZXJpZXNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIHdoaWxlIChxdWVyaWVzQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHF1ZXJpZXNBcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIG9sZCBhc3NlcnRpb25zIGZvcm1zXG4gICAgICB0aGlzLmFzc2VydGlvbnNGb3Jtcy5mb3JFYWNoKChmb3JtLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5nZXQoaW5kZXgpIS51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmNsZWFyKCk7XG4gICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlYnVpbGQgcXVlcmllcyBhbmQgYXNzZXJ0aW9ucyBmb3Jtc1xuICAgICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHF1ZXJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBFbnN1cmUgYXNzZXJ0aW9uIGRhdGEgaXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgaWYgKCFxdWVyeS5hc3NlcnRpb25EYXRhKSB7XG4gICAgICAgICAgcXVlcnkuYXNzZXJ0aW9uRGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkUXVlcnlUb0Zvcm0ocXVlcnkpO1xuICAgICAgICAvLyBJbml0aWFsaXplIGFzc2VydGlvbnMgZm9ybSBmb3IgZWFjaCBxdWVyeVxuICAgICAgICB0aGlzLmVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZChpbmRleCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gRW5zdXJlIHNlbGVjdGVkIHF1ZXJ5IGluZGV4IGlzIHZhbGlkXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXggPj0gdGhpcy5xdWVyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA9IE1hdGgubWF4KDAsIHRoaXMucXVlcmllcy5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcImluaXRpYWxEYkVudmlyb25tZW50XCJdICYmXG4gICAgICBjaGFuZ2VzW1wiaW5pdGlhbERiRW52aXJvbm1lbnRcIl0uY3VycmVudFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGFiYXNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgZGJFbnZpcm9ubWVudDogY2hhbmdlc1tcImluaXRpYWxEYkVudmlyb25tZW50XCJdLmN1cnJlbnRWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiaW5pdGlhbE5vcm1hbEVudmlyb25tZW50XCJdICYmXG4gICAgICBjaGFuZ2VzW1wiaW5pdGlhbE5vcm1hbEVudmlyb25tZW50XCJdLmN1cnJlbnRWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhYmFzZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIG5vcm1hbEVudmlyb25tZW50OiBjaGFuZ2VzW1wiaW5pdGlhbE5vcm1hbEVudmlyb25tZW50XCJdLmN1cnJlbnRWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcGFyZW50IHVwZGF0ZXMgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcywgcmVidWlsZCBhZHZhbmNlZCBmb3JtXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIl0gJiZcbiAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1xuICAgICkge1xuICAgICAgaWYgKHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkU2V0dGluZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTogdm9pZCB7XG4gICAgLy8gU2V0IGluaXRpYWwgREIgZW52aXJvbm1lbnQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5pbml0aWFsRGJFbnZpcm9ubWVudCkge1xuICAgICAgdGhpcy5kYXRhYmFzZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGRiRW52aXJvbm1lbnQ6IHRoaXMuaW5pdGlhbERiRW52aXJvbm1lbnQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gU2V0IGluaXRpYWwgTm9ybWFsIGVudmlyb25tZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuaW5pdGlhbE5vcm1hbEVudmlyb25tZW50KSB7XG4gICAgICB0aGlzLmRhdGFiYXNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgbm9ybWFsRW52aXJvbm1lbnQ6IHRoaXMuaW5pdGlhbE5vcm1hbEVudmlyb25tZW50LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHF1ZXJpZXMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBhZGQgZGVmYXVsdCBxdWVyeVxuICAgIGlmICh0aGlzLnF1ZXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmFkZE5ld1F1ZXJ5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVlcmllcy5mb3JFYWNoKChxdWVyeSwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gRW5zdXJlIGFzc2VydGlvbiBkYXRhIGlzIGluaXRpYWxpemVkXG4gICAgICAgIGlmICghcXVlcnkuYXNzZXJ0aW9uRGF0YSkge1xuICAgICAgICAgIHF1ZXJ5LmFzc2VydGlvbkRhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFF1ZXJ5VG9Gb3JtKHF1ZXJ5KTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhc3NlcnRpb25zIGZvcm0gZm9yIGVhY2ggcXVlcnlcbiAgICAgICAgdGhpcy5lbnN1cmVBc3NlcnRpb25EYXRhSW5pdGlhbGl6ZWQoaW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXhDaGFuZ2UuZW1pdCgwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHF1ZXJpZXNGb3JtQXJyYXkoKTogVW50eXBlZEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VGb3JtLmdldChcInF1ZXJpZXNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIGFkZE5ld1F1ZXJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1F1ZXJ5OiBEYXRhYmFzZVF1ZXJ5ID0ge1xuICAgICAgaWQ6IGBxdWVyeV8ke0RhdGUubm93KCl9YCxcbiAgICAgIHF1ZXJ5OiBcIlwiLFxuICAgICAgdmFyaWFibGU6IFwiXCIsXG4gICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgYXNzZXJ0aW9uRGF0YTogW10sIC8vIEluaXRpYWxpemUgd2l0aCBlbXB0eSBhc3NlcnRpb24gZGF0YVxuICAgIH07XG4gICAgdGhpcy5xdWVyaWVzLnB1c2gobmV3UXVlcnkpO1xuICAgIHRoaXMuYWRkUXVlcnlUb0Zvcm0obmV3UXVlcnkpO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5xdWVyaWVzLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXggPSBuZXdJbmRleDtcbiAgICAvLyBJbml0aWFsaXplIGFzc2VydGlvbnMgZm9ybSBmb3IgdGhlIG5ldyBxdWVyeVxuICAgIHRoaXMuZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKG5ld0luZGV4KTtcbiAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KTtcbiAgICB0aGlzLmFkZFF1ZXJ5LmVtaXQoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFF1ZXJ5VG9Gb3JtKHF1ZXJ5OiBEYXRhYmFzZVF1ZXJ5KTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnlHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgaWQ6IFtxdWVyeS5pZF0sXG4gICAgICBxdWVyeTogW3F1ZXJ5LnF1ZXJ5LCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhcmlhYmxlOiBbcXVlcnkudmFyaWFibGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgIH0pO1xuICAgIHRoaXMucXVlcmllc0Zvcm1BcnJheS5wdXNoKHF1ZXJ5R3JvdXApO1xuICB9XG5cbiAgZGVsZXRlUXVlcnlCeUlkKHF1ZXJ5SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5xdWVyaWVzLmZpbmRJbmRleCgocSkgPT4gcS5pZCA9PT0gcXVlcnlJZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgLy8gQ2xlYW4gdXAgYXNzZXJ0aW9ucyBmb3JtIGFuZCBzdWJzY3JpcHRpb24gZm9yIHRoaXMgcXVlcnlcbiAgICAgIGlmICh0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmhhcyhpbmRleCkpIHtcbiAgICAgICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5nZXQoaW5kZXgpIS51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmRlbGV0ZShpbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFzc2VydGlvbnNGb3Jtcy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAvLyBSZWluZGV4IHJlbWFpbmluZyBmb3JtcyBhbmQgc3Vic2NyaXB0aW9uc1xuICAgICAgY29uc3QgZm9ybXNUb1JlaW5kZXggPSBuZXcgTWFwPG51bWJlciwgVW50eXBlZEZvcm1Hcm91cD4oKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnNUb1JlaW5kZXggPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaXB0aW9uPigpO1xuXG4gICAgICB0aGlzLmFzc2VydGlvbnNGb3Jtcy5mb3JFYWNoKChmb3JtLCBvbGRJbmRleCkgPT4ge1xuICAgICAgICBpZiAob2xkSW5kZXggPiBpbmRleCkge1xuICAgICAgICAgIGZvcm1zVG9SZWluZGV4LnNldChvbGRJbmRleCAtIDEsIGZvcm0pO1xuICAgICAgICB9IGVsc2UgaWYgKG9sZEluZGV4IDwgaW5kZXgpIHtcbiAgICAgICAgICBmb3Jtc1RvUmVpbmRleC5zZXQob2xkSW5kZXgsIGZvcm0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIsIG9sZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChvbGRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uc1RvUmVpbmRleC5zZXQob2xkSW5kZXggLSAxLCBzdWIpO1xuICAgICAgICB9IGVsc2UgaWYgKG9sZEluZGV4IDwgaW5kZXgpIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zVG9SZWluZGV4LnNldChvbGRJbmRleCwgc3ViKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zID0gZm9ybXNUb1JlaW5kZXg7XG4gICAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9uc1RvUmVpbmRleDtcblxuICAgICAgdGhpcy5xdWVyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID49IHRoaXMucXVlcmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXggPSBNYXRoLm1heCgwLCB0aGlzLnF1ZXJpZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIC8vIEVuc3VyZSBhc3NlcnRpb25zIGZvcm0gaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBuZXcgc2VsZWN0ZWQgcXVlcnlcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLmVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZCh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlUXVlcnkuZW1pdChxdWVyeUlkKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXREYkVudmlyb25tZW50Q29uZmlnKCk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogXCJkYkVudmlyb25tZW50XCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJTZWxlY3QgREIgZW52aXJvbm1lbnRcIixcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiB0aGlzLmRiRW52aXJvbm1lbnRPcHRpb25zLFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoRGJFbnZpcm9ubWVudC5lbWl0KHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldE5vcm1hbEVudmlyb25tZW50Q29uZmlnKCk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogXCJub3JtYWxFbnZpcm9ubWVudFwiLFxuICAgICAgcGxhY2Vob2xkZXI6IFwiU2VsZWN0IE5vcm1hbCBlbnZpcm9ubWVudFwiLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubm9ybWFsRW52aXJvbm1lbnRPcHRpb25zLFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoTm9ybWFsRW52aXJvbm1lbnQuZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRDdXJyZW50UXVlcnkoKTogRGF0YWJhc2VRdWVyeSB8IG51bGwge1xuICAgIGlmIChcbiAgICAgIHRoaXMucXVlcmllcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA+PSAwICYmXG4gICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA8IHRoaXMucXVlcmllcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJpZXNbdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRRdWVyeUZvcm1Hcm91cCgpOiBVbnR5cGVkRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5xdWVyaWVzRm9ybUFycmF5ICYmXG4gICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA+PSAwICYmXG4gICAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA8IHRoaXMucXVlcmllc0Zvcm1BcnJheS5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkuYXQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4XG4gICAgICApIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgb25SdW5RdWVyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYkVudmlyb25tZW50ID0gdGhpcy5kYXRhYmFzZUZvcm0uZ2V0KFwiZGJFbnZpcm9ubWVudFwiKT8udmFsdWU7XG4gICAgY29uc3Qgbm9ybWFsRW52aXJvbm1lbnQgPSB0aGlzLmRhdGFiYXNlRm9ybS5nZXQoXCJub3JtYWxFbnZpcm9ubWVudFwiKT8udmFsdWU7XG4gICAgY29uc3QgY3VycmVudFF1ZXJ5ID0gdGhpcy5nZXRDdXJyZW50UXVlcnkoKTtcbiAgICBjb25zdCBxdWVyeUZvcm1Hcm91cCA9IHRoaXMuZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk7XG5cbiAgICBpZiAoY3VycmVudFF1ZXJ5ICYmIHF1ZXJ5Rm9ybUdyb3VwICYmIGRiRW52aXJvbm1lbnQpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlGb3JtR3JvdXAuZ2V0KFwicXVlcnlcIik/LnZhbHVlIHx8IFwiXCI7XG4gICAgICBjb25zdCB2YXJpYWJsZSA9IHF1ZXJ5Rm9ybUdyb3VwLmdldChcInZhcmlhYmxlXCIpPy52YWx1ZSB8fCBcIlwiO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHF1ZXJ5IG9iamVjdFxuICAgICAgY3VycmVudFF1ZXJ5LnF1ZXJ5ID0gcXVlcnk7XG4gICAgICBjdXJyZW50UXVlcnkudmFyaWFibGUgPSB2YXJpYWJsZTtcblxuICAgICAgdGhpcy5ydW5RdWVyeS5lbWl0KHtcbiAgICAgICAgY3VycmVudFF1ZXJ5LFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgdmFyaWFibGUsXG4gICAgICAgIGRiRW52aXJvbm1lbnQsXG4gICAgICAgIG5vcm1hbEVudmlyb25tZW50OiBub3JtYWxFbnZpcm9ubWVudCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdFF1ZXJ5KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBFbnN1cmUgYXNzZXJ0aW9uIGRhdGEgaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBzZWxlY3RlZCBxdWVyeVxuICAgIHRoaXMuZW5zdXJlQXNzZXJ0aW9uRGF0YUluaXRpYWxpemVkKGluZGV4KTtcbiAgICB0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4Q2hhbmdlLmVtaXQoaW5kZXgpO1xuICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byBlbnN1cmUgYXNzZXJ0aW9ucyBmb3JtIGlzIGRpc3BsYXllZFxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBxdWVyeSBpbmRleFxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRRdWVyeUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWJcbiAgICovXG4gIGdldEFjdGl2ZVRhYigpOiBcIm91dHB1dFwiIHwgXCJ2ZXJpZmljYXRpb25cIiB8IFwiYWR2YW5jZWRcIiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWI7XG4gIH1cblxuICBvblRhYkNoYW5nZSh0YWI6IFwib3V0cHV0XCIgfCBcInZlcmlmaWNhdGlvblwiIHwgXCJhZHZhbmNlZFwiKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRhYjtcbiAgICB0aGlzLmFjdGl2ZVRhYkNoYW5nZS5lbWl0KHRhYik7XG4gICAgLy8gRW5zdXJlIGFzc2VydGlvbnMgZm9ybSBpcyBpbml0aWFsaXplZCB3aGVuIHN3aXRjaGluZyB0byB2ZXJpZmljYXRpb24gdGFiXG4gICAgaWYgKHRhYiA9PT0gXCJ2ZXJpZmljYXRpb25cIikge1xuICAgICAgdGhpcy5lbnN1cmVBc3NlcnRpb25EYXRhSW5pdGlhbGl6ZWQodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29weVJlc3VsdHMoKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Q3VycmVudFF1ZXJ5UmVzdWx0KCk7XG4gICAgaWYgKHJvd3MgJiYgcm93cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkocm93cywgbnVsbCwgMik7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gQ291bGQgZW1pdCBhbiBldmVudCBvciBzaG93IGEgdG9hc3Qgbm90aWZpY2F0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiBtYWluIGZvcm0gaXMgdmFsaWQgKGRiRW52aXJvbm1lbnQgaXMgcmVxdWlyZWQpXG4gICAgaWYgKCF0aGlzLmRhdGFiYXNlRm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIHF1ZXJ5XG4gICAgaWYgKHRoaXMucXVlcmllcy5sZW5ndGggPT09IDAgfHwgdGhpcy5xdWVyaWVzRm9ybUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFsbCBxdWVyaWVzIGhhdmUgdmFsaWQgcXVlcnkgYW5kIHZhcmlhYmxlIGZpZWxkc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzRm9ybUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBxdWVyeUZvcm1Hcm91cCA9IHRoaXMucXVlcmllc0Zvcm1BcnJheS5hdChpKSBhcyBVbnR5cGVkRm9ybUdyb3VwO1xuICAgICAgaWYgKCFxdWVyeUZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5kYXRhYmFzZUZvcm0udmFsdWU7XG5cbiAgICAvLyBTeW5jIGFkdmFuY2VkIHZhcmlhYmxlcyBmcm9tIGZvcm0gdG8gYXJyYXkgYmVmb3JlIGVtaXR0aW5nXG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQoXG4gICAgICAgIGluZGV4XG4gICAgICApIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KFwidmFsdWVcIik/LnZhbHVlO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZUNvbnRyb2w7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGVwRGF0YTogRGF0YWJhc2VGb3JtRGF0YSA9IHtcbiAgICAgIGRiRW52aXJvbm1lbnQ6IGZvcm1WYWx1ZS5kYkVudmlyb25tZW50LFxuICAgICAgbm9ybWFsRW52aXJvbm1lbnQ6IGZvcm1WYWx1ZS5ub3JtYWxFbnZpcm9ubWVudCB8fCB1bmRlZmluZWQsXG4gICAgICBxdWVyaWVzOiB0aGlzLnF1ZXJpZXMubWFwKChxdWVyeSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcXVlcnlGb3JtR3JvdXAgPSB0aGlzLnF1ZXJpZXNGb3JtQXJyYXkuYXQoXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgKSBhcyBVbnR5cGVkRm9ybUdyb3VwO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBxdWVyeS5pZCxcbiAgICAgICAgICBxdWVyeTogcXVlcnlGb3JtR3JvdXAuZ2V0KFwicXVlcnlcIik/LnZhbHVlIHx8IFwiXCIsXG4gICAgICAgICAgdmFyaWFibGU6IHF1ZXJ5Rm9ybUdyb3VwLmdldChcInZhcmlhYmxlXCIpPy52YWx1ZSB8fCBcIlwiLFxuICAgICAgICAgIHN0YXR1czogcXVlcnkuc3RhdHVzLFxuICAgICAgICAgIGFzc2VydGlvbkRhdGE6IHF1ZXJ5LmFzc2VydGlvbkRhdGEgfHwgW10sIC8vIEluY2x1ZGUgYXNzZXJ0aW9uIGRhdGFcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLFxuICAgIH07XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRDdXJyZW50UXVlcnlSZXN1bHQoKTtcbiAgICBpZiAoIXJvd3MgfHwgcm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJvd3NbMF0pO1xuICB9XG5cbiAgLyoqIEdldCByZXN1bHQgcm93cyBmb3IgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXJ5LiAqL1xuICBnZXRDdXJyZW50UXVlcnlSZXN1bHQoKTogYW55W10ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnF1ZXJpZXNbdGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXhdO1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY3VycmVudC5xdWVyeVJlc3VsdCkgJiZcbiAgICAgIGN1cnJlbnQucXVlcnlSZXN1bHQubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQucXVlcnlSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXNzZXJ0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAgICovXG4gIGdldEFzc2VydGlvbkRhdGFGb3JRdWVyeShxdWVyeUluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF07XG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5LmFzc2VydGlvbkRhdGEpIHtcbiAgICAgIHJldHVybiBxdWVyeS5hc3NlcnRpb25EYXRhO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFzc2VydGlvbiBkYXRhIGNoYW5nZSBmcm9tIGV4dGVybmFsIGNvbXBvbmVudFxuICAgKi9cbiAgb25Bc3NlcnRpb25EYXRhQ2hhbmdlKGFzc2VydGlvbkRhdGE6IGFueVtdLCBxdWVyeUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdKSB7XG4gICAgICAvLyBDcmVhdGUgYSBkZWVwIGNvcHkgdG8gZW5zdXJlIGVhY2ggcXVlcnkgaGFzIGl0cyBvd24gZGF0YVxuICAgICAgaWYgKGFzc2VydGlvbkRhdGEgJiYgYXNzZXJ0aW9uRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucXVlcmllc1txdWVyeUluZGV4XS5hc3NlcnRpb25EYXRhID0gYXNzZXJ0aW9uRGF0YS5tYXAoXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGV4cGVjdGVkVmFsdWUgaXMgcHJvcGVybHkgZm9ybWF0dGVkXG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBpdGVtLmV4cGVjdGVkVHlwZSB8fCBcInN0cmluZ1wiO1xuICAgICAgICAgICAgbGV0IGV4cGVjdGVkVmFsdWUgPSBpdGVtLmV4cGVjdGVkVmFsdWU7XG5cbiAgICAgICAgICAgIC8vIEZvciBvYmplY3QvYXJyYXkgdHlwZXMsIGVuc3VyZSBleHBlY3RlZFZhbHVlIGlzIGFuIG9iamVjdC9hcnJheSwgbm90IGEgc3RyaW5nXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IEpTT04ucGFyc2UoZXhwZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBwYXJzaW5nIGZhaWxzLCBrZWVwIGFzIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBleHBlY3RlZFR5cGUgPT09IFwiYXJyYXlcIiAmJlxuICAgICAgICAgICAgICB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IEpTT04ucGFyc2UoZXhwZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBwYXJzaW5nIGZhaWxzLCBrZWVwIGFzIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBleHBlY3RlZFR5cGUgPT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID1cbiAgICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlICE9PSBcIlwiID8gTnVtYmVyKGV4cGVjdGVkVmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRWYWx1ZSA9PT0gXCJ0cnVlXCIgfHwgZXhwZWN0ZWRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVmFsdWUgPT09IFwiZmFsc2VcIiB8fCBleHBlY3RlZFZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBqc29uUGF0aDogaXRlbS5qc29uUGF0aCB8fCBcIlwiLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlOiBpdGVtLnZlcmlmaWNhdGlvblR5cGUgfHwgXCJlcXVhbHNcIixcbiAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGUsXG4gICAgICAgICAgICAgIGV4cGVjdGVkVmFsdWU6IGV4cGVjdGVkVmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucXVlcmllc1txdWVyeUluZGV4XS5hc3NlcnRpb25EYXRhID0gW107XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgdGhlIGNoYW5nZSB0byBwYXJlbnRcbiAgICAgIHRoaXMuYXNzZXJ0aW9uRGF0YUNoYW5nZS5lbWl0KHtcbiAgICAgICAgcXVlcnlJbmRleDogcXVlcnlJbmRleCxcbiAgICAgICAgYXNzZXJ0aW9uRGF0YTogdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdLmFzc2VydGlvbkRhdGEgfHwgW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhc3NlcnRpb24gZGF0YSBmb3IgYSBxdWVyeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZChxdWVyeUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdICYmICF0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF0uYXNzZXJ0aW9uRGF0YSkge1xuICAgICAgdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdLmFzc2VydGlvbkRhdGEgPSBbXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBhc3NlcnRpb25zIGZvcm0gZm9yIHRoaXMgcXVlcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmICghdGhpcy5hc3NlcnRpb25zRm9ybXMuaGFzKHF1ZXJ5SW5kZXgpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVBc3NlcnRpb25zRm9ybShxdWVyeUluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhc3NlcnRpb25zIGZvcm0gZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFzc2VydGlvbnNGb3JtKHF1ZXJ5SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFzc2VydGlvbnNBcnJheSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgIGNvbnN0IGFzc2VydGlvbnNGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBhc3NlcnRpb25zOiBhc3NlcnRpb25zQXJyYXksXG4gICAgfSk7XG4gICAgdGhpcy5hc3NlcnRpb25zRm9ybXMuc2V0KHF1ZXJ5SW5kZXgsIGFzc2VydGlvbnNGb3JtKTtcblxuICAgIC8vIExvYWQgZXhpc3RpbmcgYXNzZXJ0aW9ucyBpZiB0aGV5IGV4aXN0XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbcXVlcnlJbmRleF07XG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5LmFzc2VydGlvbkRhdGEgJiYgcXVlcnkuYXNzZXJ0aW9uRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWRBc3NlcnRpb25zRm9yUXVlcnkocXVlcnlJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGZvcm0gY2hhbmdlc1xuICAgIHRoaXMuc3Vic2NyaWJlVG9Bc3NlcnRpb25zRm9ybUNoYW5nZXMocXVlcnlJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFzc2VydGlvbnMgZm9ybSBmb3IgY3VycmVudCBxdWVyeVxuICAgKi9cbiAgZ2V0Q3VycmVudEFzc2VydGlvbnNGb3JtKCk6IFVudHlwZWRGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5hc3NlcnRpb25zRm9ybXMuaGFzKHRoaXMuc2VsZWN0ZWRRdWVyeUluZGV4KSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmdldCh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCkhO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLmVuc3VyZUFzc2VydGlvbkRhdGFJbml0aWFsaXplZCh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCk7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmdldCh0aGlzLnNlbGVjdGVkUXVlcnlJbmRleCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXNzZXJ0aW9ucyBmb3JtIGFycmF5IGZvciBjdXJyZW50IHF1ZXJ5XG4gICAqL1xuICBnZXRBc3NlcnRpb25zRm9ybUFycmF5KCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEN1cnJlbnRBc3NlcnRpb25zRm9ybSgpO1xuICAgIGlmIChmb3JtKSB7XG4gICAgICByZXR1cm4gZm9ybS5nZXQoXCJhc3NlcnRpb25zXCIpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFzc2VydGlvbnMgaW50byBmb3JtIGZvciBhIHNwZWNpZmljIHF1ZXJ5XG4gICAqL1xuICBwcml2YXRlIGxvYWRBc3NlcnRpb25zRm9yUXVlcnkocXVlcnlJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmdldChxdWVyeUluZGV4KTtcbiAgICBpZiAoIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KFwiYXNzZXJ0aW9uc1wiKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdO1xuICAgIGlmICghcXVlcnkgfHwgIXF1ZXJ5LmFzc2VydGlvbkRhdGEpIHJldHVybjtcblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIExvYWQgYXNzZXJ0aW9uc1xuICAgIHF1ZXJ5LmFzc2VydGlvbkRhdGEuZm9yRWFjaCgoYXNzZXJ0aW9uOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGFzc2VydGlvbi5leHBlY3RlZFR5cGUgfHwgXCJzdHJpbmdcIjtcbiAgICAgIGxldCBleHBlY3RlZFZhbHVlOiBhbnkgPSBcIlwiO1xuXG4gICAgICBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgICAgICBleHBlY3RlZFZhbHVlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm9iamVjdFwiIHx8IGV4cGVjdGVkVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICBleHBlY3RlZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUsIG51bGwsIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSB8fCBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9XG4gICAgICAgICAgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgPT09IHRydWUgfHwgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgPT09IFwidHJ1ZVwiXG4gICAgICAgICAgICA/IFwidHJ1ZVwiXG4gICAgICAgICAgICA6IFwiZmFsc2VcIjtcbiAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGV4cGVjdGVkVmFsdWUgPVxuICAgICAgICAgIGFzc2VydGlvbi5leHBlY3RlZFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBTdHJpbmcoYXNzZXJ0aW9uLmV4cGVjdGVkVmFsdWUpXG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBlY3RlZFZhbHVlID1cbiAgICAgICAgICBhc3NlcnRpb24uZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgIGFzc2VydGlvbi5leHBlY3RlZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gU3RyaW5nKGFzc2VydGlvbi5leHBlY3RlZFZhbHVlKVxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFthc3NlcnRpb24uanNvblBhdGggfHwgXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHZlcmlmaWNhdGlvblR5cGU6IFthc3NlcnRpb24udmVyaWZpY2F0aW9uVHlwZSB8fCBcImVxdWFsc1wiXSxcbiAgICAgICAgZXhwZWN0ZWRUeXBlOiBbZXhwZWN0ZWRUeXBlXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogW1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUsXG4gICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuZXhwZWN0ZWRWYWx1ZVZhbGlkYXRvcl0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZm9ybUFycmF5LnB1c2goZm9ybUdyb3VwKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYXNzZXJ0aW9ucyBmb3JtIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Bc3NlcnRpb25zRm9ybUNoYW5nZXMocXVlcnlJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmdldChxdWVyeUluZGV4KTtcbiAgICBpZiAoIWZvcm0pIHJldHVybjtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGV4aXN0c1xuICAgIGlmICh0aGlzLmZvcm1TdWJzY3JpcHRpb25zLmhhcyhxdWVyeUluZGV4KSkge1xuICAgICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5nZXQocXVlcnlJbmRleCkhLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoXCJhc3NlcnRpb25zXCIpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ybUFycmF5LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0QXNzZXJ0aW9uRGF0YUZvclF1ZXJ5KHF1ZXJ5SW5kZXgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5zZXQocXVlcnlJbmRleCwgc3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFzc2VydGlvbiBkYXRhIGZvciBhIHNwZWNpZmljIHF1ZXJ5XG4gICAqL1xuICBwcml2YXRlIGVtaXRBc3NlcnRpb25EYXRhRm9yUXVlcnkocXVlcnlJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuYXNzZXJ0aW9uc0Zvcm1zLmdldChxdWVyeUluZGV4KTtcbiAgICBpZiAoIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KFwiYXNzZXJ0aW9uc1wiKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGNvbnN0IGFzc2VydGlvbkRhdGEgPSBmb3JtQXJyYXkuY29udHJvbHNcbiAgICAgIC5tYXAoKGNvbnRyb2wpID0+IHtcbiAgICAgICAgaWYgKCEoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHZhbHVlLmV4cGVjdGVkVHlwZSB8fCBcInN0cmluZ1wiO1xuICAgICAgICBsZXQgZXhwZWN0ZWRWYWx1ZTogYW55ID0gdmFsdWUuZXhwZWN0ZWRWYWx1ZTtcblxuICAgICAgICAvLyBQYXJzZSBleHBlY3RlZFZhbHVlIGJhc2VkIG9uIHR5cGVcbiAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgICBleHBlY3RlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRWYWx1ZSAhPT0gXCJcIiA/IE51bWJlcihleHBlY3RlZFZhbHVlKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGV4cGVjdGVkVmFsdWUgPSBleHBlY3RlZFZhbHVlID09PSBcInRydWVcIiB8fCBleHBlY3RlZFZhbHVlID09PSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJhcnJheVwiIHx8IGV4cGVjdGVkVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RlZFZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IEpTT04ucGFyc2UoZXhwZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIEtlZXAgYXMgc3RyaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwZWN0ZWRWYWx1ZSA9IFN0cmluZyhleHBlY3RlZFZhbHVlIHx8IFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBqc29uUGF0aDogKHZhbHVlLmpzb25QYXRoIHx8IFwiXCIpLnRyaW0oKSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlOiB2YWx1ZS52ZXJpZmljYXRpb25UeXBlIHx8IFwiZXF1YWxzXCIsXG4gICAgICAgICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGUsXG4gICAgICAgICAgZXhwZWN0ZWRWYWx1ZTogZXhwZWN0ZWRWYWx1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBudWxsICYmIGl0ZW0hLmpzb25QYXRoKSBhcyBhbnlbXTtcblxuICAgIC8vIFVwZGF0ZSBxdWVyeSdzIGFzc2VydGlvbiBkYXRhXG4gICAgaWYgKHRoaXMucXVlcmllc1txdWVyeUluZGV4XSkge1xuICAgICAgdGhpcy5xdWVyaWVzW3F1ZXJ5SW5kZXhdLmFzc2VydGlvbkRhdGEgPSBhc3NlcnRpb25EYXRhO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdG8gcGFyZW50XG4gICAgdGhpcy5hc3NlcnRpb25EYXRhQ2hhbmdlLmVtaXQoe1xuICAgICAgcXVlcnlJbmRleDogcXVlcnlJbmRleCxcbiAgICAgIGFzc2VydGlvbkRhdGE6IGFzc2VydGlvbkRhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGFzc2VydGlvblxuICAgKi9cbiAgYWRkQXNzZXJ0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpO1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAganNvblBhdGg6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZlcmlmaWNhdGlvblR5cGU6IFtcImVxdWFsc1wiXSxcbiAgICAgIGV4cGVjdGVkVHlwZTogW3RoaXMuZGVmYXVsdEV4cGVjdGVkVHlwZV0sXG4gICAgICBleHBlY3RlZFZhbHVlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuZXhwZWN0ZWRWYWx1ZVZhbGlkYXRvcl1dLFxuICAgIH0pO1xuICAgIGZvcm1BcnJheS5wdXNoKGZvcm1Hcm91cCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGlmICh0aGlzLmFzc2VydGlvbnNUYWJsZSkge1xuICAgICAgdGhpcy5hc3NlcnRpb25zVGFibGUucmVuZGVyUm93cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gYXNzZXJ0aW9uXG4gICAqL1xuICByZW1vdmVBc3NlcnRpb24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpO1xuICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGlmICh0aGlzLmFzc2VydGlvbnNUYWJsZSkge1xuICAgICAgdGhpcy5hc3NlcnRpb25zVGFibGUucmVuZGVyUm93cygpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRBc3NlcnRpb25EYXRhRm9yUXVlcnkodGhpcy5zZWxlY3RlZFF1ZXJ5SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3JtIGNvbnRyb2wgYXQgc3BlY2lmaWMgaW5kZXhcbiAgICovXG4gIGdldEZvcm1Db250cm9sQXQoaW5kZXg6IG51bWJlciwgY29udHJvbE5hbWU6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZm9ybUFycmF5Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybUFycmF5LmF0KGluZGV4KSBhcyBVbnR5cGVkRm9ybUdyb3VwO1xuICAgIHJldHVybiBmb3JtR3JvdXA/LmdldChjb250cm9sTmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhwZWN0ZWQgdHlwZSBmb3IgYW4gYXNzZXJ0aW9uXG4gICAqL1xuICBnZXRFeHBlY3RlZFR5cGUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRBc3NlcnRpb25zRm9ybUFycmF5KCk7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmb3JtQXJyYXkubGVuZ3RoKSByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtQXJyYXkuYXQoaW5kZXgpIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgcmV0dXJuIGZvcm1Hcm91cD8uZ2V0KFwiZXhwZWN0ZWRUeXBlXCIpPy52YWx1ZSB8fCBcInN0cmluZ1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBleHBlY3RlZCB2YWx1ZSBwbGFjZWhvbGRlclxuICAgKi9cbiAgZ2V0RXhwZWN0ZWRWYWx1ZVBsYWNlaG9sZGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHRoaXMuZ2V0RXhwZWN0ZWRUeXBlKGluZGV4KTtcbiAgICBzd2l0Y2ggKGV4cGVjdGVkVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gXCJFbnRlciB2YWx1ZVwiO1xuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIHJldHVybiBcIkVudGVyIEpTT04gYXJyYXlcIjtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIFwiRW50ZXIgSlNPTiBvYmplY3RcIjtcbiAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgIHJldHVybiBcIk5vIHZhbHVlIHJlcXVpcmVkXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJFbnRlciB2YWx1ZVwiO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXhwZWN0ZWQgdHlwZSBjaGFuZ2VcbiAgICovXG4gIG9uRXhwZWN0ZWRUeXBlQ2hhbmdlKGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmdldEFzc2VydGlvbnNGb3JtQXJyYXkoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZvcm1BcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgVW50eXBlZEZvcm1Hcm91cDtcbiAgICBjb25zdCBleHBlY3RlZFZhbHVlQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoXCJleHBlY3RlZFZhbHVlXCIpO1xuICAgIGlmICghZXhwZWN0ZWRWYWx1ZUNvbnRyb2wpIHJldHVybjtcblxuICAgIGxldCBuZXdWYWx1ZTogYW55ID0gXCJcIjtcbiAgICBpZiAodmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBuZXdWYWx1ZSA9IFwidHJ1ZVwiO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwibnVsbFwiKSB7XG4gICAgICBuZXdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZXhwZWN0ZWRWYWx1ZUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgZXhwZWN0ZWRWYWx1ZUNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGlmICh2YWx1ZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgIGV4cGVjdGVkVmFsdWVDb250cm9sLnNldFZhbGlkYXRvcnMoW3RoaXMuZXhwZWN0ZWRWYWx1ZVZhbGlkYXRvcl0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IFwiYXJyYXlcIikge1xuICAgICAgZXhwZWN0ZWRWYWx1ZUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3RlZFZhbHVlQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgdGhpcy5leHBlY3RlZFZhbHVlVmFsaWRhdG9yLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBleHBlY3RlZFZhbHVlQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdGVkIHZhbHVlIHZhbGlkYXRvclxuICAgKi9cbiAgZXhwZWN0ZWRWYWx1ZVZhbGlkYXRvciA9IChcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRyb2wucGFyZW50Py5nZXQoXCJleHBlY3RlZFR5cGVcIik/LnZhbHVlO1xuICAgIGlmICghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDAgJiYgdmFsdWUgIT09IGZhbHNlKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4geyBpbnZhbGlkVHlwZTogdHJ1ZSwgbWVzc2FnZTogXCJJbnZhbGlkIG51bWJlciB2YWx1ZVwiIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICE9PSBcInRydWVcIiAmJlxuICAgICAgICB2YWx1ZSAhPT0gXCJmYWxzZVwiICYmXG4gICAgICAgIHZhbHVlICE9PSB0cnVlICYmXG4gICAgICAgIHZhbHVlICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7IGludmFsaWRUeXBlOiB0cnVlLCBtZXNzYWdlOiBcIkludmFsaWQgYm9vbGVhbiB2YWx1ZVwiIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaW52YWxpZFR5cGU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVmFsdWUgbXVzdCBiZSBhIHZhbGlkIEpTT04gYXJyYXlcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGludmFsaWRUeXBlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIEFycmF5IHZhbHVlIC0gbXVzdCBiZSB2YWxpZCBKU09OXCIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSAmJiB2YWx1ZS50cmltKCkgIT09IFwie31cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcnNlZCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHBhcnNlZCAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwYXJzZWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpbnZhbGlkVHlwZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgSlNPTiBvYmplY3RcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGludmFsaWRUeXBlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIE9iamVjdCB2YWx1ZSAtIG11c3QgYmUgdmFsaWQgSlNPTlwiLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGFzc2VydGlvbnMgZGF0YSBzb3VyY2UgZm9yIHRhYmxlXG4gICAqL1xuICBnZXQgYXNzZXJ0aW9uc0RhdGFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpLmNvbnRyb2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGJ5IGZ1bmN0aW9uIGZvciB0YWJsZSByb3dzXG4gICAqL1xuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uc1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBkYXRhYmFzZSBzdGVwcy5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFkdmFuY2VkU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiBcImlzU3RlcE9wdGlvbmFsXCIsXG4gICAgICAgIGxhYmVsOiBcIkRvbid0IGZhaWwgdGhlIHRlc3QgaWYgdGhpcyBzdGVwIGZhaWxzLlwiLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJzaG91bGRTa2lwXCIsXG4gICAgICAgIGxhYmVsOiBcIlNraXAgdGhpcyBzdGVwIGR1cmluZyBleGVjdXRpb24uXCIsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUpID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgIHZhcmlhYmxlLnR5cGUgPT09IFwiYm9vbGVhblwiIHx8IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICA/IHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8XG4gICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID09PSAxXG4gICAgICAgICAgOiB2YXJpYWJsZS52YWx1ZSB8fCBcIlwiO1xuXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCBcInN0cmluZ1wiXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCBcIlwiXSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhZHZhbmNlZCBib29sZWFuIGNoYW5nZXMgYW5kIGtlZXAgZGF0YS9mb3JtIGluIHN5bmMuXG4gICAqL1xuICBvbkFkdmFuY2VkVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQoXG4gICAgICAodikgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuZ2V0KFwibmFtZVwiKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybVxuICAgICAgICAuYXQodmFyaWFibGVJbmRleClcbiAgICAgICAgLmdldChcInZhbHVlXCIpXG4gICAgICAgID8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG5vbi1ib29sZWFuIGFkdmFuY2VkIHZhcmlhYmxlIGNoYW5nZXMgKHJlc2VydmVkIGZvciBmdXR1cmUgdXNlKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZChcbiAgICAgICh2KSA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICAoY29udHJvbCkgPT4gY29udHJvbC5nZXQoXCJuYW1lXCIpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtXG4gICAgICAgIC5hdCh2YXJpYWJsZUluZGV4KVxuICAgICAgICAuZ2V0KFwidmFsdWVcIilcbiAgICAgICAgPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIHt7IGVkaXRNb2RlID8gJ1VwZGF0ZSBEYXRhYmFzZSBUZXN0IFN0ZXAnIDogJ0NyZWF0ZSBEYXRhYmFzZSBUZXN0IFN0ZXAnIH19XG4gIDwvaDI+XG5cbiAgPCEtLSBFbnZpcm9ubWVudCBTZWN0aW9uIChzZXBhcmF0b3IgbGluZSBvbmx5IG9uIGJvdHRvbSkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0xLjUgY3FhLXBiLVswLjVyZW1dIGNxYS1tYi00IGNxYS1ib3JkZXItMCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtNCBjcWEtaXRlbXMtc3RhcnRcIj5cbiAgICAgIDwhLS0gREIgRW52aXJvbm1lbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1ibG9ja1wiPlxuICAgICAgICAgIERCIEVudmlyb25tZW50IDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZGF0YWJhc2VGb3JtXCIgW2NvbmZpZ109XCJnZXREYkVudmlyb25tZW50Q29uZmlnKClcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBVc2VzIERhdGFiYXNlIGVudmlyb25tZW50cyBmcm9tIEVudmlyb25tZW50cy5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTm9ybWFsIEVudmlyb25tZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBOb3JtYWwgRW52aXJvbm1lbnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJkYXRhYmFzZUZvcm1cIiBbY29uZmlnXT1cImdldE5vcm1hbEVudmlyb25tZW50Q29uZmlnKClcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBVc2VzIE5vcm1hbCBlbnZpcm9ubWVudHMgZnJvbSBFbnZpcm9ubWVudHMuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQgY3FhLW10LTJcIj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiB0ZXh0PVwiUnVuIFF1ZXJ5XCIgKGNsaWNrZWQpPVwib25SdW5RdWVyeSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXRhYmFzZUZvcm0uZ2V0KCdkYkVudmlyb25tZW50Jyk/LnZhbHVlIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCInIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCAhY3FhLXB0LVsxMHB4XSAhY3FhLXBiLVsxMHB4XSAhY3FhLXBsLVsyNHB4XSAhY3FhLXByLVsyNHB4XSAhY3FhLWdhcC1bOHB4XSBjcWEtcm91bmRlZC1sZyBjcWEtbWluLWgtWzM3cHhdIGhvdmVyOiFjcWEtYmctWyMxQjFGRUJdIGNxYS1mbGV4LXNocmluay0wJ1wiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIE1haW4gQ29udGVudDogVHdvIENvbHVtbiBMYXlvdXQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLVsxMnB4XSBjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLW1iLTZcIj5cbiAgICA8IS0tIExlZnQgUGFuZWw6IFF1ZXJ5IExpc3QgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtdy1bMTc1cHhdIGNxYS1taW4tdy1bMTc1cHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyLTAgY3FhLWJvcmRlci1yIGNxYS1ib3JkZXItci1bMXB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMEUwRTBdIGNxYS1iZy1bI0ZBRkFGQV0gY3FhLW92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHF1ZXJ5IG9mIHF1ZXJpZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtWzEwcHhdIGNxYS13LWZ1bGwgY3FhLXB0LVsxNHB4XSBjcWEtcGItWzE0cHhdIGNxYS1wbC1bMTZweF0gY3FhLXByLVsxNnB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLW1iLTFcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtYmctYmx1ZS01MF09XCJzZWxlY3RlZFF1ZXJ5SW5kZXggPT09IGlcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyXT1cInNlbGVjdGVkUXVlcnlJbmRleCA9PT0gaVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItYmx1ZS01MDBdPVwic2VsZWN0ZWRRdWVyeUluZGV4ID09PSBpXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWJnLWdyZXktNDAwXT1cInNlbGVjdGVkUXVlcnlJbmRleCAhPT0gaVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0UXVlcnkoaSlcIlxuICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiA0OXB4OyBtaW4taGVpZ2h0OiA0OXB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktOTAwXCI+UXVlcnkge3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgPGNxYS1iYWRnZSAqbmdJZj1cInF1ZXJ5LnN0YXR1c1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwicXVlcnkuc3RhdHVzID09PSAncGFzc2VkJyA/ICdQYXNzZWQnIDogcXVlcnkuc3RhdHVzID09PSAnZmFpbGVkJyA/ICdGYWlsZWQnIDogJ1BlbmRpbmcnXCJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cInF1ZXJ5LnN0YXR1cyA9PT0gJ3Bhc3NlZCcgPyAnc3VjY2VzcycgOiBxdWVyeS5zdGF0dXMgPT09ICdmYWlsZWQnID8gJ2Vycm9yJyA6ICdkZWZhdWx0J1wiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmlnaHQgUGFuZWw6IFF1ZXJ5IEVkaXRvciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtcm91bmRlZC1sZyBjcWEtZ2FwLVsxMHB4XSBjcWEtbWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzZweF1cIiBzdHlsZT1cIndpZHRoOiA1MCU7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS05MDAgY3FhLXRleHQtWzE0cHhdXCI+UXVlcnkgJiBTdG9yZSBSZXNwb25zZTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyNFRjQ0NDRdIGNxYS1tbC0wLjVcIj4qPC9zcGFuPjwvaDM+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPCEtLSBTUUwgUXVlcnkgVGV4dGFyZWEgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTAgY3FhLXctZnVsbCBjcWEtcm91bmRlZC1tZCBjcWEtYmctZ3JheS01MC81MFwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIHlvdXIgU1FMIHF1ZXJ5IGhlcmUuLi4nXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk/LmdldCgncXVlcnknKT8udmFsdWUgfHwgJydcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI4XCJcbiAgICAgICAgICAgICAgICBbdGV4dGFyZWFJbmxpbmVTdHlsZV09XCIncGFkZGluZzogMXJlbTsnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0Q3VycmVudFF1ZXJ5Rm9ybUdyb3VwKCk/LmdldCgncXVlcnknKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTBweF0gY3FhLW1iLVs4cHhdXCI+XG5cblxuICAgICAgICAgIDwhLS0gVmFyaWFibGUgSW5wdXQgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTFcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjUgY3FhLWJsb2NrIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIFZhcmlhYmxlPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bI0VGNDQ0NF0gY3FhLW1sLTAuNVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVmFyaWFibGUgbmFtZSdcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRDdXJyZW50UXVlcnlGb3JtR3JvdXAoKT8uZ2V0KCd2YXJpYWJsZScpPy52YWx1ZSB8fCAnJ1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImdldEN1cnJlbnRRdWVyeUZvcm1Hcm91cCgpPy5nZXQoJ3ZhcmlhYmxlJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LWdyYXktNTAwIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgICAgVXNlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmUuIE5vIHNwYWNlcy4gVW5pcXVlIHBlciBzdGVwLiBDYXNlIHNlbnNpdGl2ZS5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAocGlubmVkIHRvIGJvdHRvbSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tdC1hdXRvXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQWRkIFF1ZXJ5XCIgaWNvbj1cImFkZFwiIChjbGlja2VkKT1cImFkZE5ld1F1ZXJ5KClcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1iZy13aGl0ZSAhY3FhLWJvcmRlci1bIzQxNDE0Nl0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM0MTQxNDZdIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCAhY3FhLXB5LVsxMHB4XSAhY3FhLXB4LVsxMHB4XSAhY3FhLWdhcC1bOHB4XSBjcWEtcm91bmRlZC1sZyBob3ZlcjohY3FhLWJvcmRlci1bIzQxNDE0Nl0gaG92ZXI6Y3FhLWJnLWdyYXktNTAnXCJcbiAgICAgICAgICAgICAgW2ljb25Db2xvcl09XCInIzQxNDE0NidcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLW1pbi13LVs0MHB4XSBjcWEtdy0xMCBjcWEtaC05IGNxYS1yb3VuZGVkIGNxYS1iZy1ncmF5LTEwMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtYmctZ3JheS0yMDAgY3FhLXAtMCdcIlxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCInRGVsZXRlIHF1ZXJ5J1wiIChjbGlja2VkKT1cImRlbGV0ZVF1ZXJ5QnlJZChnZXRDdXJyZW50UXVlcnkoKT8uaWQgfHwgJycpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInF1ZXJpZXMubGVuZ3RoIDw9IDFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUgcXVlcnknXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM2QjcyODBcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiB0ZXh0PVwiUnVuXCIgaWNvbj1cInBsYXlfYXJyb3dcIiAoY2xpY2tlZCk9XCJvblJ1blF1ZXJ5KClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWdldEN1cnJlbnRRdWVyeUZvcm1Hcm91cCgpPy5nZXQoJ3F1ZXJ5Jyk/LnZhbHVlIHx8ICFkYXRhYmFzZUZvcm0uZ2V0KCdkYkVudmlyb25tZW50Jyk/LnZhbHVlIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCAhY3FhLXB0LVsxMHB4XSAhY3FhLXBiLVsxMHB4XSAhY3FhLXBsLVsxNnB4XSAhY3FhLXByLVsyNHB4XSAhY3FhLWdhcC1bOHB4XSBjcWEtcm91bmRlZC1sZyBjcWEtbWluLWgtWzM4cHhdIGhvdmVyOiFjcWEtYmctWyMxQjFGRUJdICFjcWEtYm9yZGVyLW5vbmUnXCJcbiAgICAgICAgICAgICAgW2ljb25Db2xvcl09XCInI0ZCRkNGRidcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gUmVzdWx0cyBTZWN0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXJvdW5kZWQtbGcgY3FhLW1iLTZcIj5cbiAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtYmctZ3JheS01MFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJvcmRlci1iLTJcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAnb3V0cHV0J1wiIFtjbGFzcy5jcWEtYm9yZGVyLWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAnb3V0cHV0J1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLXRleHQtZ3JheS02MDBdPVwic2VsZWN0ZWRUYWIgIT09ICdvdXRwdXQnXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLXRyYW5zcGFyZW50XT1cInNlbGVjdGVkVGFiICE9PSAnb3V0cHV0J1wiIChjbGljayk9XCJvblRhYkNoYW5nZSgnb3V0cHV0JylcIj5cbiAgICAgICAgICAgIE91dHB1dFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJvcmRlci1iLTJcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LWJsdWUtNjAwXT1cInNlbGVjdGVkVGFiID09PSAndmVyaWZpY2F0aW9uJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1ibHVlLTYwMF09XCJzZWxlY3RlZFRhYiA9PT0gJ3ZlcmlmaWNhdGlvbidcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LWdyYXktNjAwXT1cInNlbGVjdGVkVGFiICE9PSAndmVyaWZpY2F0aW9uJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci10cmFuc3BhcmVudF09XCJzZWxlY3RlZFRhYiAhPT0gJ3ZlcmlmaWNhdGlvbidcIiAoY2xpY2spPVwib25UYWJDaGFuZ2UoJ3ZlcmlmaWNhdGlvbicpXCI+XG4gICAgICAgICAgICBWZXJpZmljYXRpb25cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcHgtNCBjcWEtcHktMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1ib3JkZXItYi0yXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC1ibHVlLTYwMF09XCJzZWxlY3RlZFRhYiA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1ibHVlLTYwMF09XCJzZWxlY3RlZFRhYiA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLXRleHQtZ3JheS02MDBdPVwic2VsZWN0ZWRUYWIgIT09ICdhZHZhbmNlZCdcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItdHJhbnNwYXJlbnRdPVwic2VsZWN0ZWRUYWIgIT09ICdhZHZhbmNlZCdcIiAoY2xpY2spPVwib25UYWJDaGFuZ2UoJ2FkdmFuY2VkJylcIj5cbiAgICAgICAgICAgIEFkdmFuY2VkXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGFiIENvbnRlbnQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC00XCI+XG4gICAgICAgICAgPCEtLSBPdXRwdXQgVGFiIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ291dHB1dCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTNcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS05MDBcIj5RdWVyeSBSZXN1bHRzPC9oND5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQ29weVwiIGljb249XCJjb250ZW50X2NvcHlcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LWJsdWUtNjAwJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25Db3B5UmVzdWx0cygpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFJlc3VsdHMgVGFibGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Q3VycmVudFF1ZXJ5UmVzdWx0KCkubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLW92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1ib3JkZXItY29sbGFwc2VcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJjcWEtYmctZ3JheS01MCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGtleSBvZiBnZXRUYWJsZUNvbHVtbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcHgtNCBjcWEtcHktMiBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktNzAwIGNxYS11cHBlcmNhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBrZXkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBnZXRDdXJyZW50UXVlcnlSZXN1bHQoKVwiIGNsYXNzPVwiY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDAgaG92ZXI6Y3FhLWJnLWdyYXktNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBrZXkgb2YgZ2V0VGFibGVDb2x1bW5zKClcIiBjbGFzcz1cImNxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcm93W2tleV0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Q3VycmVudFF1ZXJ5UmVzdWx0KCkubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgICAgTm8gcmVzdWx0cyB5ZXQuIFJ1biBhIHF1ZXJ5IHRvIHNlZSByZXN1bHRzLlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFZlcmlmaWNhdGlvbiBUYWIgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAndmVyaWZpY2F0aW9uJ1wiIGNsYXNzPVwiYXNzZXJ0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXNzZXJ0aW9ucy1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+QXNzZXJ0aW9uczwvaDM+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWFkZXItc3VidGl0bGVcIj5Vc2UgSlNPTlBhdGggdG8gdGFyZ2V0IHZhbHVlcyBpbiB0aGUgcXVlcnkgb3V0cHV0LjwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICB0ZXh0PVwiQWRkIEFzc2VydGlvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhZGQtYXNzZXJ0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYmctd2hpdGUgIWNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkICFjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXdoaXRlc3BhY2Utbm93cmFwICFjcWEtcHktWzEwcHhdICFjcWEtcHgtWzE2cHhdICFjcWEtZ2FwLVs4cHhdIGNxYS1yb3VuZGVkLWxnIGhvdmVyOiFjcWEtYm9yZGVyLVsjMUIxRkVCXSBob3ZlcjohY3FhLXRleHQtWyMxQjFGRUJdIGhvdmVyOmNxYS1iZy1bI0Y1RjVGRl0nXCJcbiAgICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cIicjM0Y0M0VFJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwiYWRkQXNzZXJ0aW9uKClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gVGFibGUgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxmb3JtICpuZ0lmPVwiZ2V0Q3VycmVudEFzc2VydGlvbnNGb3JtKClcIiBbZm9ybUdyb3VwXT1cImdldEN1cnJlbnRBc3NlcnRpb25zRm9ybSgpIVwiIGNsYXNzPVwiYXNzZXJ0aW9ucy1mb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImFzc2VydGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJhc3NlcnRpb25zRGF0YVNvdXJjZVwiIGNsYXNzPVwiYXNzZXJ0aW9ucy10YWJsZVwiICNhc3NlcnRpb25zVGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSlNPTlBhdGggQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImpzb25QYXRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5qc29uUGF0aDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGFzc2VydGlvbjsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIid1c2VybmFtZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnanNvblBhdGgnKT8udmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JzXT1cImdldEFzc2VydGlvbkZpZWxkRXJyb3JzKGksICdqc29uUGF0aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChibHVycmVkKT1cImdldEZvcm1Db250cm9sQXQoaSwgJ2pzb25QYXRoJyk/Lm1hcmtBc1RvdWNoZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVmVyaWZpY2F0aW9uIFR5cGUgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInZlcmlmaWNhdGlvblR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnZlcmlmaWNhdGlvblR5cGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBhc3NlcnRpb247IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBc3NlcnRpb25Gb3JtR3JvdXBBdChpKSBhcyByb3dGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwicm93Rm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwidmVyaWZpY2F0aW9uVHlwZVNlbGVjdENvbmZpZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBlY3RlZCBUeXBlIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBlY3RlZFR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPmV4cGVjdGVkVHlwZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGFzc2VydGlvbjsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFzc2VydGlvbkZvcm1Hcm91cEF0KGkpIGFzIHJvd0Zvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJyb3dGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJleHBlY3RlZFR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRXhwZWN0ZWRUeXBlQ2hhbmdlKGksICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWUgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGVjdGVkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPmV4cGVjdGVkVmFsdWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBhc3NlcnRpb247IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldEV4cGVjdGVkVmFsdWVQbGFjZWhvbGRlcihpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRGb3JtQ29udHJvbEF0KGksICdleHBlY3RlZFZhbHVlJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yc109XCJnZXRBc3NlcnRpb25GaWVsZEVycm9ycyhpLCAnZXhwZWN0ZWRWYWx1ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXJyZWQpPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy5tYXJrQXNUb3VjaGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBcnJheSAvIE9iamVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0RXhwZWN0ZWRUeXBlKGkpID09PSAnYXJyYXknIHx8IGdldEV4cGVjdGVkVHlwZShpKSA9PT0gJ29iamVjdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RXhwZWN0ZWRWYWx1ZVBsYWNlaG9sZGVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JzXT1cImdldEFzc2VydGlvbkZpZWxkRXJyb3JzKGksICdleHBlY3RlZFZhbHVlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXJyZWQpPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy5tYXJrQXNUb3VjaGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdWxsIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdudWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRFeHBlY3RlZFZhbHVlUGxhY2Vob2xkZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdudW1iZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0V4cGVjdGVkIFZhbHVlIGluIE51bWJlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Rm9ybUNvbnRyb2xBdChpLCAnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvcnNdPVwiZ2V0QXNzZXJ0aW9uRmllbGRFcnJvcnMoaSwgJ2V4cGVjdGVkVmFsdWUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChibHVycmVkKT1cImdldEZvcm1Db250cm9sQXQoaSwgJ2V4cGVjdGVkVmFsdWUnKT8ubWFya0FzVG91Y2hlZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRFeHBlY3RlZFR5cGUoaSkgPT09ICdib29sZWFuJyAmJiBnZXRBc3NlcnRpb25Gb3JtR3JvdXBBdChpKSBhcyByb3dGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwicm93Rm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiYm9vbGVhbkV4cGVjdGVkVmFsdWVTZWxlY3RDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgYXNzZXJ0aW9uOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInRGVsZXRlIGFzc2VydGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cIicjRUY0NDQ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLW1pbi13LVs0MHB4XSBjcWEtdy0xMCBjcWEtaC05IGNxYS1yb3VuZGVkIGNxYS1iZy1ncmF5LTEwMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtYmctZ3JheS0yMDAgY3FhLXAtMCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUgYXNzZXJ0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZUFzc2VydGlvbihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0QXNzZXJ0aW9uc0Zvcm1BcnJheSgpLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwPk5vIGFzc2VydGlvbnMgYWRkZWQuIENsaWNrIFwiQWRkIEFzc2VydGlvblwiIHRvIGNyZWF0ZSBvbmUuPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2FkdmFuY2VkJ1wiPlxuICAgICAgICAgICAgPGNxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybSBcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVzXT1cImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIlxuICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkFkdmFuY2VkVmFyaWFibGVCb29sZWFuQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuXG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC1hdXRvIGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBbdGV4dF09XCJlZGl0TW9kZSA/ICdVcGRhdGUgU3RlcCcgOiAnQ3JlYXRlIFN0ZXAnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMiBjcWEtZmxleC0xIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJDcmVhdGluZ+KAplwiIGljb249XCJhdXRvcmVuZXdcIiBbaXNMb2FkaW5nXT1cInRydWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXCJcbiAgICAgICAgdmFyaWFudD1cImluZm9cIiBzaXplPVwibWVkaXVtXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|