@cqa-lib/cqa-ui 1.1.256 → 1.1.257
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +15 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +15 -2
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +14 -2
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +5 -0
- package/package.json +1 -1
|
@@ -468,6 +468,18 @@ export class TestCaseConditionStepComponent {
|
|
|
468
468
|
const count = allSteps.length;
|
|
469
469
|
return `Steps ${start}-${end} (${count} step${count !== 1 ? 's' : ''})`;
|
|
470
470
|
}
|
|
471
|
+
/** Event key-value pairs for display, excluding customEvent */
|
|
472
|
+
getEventDetailsForDisplay() {
|
|
473
|
+
const event = this.config?.event;
|
|
474
|
+
if (!event || typeof event !== 'object')
|
|
475
|
+
return [];
|
|
476
|
+
return Object.entries(event)
|
|
477
|
+
.filter(([key]) => key !== 'customEvent')
|
|
478
|
+
.map(([key, value]) => ({
|
|
479
|
+
key,
|
|
480
|
+
value: value != null ? String(value) : ''
|
|
481
|
+
}));
|
|
482
|
+
}
|
|
471
483
|
onToggleExpanded() {
|
|
472
484
|
this.expanded = !this.expanded;
|
|
473
485
|
this.toggleExpanded.emit({ config: this.config, expanded: this.expanded });
|
|
@@ -798,13 +810,13 @@ export class TestCaseConditionStepComponent {
|
|
|
798
810
|
}
|
|
799
811
|
}
|
|
800
812
|
TestCaseConditionStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseConditionStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
801
|
-
TestCaseConditionStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseConditionStepComponent, selector: "cqa-test-case-condition-step", inputs: { config: "config", id: "id", stepNumber: "stepNumber", condition: "condition", branches: "branches", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", conditionChange: "conditionChange", branchStepChange: "branchStepChange", addStep: "addStep", deleteStep: "deleteStep", addBranch: "addBranch", addElse: "addElse", deleteBranch: "deleteBranch", duplicate: "duplicate", delete: "delete", edit: "edit", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: stop propagation so dropdown/autocomplete interactions don't bubble and collapse the step -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <!-- First Row: CONDITION tag, autocomplete, IF/ELSE indicators, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- CONDITION Tag (orange) -->\n <span class=\"cqa-px-1.5 cqa-rounded-md cqa-text-[#EA580C] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FFEDD5]\">\n CONDITION\n </span>\n\n <!-- First field: left operand (e.g. Usertype) - autocomplete with IF_CONDITION natural text actions -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"editForm.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('conditionLeft', $event)\"\n (optionSelect)=\"onConditionLeftSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n\n <!-- Second Row: Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, false)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- IF / ELSE indicators -->\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#DCFCE7] cqa-text-[#008236] cqa-border cqa-border-solid cqa-border-[#B9F8CF] cqa-flex cqa-items-center cqa-gap-1.5\">\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.66634 2L2.99967 5.66667L1.33301 4\" stroke=\"#008236\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n IF\n </span>\n <!-- Add ELSE IF button - always visible -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE IF\n </button>\n <!-- Add Else button - calls API to create CONDITION_ELSE step -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE\n </button>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a> \n </div>\n <!-- Cancel / Apply buttons - shown on IF row when no ELSE IF branches are present -->\n <div *ngIf=\"elseIfBranches.length === 0\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n \n \n </div>\n\n <!-- ELSE IF Sections in Edit Mode - Loop through all ELSE IF branches -->\n <ng-container *ngFor=\"let branch of elseIfBranches; let i = index\">\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3 cqa-border-t cqa-border-solid cqa-border-[#E5E7EB]\">\n <!-- First Row: Remove ELSE IF button, autocomplete, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Remove ELSE IF button -->\n <button\n type=\"button\"\n (click)=\"onRemoveElse(branch.id)\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#F3F4F6] cqa-text-[#99A1AF] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-cursor-pointer hover:cqa-bg-[#E5E7EB] cqa-transition-colors\">\n Remove ELSE IF\n </button>\n\n <!-- ELSE IF autocomplete field: same as IF condition -->\n <cqa-autocomplete\n *ngIf=\"branch.form\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"branch.form.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"branch.form.get('conditionLeft')?.setValue($event)\"\n (optionSelect)=\"onElseConditionLeftSelect($event, branch.id)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n \n <!-- Second Row: ELSE IF Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"branch.selectedTemplate && branch.templateVariables && branch.templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of branch.templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label> -->\n <mat-slide-toggle\n [checked]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"branch.templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, branch.id)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n \n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [value]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n (valueChange)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event)\"\n [placeholder]=\"variable.label\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n <!-- Cancel / Apply buttons - shown in last ELSE IF row -->\n <div *ngIf=\"i === elseIfBranches.length - 1\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Condition Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\" [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-condition\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- IF/ELSE Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2V10\" stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12 6C13.1046 6 14 5.10457 14 4C14 2.89543 13.1046 2 12 2C10.8954 2 10 2.89543 10 4C10 5.10457 10.8954 6 12 6Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4 14C5.10457 14 6 13.1046 6 12C6 10.8954 5.10457 10 4 10C2.89543 10 2 10.8954 2 12C2 13.1046 2.89543 14 4 14Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 6C12 7.5913 11.3679 9.11742 10.2426 10.2426C9.11742 11.3679 7.5913 12 6 12\" stroke=\"#7B3306\"\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- IF/ELSE Label -->\n <span class=\"cqa-font-semibold cqa-text-[#7B3306] cqa-text-[12px] cqa-leading-none\">\n IF / ELSE\n </span>\n\n <!-- Condition Input -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1\">\n <span [innerHTML]=\"condition\"></span>\n <!-- <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n If\n </span>\n <span\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">.success-message</span>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n is visible\n </span> -->\n <!-- <input\n type=\"text\"\n [value]=\"condition\"\n (input)=\"onConditionChange($any($event.target).value)\"\n placeholder=\"element `.success-message` is visible\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-lg cqa-border cqa-border-gray-300 cqa-bg-white cqa-text-gray-900 cqa-text-sm cqa-flex-1 cqa-max-w-md cqa-outline-none focus:cqa-ring-2 focus:cqa-ring-primary focus:cqa-ring-opacity-50\"\n /> -->\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n \n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <!-- <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Expanded Content with Branches -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- Branches (IF TRUE, ELSE IF, ELSE) -->\n <div *ngFor=\"let branch of branches; let branchIndex = index\" class=\"condition-branch-row cqa-flex cqa-flex-col\">\n <!-- Branch Header (2 = ELSE IF, 3 = ELSE; sub steps show 1.1, 2.1, 3.1 from step config) -->\n <div\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ branchIndex + 1 }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"branch.action\" [innerHTML]=\"branch.action\" class=\"cqa-text-[#111827]\"></span>\n </div>\n\n <!-- Branch Content (Nested Steps \u2013 renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of branch.nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event, branch)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of branch.nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty branch (IF / ELSE IF / ELSE): show plus icon on hover when no steps, same as loop step -->\n <div *ngIf=\"branch.nestedSteps.length === 0\" class=\"condition-branch-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStep(branch); $event.stopPropagation()\" [attr.title]=\"'Add step to ' + getBranchLabel(branch)\"\n class=\"condition-branch-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- END IF Marker -->\n <div [class]=\"'cqa-pl-4 cqa-py-1 cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\" style=\"border-top: 1px solid #E5E7EB;\">\n END IF\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n", ".condition-branch-empty{opacity:0;transition:opacity .1s ease}.condition-branch-row:hover .condition-branch-empty{opacity:1}.condition-branch-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.condition-branch-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i7.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i9.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i8.DatePipe } });
|
|
813
|
+
TestCaseConditionStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseConditionStepComponent, selector: "cqa-test-case-condition-step", inputs: { config: "config", id: "id", stepNumber: "stepNumber", condition: "condition", branches: "branches", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", conditionChange: "conditionChange", branchStepChange: "branchStepChange", addStep: "addStep", deleteStep: "deleteStep", addBranch: "addBranch", addElse: "addElse", deleteBranch: "deleteBranch", duplicate: "duplicate", delete: "delete", edit: "edit", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: stop propagation so dropdown/autocomplete interactions don't bubble and collapse the step -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <!-- First Row: CONDITION tag, autocomplete, IF/ELSE indicators, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- CONDITION Tag (orange) -->\n <span class=\"cqa-px-1.5 cqa-rounded-md cqa-text-[#EA580C] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FFEDD5]\">\n CONDITION\n </span>\n\n <!-- First field: left operand (e.g. Usertype) - autocomplete with IF_CONDITION natural text actions -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"editForm.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('conditionLeft', $event)\"\n (optionSelect)=\"onConditionLeftSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n\n <!-- Second Row: Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, false)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- IF / ELSE indicators -->\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#DCFCE7] cqa-text-[#008236] cqa-border cqa-border-solid cqa-border-[#B9F8CF] cqa-flex cqa-items-center cqa-gap-1.5\">\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.66634 2L2.99967 5.66667L1.33301 4\" stroke=\"#008236\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n IF\n </span>\n <!-- Add ELSE IF button - always visible -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE IF\n </button>\n <!-- Add Else button - calls API to create CONDITION_ELSE step -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE\n </button>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a> \n </div>\n <!-- Cancel / Apply buttons - shown on IF row when no ELSE IF branches are present -->\n <div *ngIf=\"elseIfBranches.length === 0\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n \n \n </div>\n\n <!-- ELSE IF Sections in Edit Mode - Loop through all ELSE IF branches -->\n <ng-container *ngFor=\"let branch of elseIfBranches; let i = index\">\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3 cqa-border-t cqa-border-solid cqa-border-[#E5E7EB]\">\n <!-- First Row: Remove ELSE IF button, autocomplete, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Remove ELSE IF button -->\n <button\n type=\"button\"\n (click)=\"onRemoveElse(branch.id)\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#F3F4F6] cqa-text-[#99A1AF] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-cursor-pointer hover:cqa-bg-[#E5E7EB] cqa-transition-colors\">\n Remove ELSE IF\n </button>\n\n <!-- ELSE IF autocomplete field: same as IF condition -->\n <cqa-autocomplete\n *ngIf=\"branch.form\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"branch.form.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"branch.form.get('conditionLeft')?.setValue($event)\"\n (optionSelect)=\"onElseConditionLeftSelect($event, branch.id)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n \n <!-- Second Row: ELSE IF Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"branch.selectedTemplate && branch.templateVariables && branch.templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of branch.templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label> -->\n <mat-slide-toggle\n [checked]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"branch.templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, branch.id)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n \n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [value]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n (valueChange)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event)\"\n [placeholder]=\"variable.label\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n <!-- Cancel / Apply buttons - shown in last ELSE IF row -->\n <div *ngIf=\"i === elseIfBranches.length - 1\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Condition Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\" [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-condition\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- IF/ELSE Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2V10\" stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12 6C13.1046 6 14 5.10457 14 4C14 2.89543 13.1046 2 12 2C10.8954 2 10 2.89543 10 4C10 5.10457 10.8954 6 12 6Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4 14C5.10457 14 6 13.1046 6 12C6 10.8954 5.10457 10 4 10C2.89543 10 2 10.8954 2 12C2 13.1046 2.89543 14 4 14Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 6C12 7.5913 11.3679 9.11742 10.2426 10.2426C9.11742 11.3679 7.5913 12 6 12\" stroke=\"#7B3306\"\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- IF/ELSE Label -->\n <span class=\"cqa-font-semibold cqa-text-[#7B3306] cqa-text-[12px] cqa-leading-none\">\n IF / ELSE\n </span>\n\n <!-- Condition Input and event key-value details (exclude customEvent) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span [innerHTML]=\"condition\"></span>\n <ng-container *ngIf=\"getEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n <!-- <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n If\n </span>\n <span\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">.success-message</span>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n is visible\n </span> -->\n <!-- <input\n type=\"text\"\n [value]=\"condition\"\n (input)=\"onConditionChange($any($event.target).value)\"\n placeholder=\"element `.success-message` is visible\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-lg cqa-border cqa-border-gray-300 cqa-bg-white cqa-text-gray-900 cqa-text-sm cqa-flex-1 cqa-max-w-md cqa-outline-none focus:cqa-ring-2 focus:cqa-ring-primary focus:cqa-ring-opacity-50\"\n /> -->\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n \n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <!-- <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Expanded Content with Branches -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- Branches (IF TRUE, ELSE IF, ELSE) -->\n <div *ngFor=\"let branch of branches; let branchIndex = index\" class=\"condition-branch-row cqa-flex cqa-flex-col\">\n <!-- Branch Header (2 = ELSE IF, 3 = ELSE; sub steps show 1.1, 2.1, 3.1 from step config) -->\n <div\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ branchIndex + 1 }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"branch.action\" [innerHTML]=\"branch.action\" class=\"cqa-text-[#111827]\"></span>\n </div>\n\n <!-- Branch Content (Nested Steps \u2013 renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of branch.nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event, branch)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of branch.nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty branch (IF / ELSE IF / ELSE): show plus icon on hover when no steps, same as loop step -->\n <div *ngIf=\"branch.nestedSteps.length === 0\" class=\"condition-branch-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStep(branch); $event.stopPropagation()\" [attr.title]=\"'Add step to ' + getBranchLabel(branch)\"\n class=\"condition-branch-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- END IF Marker -->\n <div [class]=\"'cqa-pl-4 cqa-py-1 cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\" style=\"border-top: 1px solid #E5E7EB;\">\n END IF\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n", ".condition-branch-empty{opacity:0;transition:opacity .1s ease}.condition-branch-row:hover .condition-branch-empty{opacity:1}.condition-branch-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.condition-branch-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i7.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i9.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i8.DatePipe } });
|
|
802
814
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseConditionStepComponent, decorators: [{
|
|
803
815
|
type: Component,
|
|
804
816
|
args: [{ selector: 'cqa-test-case-condition-step', host: { class: 'cqa-ui-root' }, styles: [
|
|
805
817
|
STEP_ROW_ACTIONS_STYLES,
|
|
806
818
|
CONDITION_BRANCH_EMPTY_STYLES,
|
|
807
|
-
], template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: stop propagation so dropdown/autocomplete interactions don't bubble and collapse the step -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <!-- First Row: CONDITION tag, autocomplete, IF/ELSE indicators, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- CONDITION Tag (orange) -->\n <span class=\"cqa-px-1.5 cqa-rounded-md cqa-text-[#EA580C] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FFEDD5]\">\n CONDITION\n </span>\n\n <!-- First field: left operand (e.g. Usertype) - autocomplete with IF_CONDITION natural text actions -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"editForm.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('conditionLeft', $event)\"\n (optionSelect)=\"onConditionLeftSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n\n <!-- Second Row: Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, false)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- IF / ELSE indicators -->\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#DCFCE7] cqa-text-[#008236] cqa-border cqa-border-solid cqa-border-[#B9F8CF] cqa-flex cqa-items-center cqa-gap-1.5\">\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.66634 2L2.99967 5.66667L1.33301 4\" stroke=\"#008236\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n IF\n </span>\n <!-- Add ELSE IF button - always visible -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE IF\n </button>\n <!-- Add Else button - calls API to create CONDITION_ELSE step -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE\n </button>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a> \n </div>\n <!-- Cancel / Apply buttons - shown on IF row when no ELSE IF branches are present -->\n <div *ngIf=\"elseIfBranches.length === 0\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n \n \n </div>\n\n <!-- ELSE IF Sections in Edit Mode - Loop through all ELSE IF branches -->\n <ng-container *ngFor=\"let branch of elseIfBranches; let i = index\">\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3 cqa-border-t cqa-border-solid cqa-border-[#E5E7EB]\">\n <!-- First Row: Remove ELSE IF button, autocomplete, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Remove ELSE IF button -->\n <button\n type=\"button\"\n (click)=\"onRemoveElse(branch.id)\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#F3F4F6] cqa-text-[#99A1AF] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-cursor-pointer hover:cqa-bg-[#E5E7EB] cqa-transition-colors\">\n Remove ELSE IF\n </button>\n\n <!-- ELSE IF autocomplete field: same as IF condition -->\n <cqa-autocomplete\n *ngIf=\"branch.form\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"branch.form.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"branch.form.get('conditionLeft')?.setValue($event)\"\n (optionSelect)=\"onElseConditionLeftSelect($event, branch.id)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n \n <!-- Second Row: ELSE IF Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"branch.selectedTemplate && branch.templateVariables && branch.templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of branch.templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label> -->\n <mat-slide-toggle\n [checked]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"branch.templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, branch.id)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n \n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [value]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n (valueChange)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event)\"\n [placeholder]=\"variable.label\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n <!-- Cancel / Apply buttons - shown in last ELSE IF row -->\n <div *ngIf=\"i === elseIfBranches.length - 1\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Condition Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\" [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-condition\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- IF/ELSE Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2V10\" stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12 6C13.1046 6 14 5.10457 14 4C14 2.89543 13.1046 2 12 2C10.8954 2 10 2.89543 10 4C10 5.10457 10.8954 6 12 6Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4 14C5.10457 14 6 13.1046 6 12C6 10.8954 5.10457 10 4 10C2.89543 10 2 10.8954 2 12C2 13.1046 2.89543 14 4 14Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 6C12 7.5913 11.3679 9.11742 10.2426 10.2426C9.11742 11.3679 7.5913 12 6 12\" stroke=\"#7B3306\"\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- IF/ELSE Label -->\n <span class=\"cqa-font-semibold cqa-text-[#7B3306] cqa-text-[12px] cqa-leading-none\">\n IF / ELSE\n </span>\n\n <!-- Condition Input -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1\">\n <span [innerHTML]=\"condition\"></span>\n <!-- <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n If\n </span>\n <span\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">.success-message</span>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n is visible\n </span> -->\n <!-- <input\n type=\"text\"\n [value]=\"condition\"\n (input)=\"onConditionChange($any($event.target).value)\"\n placeholder=\"element `.success-message` is visible\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-lg cqa-border cqa-border-gray-300 cqa-bg-white cqa-text-gray-900 cqa-text-sm cqa-flex-1 cqa-max-w-md cqa-outline-none focus:cqa-ring-2 focus:cqa-ring-primary focus:cqa-ring-opacity-50\"\n /> -->\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n \n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <!-- <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Expanded Content with Branches -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- Branches (IF TRUE, ELSE IF, ELSE) -->\n <div *ngFor=\"let branch of branches; let branchIndex = index\" class=\"condition-branch-row cqa-flex cqa-flex-col\">\n <!-- Branch Header (2 = ELSE IF, 3 = ELSE; sub steps show 1.1, 2.1, 3.1 from step config) -->\n <div\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ branchIndex + 1 }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"branch.action\" [innerHTML]=\"branch.action\" class=\"cqa-text-[#111827]\"></span>\n </div>\n\n <!-- Branch Content (Nested Steps \u2013 renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of branch.nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event, branch)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of branch.nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty branch (IF / ELSE IF / ELSE): show plus icon on hover when no steps, same as loop step -->\n <div *ngIf=\"branch.nestedSteps.length === 0\" class=\"condition-branch-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStep(branch); $event.stopPropagation()\" [attr.title]=\"'Add step to ' + getBranchLabel(branch)\"\n class=\"condition-branch-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- END IF Marker -->\n <div [class]=\"'cqa-pl-4 cqa-py-1 cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\" style=\"border-top: 1px solid #E5E7EB;\">\n END IF\n </div>\n </div>\n</div>" }]
|
|
819
|
+
], template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: stop propagation so dropdown/autocomplete interactions don't bubble and collapse the step -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <!-- First Row: CONDITION tag, autocomplete, IF/ELSE indicators, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- CONDITION Tag (orange) -->\n <span class=\"cqa-px-1.5 cqa-rounded-md cqa-text-[#EA580C] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FFEDD5]\">\n CONDITION\n </span>\n\n <!-- First field: left operand (e.g. Usertype) - autocomplete with IF_CONDITION natural text actions -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"editForm.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('conditionLeft', $event)\"\n (optionSelect)=\"onConditionLeftSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n\n <!-- Second Row: Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, false)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- IF / ELSE indicators -->\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#DCFCE7] cqa-text-[#008236] cqa-border cqa-border-solid cqa-border-[#B9F8CF] cqa-flex cqa-items-center cqa-gap-1.5\">\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.66634 2L2.99967 5.66667L1.33301 4\" stroke=\"#008236\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n IF\n </span>\n <!-- Add ELSE IF button - always visible -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE IF\n </button>\n <!-- Add Else button - calls API to create CONDITION_ELSE step -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#fff9e9] cqa-text-[#E65100] cqa-border cqa-border-solid cqa-border-[#feecbd] cqa-flex cqa-items-center cqa-gap-1.5 cqa-cursor-pointer cqa-transition-colors\">\n Add ELSE\n </button>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a> \n </div>\n <!-- Cancel / Apply buttons - shown on IF row when no ELSE IF branches are present -->\n <div *ngIf=\"elseIfBranches.length === 0\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n \n \n </div>\n\n <!-- ELSE IF Sections in Edit Mode - Loop through all ELSE IF branches -->\n <ng-container *ngFor=\"let branch of elseIfBranches; let i = index\">\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3 cqa-border-t cqa-border-solid cqa-border-[#E5E7EB]\">\n <!-- First Row: Remove ELSE IF button, autocomplete, Edit In depth, Cancel/Apply -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Remove ELSE IF button -->\n <button\n type=\"button\"\n (click)=\"onRemoveElse(branch.id)\"\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[8px] cqa-leading-[12px] cqa-bg-[#F3F4F6] cqa-text-[#99A1AF] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-cursor-pointer hover:cqa-bg-[#E5E7EB] cqa-transition-colors\">\n Remove ELSE IF\n </button>\n\n <!-- ELSE IF autocomplete field: same as IF condition -->\n <cqa-autocomplete\n *ngIf=\"branch.form\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"branch.form.get('conditionLeft')?.value ?? ''\"\n (valueChange)=\"branch.form.get('conditionLeft')?.setValue($event)\"\n (optionSelect)=\"onElseConditionLeftSelect($event, branch.id)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-autocomplete>\n \n <!-- Second Row: ELSE IF Template Variables Section (shown when template is selected, inline before Edit In depth) -->\n <div *ngIf=\"branch.selectedTemplate && branch.templateVariables && branch.templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of branch.templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label> -->\n <mat-slide-toggle\n [checked]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean variables -->\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <!-- Dropdown for select variables -->\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-dynamic-select \n [form]=\"branch.templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable, branch.id)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n \n <!-- Text Input for other variables -->\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <!-- <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label> -->\n <cqa-custom-input\n [value]=\"branch.templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n (valueChange)=\"branch.templateVariablesForm.get(variable.name)?.setValue($event)\"\n [placeholder]=\"variable.label\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n <!-- Cancel / Apply buttons - shown in last ELSE IF row -->\n <div *ngIf=\"i === elseIfBranches.length - 1\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\" (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\" (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Condition Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\" [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-condition\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- IF/ELSE Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2V10\" stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12 6C13.1046 6 14 5.10457 14 4C14 2.89543 13.1046 2 12 2C10.8954 2 10 2.89543 10 4C10 5.10457 10.8954 6 12 6Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4 14C5.10457 14 6 13.1046 6 12C6 10.8954 5.10457 10 4 10C2.89543 10 2 10.8954 2 12C2 13.1046 2.89543 14 4 14Z\"\n stroke=\"#7B3306\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 6C12 7.5913 11.3679 9.11742 10.2426 10.2426C9.11742 11.3679 7.5913 12 6 12\" stroke=\"#7B3306\"\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- IF/ELSE Label -->\n <span class=\"cqa-font-semibold cqa-text-[#7B3306] cqa-text-[12px] cqa-leading-none\">\n IF / ELSE\n </span>\n\n <!-- Condition Input and event key-value details (exclude customEvent) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span [innerHTML]=\"condition\"></span>\n <ng-container *ngIf=\"getEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n <!-- <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n If\n </span>\n <span\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">.success-message</span>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px]\">\n is visible\n </span> -->\n <!-- <input\n type=\"text\"\n [value]=\"condition\"\n (input)=\"onConditionChange($any($event.target).value)\"\n placeholder=\"element `.success-message` is visible\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-lg cqa-border cqa-border-gray-300 cqa-bg-white cqa-text-gray-900 cqa-text-sm cqa-flex-1 cqa-max-w-md cqa-outline-none focus:cqa-ring-2 focus:cqa-ring-primary focus:cqa-ring-opacity-50\"\n /> -->\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n \n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <!-- <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button> -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Expanded Content with Branches -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- Branches (IF TRUE, ELSE IF, ELSE) -->\n <div *ngFor=\"let branch of branches; let branchIndex = index\" class=\"condition-branch-row cqa-flex cqa-flex-col\">\n <!-- Branch Header (2 = ELSE IF, 3 = ELSE; sub steps show 1.1, 2.1, 3.1 from step config) -->\n <div\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ branchIndex + 1 }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"branch.action\" [innerHTML]=\"branch.action\" class=\"cqa-text-[#111827]\"></span>\n </div>\n\n <!-- Branch Content (Nested Steps \u2013 renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of branch.nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event, branch)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of branch.nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [branch]=\"branch\"\n [isNested]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (branchStepChange)=\"onBranchStepChange($event.branch, $event.step, $event.stepIndex)\"\n (addStepForBranch)=\"onAddStep($event.branch)\"\n (deleteStepWithBranch)=\"onDeleteStep($event.branch, $event.stepIndex)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, branch, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onBranchStepChange(branch, step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onBranchStepChange(branch, step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onBranchStepChange(branch, step, i)\"\n (openExternal)=\"onBranchStepChange(branch, step, i)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onBranchStepChange(branch, step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onBranchStepChange(branch, step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step)); onBranchStepChange(branch, step, i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event); onBranchStepChange(branch, step, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onBranchStepChange(branch, step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onBranchStepChange(branch, step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onBranchStepChange(branch, step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onBranchStepChange(branch, step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onBranchStepChange(branch, step, i)\"\n (parameterChange)=\"onBranchStepChange(branch, step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onBranchStepChange(branch, step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty branch (IF / ELSE IF / ELSE): show plus icon on hover when no steps, same as loop step -->\n <div *ngIf=\"branch.nestedSteps.length === 0\" class=\"condition-branch-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStep(branch); $event.stopPropagation()\" [attr.title]=\"'Add step to ' + getBranchLabel(branch)\"\n class=\"condition-branch-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- END IF Marker -->\n <div [class]=\"'cqa-pl-4 cqa-py-1 cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\" style=\"border-top: 1px solid #E5E7EB;\">\n END IF\n </div>\n </div>\n</div>" }]
|
|
808
820
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
|
|
809
821
|
type: Input
|
|
810
822
|
}], id: [{
|
|
@@ -889,4 +901,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
889
901
|
}], selectionChange: [{
|
|
890
902
|
type: Output
|
|
891
903
|
}] } });
|
|
892
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9jb25kaXRpb24tc3RlcC9jb25kaXRpb24tc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2NvbmRpdGlvbi1zdGVwL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXdDLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0JyQyxDQUFDO0FBVUYsTUFBTSxPQUFPLDhCQUE4QjtJQThGekMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0Z2QixhQUFRLEdBQXNCLEVBQUUsQ0FBQztRQUNqQyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUNuQyw0Q0FBNEM7UUFDbkMsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQ3hDLGdFQUFn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c0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29uZGl0aW9uU3RlcENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBUZXN0Q2FzZVN0ZXBDb25maWcsIE5vcm1hbFN0ZXBDb25maWcsIExvb3BTdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENxYUF1dG9jb21wbGV0ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUubW9kZWwnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuY29uc3QgQ09ORElUSU9OX0JSQU5DSF9FTVBUWV9TVFlMRVMgPSBgXG4gIC8qIEVtcHR5IElGIC8gRUxTRSBJRiAvIEVMU0U6IHNob3cgcGx1cyBpY29uIG9uIGJyYW5jaCByb3cgaG92ZXIgKHNhbWUgYXMgbG9vcCBzdGVwKSAqL1xuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1yb3c6aG92ZXIgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7IC8qIFNob3cgcGx1cyBpY29uIG9uIGJyYW5jaCByb3cgaG92ZXIgKi9cbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWNvbmRpdGlvbi1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtcbiAgICBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyxcbiAgICBDT05ESVRJT05fQlJBTkNIX0VNUFRZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VDb25kaXRpb25TdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBDb25kaXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KCkgY29uZGl0aW9uITogc3RyaW5nO1xuICBASW5wdXQoKSBicmFuY2hlczogQ29uZGl0aW9uQnJhbmNoW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyBmb3Igd2hpbGUgbG9vcCBjb25kaXRpb24gKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIChzaW1pbGFyIHRvIHN0ZXAtYnVpbGRlci1jb25kaXRpb24pICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZmllbGRzLCBvcGVyYXRvciBzZWxlY3QsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEFycmF5IG9mIEVMU0UgSUYgYnJhbmNoZXMgaW4gZWRpdCBtb2RlICovXG4gIGVsc2VJZkJyYW5jaGVzOiBBcnJheTx7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfT4gPSBbXTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgYW5kIGNxYS1jdXN0b20taW5wdXQgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIE9wZXJhdG9yIGRyb3Bkb3duIGNvbmZpZyAoSVMsIElTIE5PVCwgQ09OVEFJTlMsIGV0Yy4pICovXG4gIG9wZXJhdG9yU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICAvKiogQ29uZGl0aW9uIGxlZnQgb3BlcmFuZCBkcm9wZG93biBjb25maWcgKG5hdHVyYWwgdGV4dCBhY3Rpb25zIHdpdGggSUZfQ09ORElUSU9OKSAqL1xuICBjb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTbmFwc2hvdCBmb3IgQ2FuY2VsIHJldmVydCAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfSA9IHt9O1xuICBcbiAgLyoqIFNlbGVjdGVkIHRlbXBsYXRlIGZvciBJRiBjb25kaXRpb24gKi9cbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgLyoqIFRlbXBsYXRlIHZhcmlhYmxlcyBmb3IgSUYgY29uZGl0aW9uICovXG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICAvKiogRm9ybSBncm91cCBmb3IgdGVtcGxhdGUgdmFyaWFibGVzICovXG4gIHRlbXBsYXRlVmFyaWFibGVzRm9ybSE6IEZvcm1Hcm91cDtcblxuICBAVmlld0NoaWxkKCd2aWV3RGV0YWlsc1RyaWdnZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgdmlld0RldGFpbHNUcmlnZ2VyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGJyYW5jaFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgc3RlcEluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2ggfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBJbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgXCJBZGQgRWxzZVwiIHNvIHRoZSBwYXJlbnQgY2FuIGNhbGwgUE9TVCB0ZXN0X3N0ZXBzIHdpdGggY29uZGl0aW9uVHlwZSBDT05ESVRJT05fRUxTRSAqL1xuICBAT3V0cHV0KCkgYWRkRWxzZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb25kaXRpb25TdGVwQ29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkJyYW5jaD4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIGlzIHVwZGF0ZWQgKGUuZy4sIEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGxvb3Atc3RlcCBlZGl0IG1vZGUpICovXG4gIEBPdXRwdXQoKSBzdGVwVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50LCBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IGJyYW5jaC5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLmJyYW5jaGVzID0gdGhpcy5jb25maWcuYnJhbmNoZXMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZE9wZXJhdG9yU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBSZWJ1aWxkIGZvcm0gd2hlbiBvcHRpb25zIGFyZSBsb2FkZWQgdG8gcG9wdWxhdGUgaW5pdGlhbCB2YWx1ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWRcbiAgICAgIGlmICh0aGlzLmVkaXRGb3JtICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRFZGl0Rm9ybVdpdGhOYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGVkaXQgZm9ybSB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXJlIGxvYWRlZCB0byBwb3B1bGF0ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWQgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkRWRpdEZvcm1XaXRoTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgY3VycmVudCB2YWx1ZSBpcyBlbXB0eSBvciBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICE9PSBuYXR1cmFsVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgdGVtcGxhdGUgb2JqZWN0IChOYXR1cmFsVGV4dEFjdGlvbnMpIGZyb20gdGhlIG9wdGlvblxuICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgdGVtcGxhdGUgYW5kIGdldCB2YXJpYWJsZXNcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBJZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQsIGZpbmQgdGhlIG1hdGNoaW5nIG5hdHVyYWwgdGV4dCBhY3Rpb25cbiAgICBsZXQgY29uZGl0aW9uTGVmdFZhbHVlID0gJyc7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmIChjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUElcbiAgICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgLy8gR2V0IHRoZSBmdWxsIHRlbXBsYXRlIG9iamVjdCAoTmF0dXJhbFRleHRBY3Rpb25zKSBmcm9tIHRoZSBvcHRpb25cbiAgICAgICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlIGFuZCBnZXQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKTtcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgbm8gbmF0dXJhbFRleHRBY3Rpb25JZCBtYXRjaCBmb3VuZCwgcGFyc2UgZnJvbSBjb25kaXRpb24gc3RyaW5nXG4gICAgaWYgKCFjb25kaXRpb25MZWZ0VmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBsZWZ0O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB7IG9wZXJhdG9yLCByaWdodCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29uZGl0aW9uTGVmdDogW2NvbmRpdGlvbkxlZnRWYWx1ZV0sXG4gICAgICBjb25kaXRpb25PcGVyYXRvcjogW29wZXJhdG9yXSxcbiAgICAgIGNvbmRpdGlvblJpZ2h0OiBbcmlnaHRdLFxuICAgIH0pO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdGVtcGxhdGUgdmFyaWFibGVzIGZvcm0gaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbHNlSWZCcmFuY2goaW5kZXg/OiBudW1iZXIpOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBFTFNFIElGIGZvcm0gd2l0aCBlbXB0eSB2YWx1ZXMgb3IgZnJvbSBleGlzdGluZyBFTFNFIElGIGJyYW5jaCBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBlbHNlSWZCcmFuY2hlcyA9IHRoaXMuYnJhbmNoZXM/LmZpbHRlcihiID0+IGIudHlwZSA9PT0gJ2Vsc2UtaWYnKSB8fCBbXTtcbiAgICBjb25zdCBicmFuY2hJbmRleCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyBpbmRleCA6IGVsc2VJZkJyYW5jaGVzLmxlbmd0aDtcbiAgICBjb25zdCBlbHNlSWZCcmFuY2ggPSBlbHNlSWZCcmFuY2hlc1ticmFuY2hJbmRleF07XG4gICAgY29uc3QgZWxzZUNvbmRpdGlvbiA9IGVsc2VJZkJyYW5jaD8uYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHsgbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGVsc2VDb25kaXRpb24pO1xuICAgIFxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IFtsZWZ0XSxcbiAgICAgIGNvbmRpdGlvbk9wZXJhdG9yOiBbb3BlcmF0b3JdLFxuICAgICAgY29uZGl0aW9uUmlnaHQ6IFtyaWdodF0sXG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgZWxzZS1pZi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gLFxuICAgICAgZm9ybSxcbiAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IG51bGwsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogW10sXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0sXG4gICAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0OiBsZWZ0LCBjb25kaXRpb25PcGVyYXRvcjogb3BlcmF0b3IsIGNvbmRpdGlvblJpZ2h0OiByaWdodCB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRvclNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICAgIHsgaWQ6ICdpcycsIHZhbHVlOiAnaXMnLCBuYW1lOiAnSVMnLCBsYWJlbDogJ0lTJyB9LFxuICAgICAgeyBpZDogJ2lzIG5vdCcsIHZhbHVlOiAnaXMgbm90JywgbmFtZTogJ0lTIE5PVCcsIGxhYmVsOiAnSVMgTk9UJyB9LFxuICAgICAgeyBpZDogJ2NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIG5hbWU6ICdDT05UQUlOUycsIGxhYmVsOiAnQ09OVEFJTlMnIH0sXG4gICAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRVFVQUxTJywgbGFiZWw6ICdFUVVBTFMnIH0sXG4gICAgICB7IGlkOiAnc3RhcnRzIHdpdGgnLCB2YWx1ZTogJ3N0YXJ0cyB3aXRoJywgbmFtZTogJ1NUQVJUUyBXSVRIJywgbGFiZWw6ICdTVEFSVFMgV0lUSCcgfSxcbiAgICAgIHsgaWQ6ICdlbmRzIHdpdGgnLCB2YWx1ZTogJ2VuZHMgd2l0aCcsIG5hbWU6ICdFTkRTIFdJVEgnLCBsYWJlbDogJ0VORFMgV0lUSCcgfSxcbiAgICBdO1xuICAgIHRoaXMub3BlcmF0b3JTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25PcGVyYXRvcicsXG4gICAgICBwbGFjZWhvbGRlcjogJ09wZXJhdG9yJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gbGVmdCBzZWxlY3QgY29uZmlnIHdpdGggZmlsdGVyZWQgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKElGX0NPTkRJVElPTiBvbmx5KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG5hdHVyYWwgdGV4dCBhY3Rpb25zIHRvIG9ubHkgaW5jbHVkZSB0aG9zZSB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIklGX0NPTkRJVElPTlwiXG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ0lGX0NPTkRJVElPTic7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25MZWZ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGNvbmRpdGlvbiBsZWZ0IGF1dG9jb21wbGV0ZSAoSUZfQ09ORElUSU9OIG5hdHVyYWwgdGV4dCBhY3Rpb25zKSAqL1xuICBnZXQgY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnMoKTogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWc/Lm9wdGlvbnMgPz8gW107XG4gICAgcmV0dXJuIG9wdHMubWFwKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUEksIGZhbGxiYWNrIHRvIG5hbWUvdmFsdWUvaWRcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICAvLyBTdG9yZSB0aGUgZnVsbCB0ZW1wbGF0ZSBvYmplY3QgKE5hdHVyYWxUZXh0QWN0aW9ucykgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyBwcm9jZXNzaW5nXG4gICAgICAgIC8vIFVzZSBvcHRpb24udGVtcGxhdGUgaWYgYXZhaWxhYmxlIChmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyksIG90aGVyd2lzZSB1c2Ugb3B0aW9uIGl0c2VsZlxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgb25Db25kaXRpb25MZWZ0U2VsZWN0KG9wdGlvbjogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgXG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gUGFzcyB0aGUgZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMgb2JqZWN0IHdoaWNoIGhhcyB0aGUgdmFyaWFibGVzIHByb3BlcnR5XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZygnVGVtcGxhdGUgdmFyaWFibGVzIGxvYWRlZDonLCB2YXJpYWJsZXMsICdmcm9tIHRlbXBsYXRlOicsIGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB2YXJpYWJsZXMgfHwgW107XG4gICAgICAvLyBCdWlsZCBmb3JtIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdObyBtYXRjaGluZyB0ZW1wbGF0ZSBmb3VuZCBvciB0ZW1wbGF0ZSBoYXMgbm8gdmFyaWFibGVzJywge1xuICAgICAgICBmdWxsVGVtcGxhdGUsXG4gICAgICAgIGhhc1ZhcmlhYmxlczogZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMsXG4gICAgICAgIG9wdGlvblZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgIG9wdGlvblRlbXBsYXRlOiBvcHRpb24udGVtcGxhdGVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZGF0YSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBjb25maWdXaXRoRGF0YS50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge307XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gY29udHJvbHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGV4aXN0aW5nIGRhdGEgZmlyc3QsIHRoZW4gZnJvbSB2YXJpYWJsZSBkZWZhdWx0XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBib29sZWFuIHN0cmluZyB0byBib29sZWFuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJzEnO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRWxzZUNvbmRpdGlvbkxlZnRTZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0sIGJyYW5jaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBicmFuY2ggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmQoYiA9PiBiLmlkID09PSBicmFuY2hJZCk7XG4gICAgaWYgKCFicmFuY2gpIHJldHVybjtcbiAgICBcbiAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkRWxzZVRlbXBsYXRlVmFyaWFibGVzRm9ybShicmFuY2gpO1xuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIWJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgYnVpbGRFbHNlVGVtcGxhdGVWYXJpYWJsZXNGb3JtKGJyYW5jaDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU6IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W107XG4gICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBGb3JtR3JvdXA7XG4gICAgc25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdD86IHN0cmluZzsgY29uZGl0aW9uT3BlcmF0b3I/OiBzdHJpbmc7IGNvbmRpdGlvblJpZ2h0Pzogc3RyaW5nIH07XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoIWJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBjb250cm9sc1xuICAgIE9iamVjdC5rZXlzKGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZGF0YSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGUgKGZvciBFTFNFIElGIGJyYW5jaClcbiAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBjb25maWdXaXRoRGF0YS5lbHNlVGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIFxuICAgIC8vIEFkZCBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGV4aXN0aW5nIGRhdGEgZmlyc3QsIHRoZW4gZnJvbSB2YXJpYWJsZSBkZWZhdWx0XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBib29sZWFuIHN0cmluZyB0byBib29sZWFuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJzEnO1xuICAgICAgfVxuICAgICAgXG4gICAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgb25BZGRFbHNlKCk6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBFTFNFIElGIGJyYW5jaCAoVUkgcm93IG9ubHk7IEFQSXMgYXJlIGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIEFwcGx5KVxuICAgIGNvbnN0IG5ld0JyYW5jaCA9IHRoaXMuYnVpbGRFbHNlSWZCcmFuY2goKTtcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgfVxuXG4gIG9uQWRkRWxzZUJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBFbWl0IHNvIHBhcmVudCBjYW4gY2FsbCBQT1NUIHRlc3Rfc3RlcHMgd2l0aCBjb25kaXRpb25UeXBlIENPTkRJVElPTl9FTFNFXG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmFkZEVsc2UuZW1pdCh7IGNvbmRpdGlvblN0ZXBDb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVtb3ZlRWxzZShicmFuY2hJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHRoZSBFTFNFIElGIGJyYW5jaCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5maW5kSW5kZXgoYiA9PiBiLmlkID09PSBicmFuY2hJZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbHNlSWZCcmFuY2hlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYXJzZSBjb25kaXRpb24gc3RyaW5nIGludG8gbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IChlLmcuIFwiVXNlcnR5cGUgaXMgUHJlbWl1bVwiKSAqL1xuICBwcml2YXRlIHBhcnNlQ29uZGl0aW9uKGM6IHN0cmluZyk6IHsgbGVmdDogc3RyaW5nOyBvcGVyYXRvcjogc3RyaW5nOyByaWdodDogc3RyaW5nIH0ge1xuICAgIGlmICghYyB8fCB0eXBlb2YgYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGxlZnQ6ICdVc2VydHlwZScsIG9wZXJhdG9yOiAnaXMnLCByaWdodDogJ1ByZW1pdW0nIH07XG4gICAgfVxuICAgIGNvbnN0IHMgPSBjLnRyaW0oKTtcbiAgICBjb25zdCBvcGVyYXRvcnMgPSBbJyBpcyBub3QgJywgJyBpcyAnLCAnIGNvbnRhaW5zICcsICcgZXF1YWxzICcsICcgc3RhcnRzIHdpdGggJywgJyBlbmRzIHdpdGggJ107XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcGVyYXRvcnMpIHtcbiAgICAgIGNvbnN0IGkgPSBzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcCk7XG4gICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZWZ0OiBzLnNsaWNlKDAsIGkpLnRyaW0oKSxcbiAgICAgICAgICBvcGVyYXRvcjogb3AudHJpbSgpLFxuICAgICAgICAgIHJpZ2h0OiBzLnNsaWNlKGkgKyBvcC5sZW5ndGgpLnRyaW0oKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogcywgb3BlcmF0b3I6ICdpcycsIHJpZ2h0OiAnJyB9O1xuICB9XG5cbiAgLyoqIEJ1aWxkIGNvbmRpdGlvbiBzdHJpbmcgZnJvbSBmb3JtIHZhbHVlcyAqL1xuICBwcml2YXRlIGJ1aWxkQ29uZGl0aW9uRnJvbUZvcm0oKTogc3RyaW5nIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IG9wID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlID8/ICdpcyc7XG4gICAgY29uc3QgcmlnaHQgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUgPz8gJyc7XG4gICAgXG4gICAgLy8gSWYgbGVmdCBpcyBhbiBJRCAobnVtYmVyKSwgZmluZCB0aGUgbmF0dXJhbFRleHQgZnJvbSBvcHRpb25zXG4gICAgaWYgKGxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcobGVmdCk7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbnVtYmVyIChJRCkgb3IgaWYgd2UgbmVlZCB0byBmaW5kIHRoZSBuYXR1cmFsVGV4dFxuICAgICAgY29uc3QgaXNOdW1lcmljSWQgPSAhaXNOYU4oTnVtYmVyKGxlZnRWYWx1ZSkpICYmIGxlZnRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgXG4gICAgICBpZiAoaXNOdW1lcmljSWQpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgb3B0aW9uIGJ5IElEIGFuZCB1c2UgaXRzIG5hdHVyYWxUZXh0XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gbGVmdFZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbiAmJiBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGxlZnQgPSBTdHJpbmcoc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgYSBuYXR1cmFsVGV4dCBvciBuZWVkcyB0byBiZSBmb3VuZFxuICAgICAgICBjb25zdCBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLm5hdHVyYWxUZXh0ID09PSBsZWZ0IHx8IG9wdGlvbi5uYW1lID09PSBsZWZ0IHx8IG9wdGlvbi52YWx1ZSA9PT0gbGVmdFxuICAgICAgICApO1xuICAgICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24gJiYgc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBsZWZ0ID0gU3RyaW5nKHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gW2xlZnQsIG9wLCByaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGxTdGVwcyA9IHRoaXMuYnJhbmNoZXMucmVkdWNlPFRlc3RDYXNlU3RlcENvbmZpZ1tdPihcbiAgICAgIChhY2MsIGJyYW5jaCkgPT4gYWNjLmNvbmNhdChicmFuY2gubmVzdGVkU3RlcHMpLFxuICAgICAgW11cbiAgICApO1xuICAgIGlmIChhbGxTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnMCBzdGVwcyc7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0U3RlcCA9IGFsbFN0ZXBzWzBdO1xuICAgIGNvbnN0IGxhc3RTdGVwID0gYWxsU3RlcHNbYWxsU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgc3RhcnQgPSAoZmlyc3RTdGVwIGFzIGFueSkuc3RlcE51bWJlciB8fCAxO1xuICAgIGNvbnN0IGVuZCA9IChsYXN0U3RlcCBhcyBhbnkpLnN0ZXBOdW1iZXIgfHwgYWxsU3RlcHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ID0gYWxsU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiBgU3RlcHMgJHtzdGFydH0tJHtlbmR9ICgke2NvdW50fSBzdGVwJHtjb3VudCAhPT0gMSA/ICdzJyA6ICcnfSlgO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoLCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5icmFuY2hTdGVwQ2hhbmdlLmVtaXQoeyBicmFuY2gsIHN0ZXAsIHN0ZXBJbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgYnJhbmNoOiBDb25kaXRpb25CcmFuY2gsIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIHN0ZXAtZ3JvdXA6IHtjb25maWcsIGV4cGFuZGVkfVxuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50LmV4cGFuZGVkO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50J3MgY29uZmlnIGlzIGEgc3RlcC1ncm91cCAobm90IHRoZSBjdXJyZW50IHN0ZXApXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbmVzdGVkIHN0ZXAtZ3JvdXAgZXZlbnRzIGJ1YmJsZSB1cCBjb3JyZWN0bHlcbiAgICAgIGlmICh0aGlzLmlzU3RlcEdyb3VwKGV2ZW50LmNvbmZpZykpIHtcbiAgICAgICAgLy8gUmUtZW1pdCB0aGUgdG9nZ2xlRXhwYW5kZWQgZXZlbnQgd2l0aCB0aGUgb2JqZWN0IGZvcm1hdCwgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIC8vIENhc3QgdG8gc2F0aXNmeSBUeXBlU2NyaXB0IC0gdGhlIHJlbmRlcmVyIGFjY2VwdHMgVGVzdENhc2VTdGVwQ29uZmlnIHdoaWNoIGluY2x1ZGVzIFN0ZXBHcm91cENvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIGFueSBhcyBDb25kaXRpb25TdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbkFkZFN0ZXAoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGJyYW5jaCB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCwgc3RlcEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZVN0ZXAuZW1pdCh7IGJyYW5jaCwgc3RlcEluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZWRpdCBmcm9tIG5lc3RlZCBzdGVwIGluIGEgYnJhbmNoIHNvIHRoZSBwb3J0YWwgY2FuIG9wZW4gZWRpdCBtb2RhbCAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWRFZGl0KGV2ZW50OiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5zdGVwICE9IG51bGwpIHRoaXMuZWRpdC5lbWl0KGV2ZW50IGFzIGFueSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBkdXBsaWNhdGUgZnJvbSBuZXN0ZWQgc3RlcCBpbiBhIGJyYW5jaCBzbyB0aGUgcG9ydGFsIGNhbiBkdXBsaWNhdGUgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRHVwbGljYXRlKGV2ZW50OiBhbnksIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKGV2ZW50ICYmIGV2ZW50LnN0ZXAgIT0gbnVsbCkgPyBldmVudCA6IHsgc3RlcCB9IGFzIGFueSk7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEJyYW5jaC5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlQnJhbmNoLmVtaXQoYnJhbmNoKTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICAvLyBBZGQgYSBuZXcgYnJhbmNoIHRvIHRoZSBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBcbiAgICBpZiAoIW5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgbmV3QnJhbmNoOiBDb25kaXRpb25CcmFuY2ggPSB7XG4gICAgICB0eXBlOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdpZicgOiAnZWxzZScsXG4gICAgICBsYWJlbDogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnSUYgVFJVRScgOiAnRUxTRScsXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIC8vIERlbGV0ZSBhIGJyYW5jaCBmcm9tIHRoZSBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBcbiAgICBpZiAobmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgY29uc3QgaW5kZXggPSBuZXN0ZWRTdGVwLmJyYW5jaGVzLmluZGV4T2YoYnJhbmNoKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc05vcm1hbFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBOb3JtYWxTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2V2ZW50VHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzTG9vcFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBMb29wU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdsb29wVHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzQ29uZGl0aW9uU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIENvbmRpdGlvblN0ZXBDb25maWcge1xuICAgIHJldHVybiAnY29uZGl0aW9uJyBpbiBzdGVwICYmICdicmFuY2hlcycgaW4gc3RlcDtcbiAgfVxuXG4gIGlzU3RlcEdyb3VwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgU3RlcEdyb3VwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2dyb3VwTmFtZScgaW4gc3RlcDtcbiAgfVxuXG4gIGdldEJyYW5jaExhYmVsKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnJhbmNoLmxhYmVsIHx8IChicmFuY2gudHlwZSA9PT0gJ2lmJyA/ICdJRiBUUlVFJyA6IGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicgPyAnRUxTRSBJRicgOiAnRUxTRScpO1xuICB9XG5cbiAgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgaWYgKGJyYW5jaC50eXBlID09PSAnaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS1iZy1bIzBEQkQ3RDFBXSc7XG4gICAgfSBlbHNlIGlmIChicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS1iZy15ZWxsb3ctNTAgY3FhLWJvcmRlci15ZWxsb3ctMjAwJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjcWEtYmctcmVkLTUwIGNxYS1ib3JkZXItcmVkLTIwMCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnJhbmNoVGV4dENvbG9yKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICBpZiAoYnJhbmNoLnR5cGUgPT09ICdpZicpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtWyMwRDU0MkJdJztcbiAgICB9IGVsc2UgaWYgKGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQteWVsbG93LTcwMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtcmVkLTcwMCc7XG4gICAgfVxuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gY29uZGl0aW9uIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0ge1xuICAgICAgY29uZGl0aW9uTGVmdDogdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlLFxuICAgICAgY29uZGl0aW9uT3BlcmF0b3I6IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8udmFsdWUsXG4gICAgICBjb25kaXRpb25SaWdodDogdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy52YWx1ZSxcbiAgICB9O1xuICAgIFxuICAgIC8vIElmIGNvbmZpZyBoYXMgbmF0dXJhbFRleHRBY3Rpb25JZCwgZmluZCB0aGUgbWF0Y2hpbmcgbmF0dXJhbCB0ZXh0IGFjdGlvblxuICAgIGxldCBjb25kaXRpb25MZWZ0VmFsdWUgPSAnJztcbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdBY3Rpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0FjdGlvbikge1xuICAgICAgICAvLyBVc2UgbmF0dXJhbFRleHQgZXhhY3RseSBhcyByZWNlaXZlZCBmcm9tIEFQSVxuICAgICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBtYXRjaGluZ0FjdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ0FjdGlvbi5uYW1lID8/IG1hdGNoaW5nQWN0aW9uLnZhbHVlID8/ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBubyBuYXR1cmFsVGV4dEFjdGlvbklkIG1hdGNoIGZvdW5kLCBwYXJzZSBmcm9tIGNvbmRpdGlvbiBzdHJpbmdcbiAgICBpZiAoIWNvbmRpdGlvbkxlZnRWYWx1ZSkge1xuICAgICAgY29uc3QgeyBsZWZ0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKHRoaXMuY29uZGl0aW9uKTtcbiAgICAgIGNvbmRpdGlvbkxlZnRWYWx1ZSA9IGxlZnQ7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHsgb3BlcmF0b3IsIHJpZ2h0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKHRoaXMuY29uZGl0aW9uKTtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUoY29uZGl0aW9uTGVmdFZhbHVlKTtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKG9wZXJhdG9yKTtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKHJpZ2h0KTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgLy8gRG8gbm90IHByZS1wb3B1bGF0ZSBFTFNFIElGIGJyYW5jaGVzIGluIGVkaXQgbW9kZTsgdGhleSBhcmUgc2hvd24gb25seSB3aGVuIHVzZXIgY2xpY2tzIFwiQWRkIEVMU0UgSUZcIlxuICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMgPSBbXTtcbiAgfVxuXG4gIG9uRWRpdENhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uTGVmdCA/PyAnJyk7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy5zZXRWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25PcGVyYXRvciA/PyAnaXMnKTtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvblJpZ2h0ID8/ICcnKTtcbiAgICBcbiAgICAvLyBSZXNldCBhbGwgRUxTRSBJRiBicmFuY2hlcyB0byB0aGVpciBzbmFwc2hvdHNcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzLmZvckVhY2goYnJhbmNoID0+IHtcbiAgICAgIGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUoYnJhbmNoLnNuYXBzaG90LmNvbmRpdGlvbkxlZnQgPz8gJycpO1xuICAgICAgYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8uc2V0VmFsdWUoYnJhbmNoLnNuYXBzaG90LmNvbmRpdGlvbk9wZXJhdG9yID8/ICdpcycpO1xuICAgICAgYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8uc2V0VmFsdWUoYnJhbmNoLnNuYXBzaG90LmNvbmRpdGlvblJpZ2h0ID8/ICcnKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhciBhbGwgRUxTRSBJRiBicmFuY2hlc1xuICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMgPSBbXTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHBheWxvYWQgZm9yIG9uZSBFTFNFIElGIGJyYW5jaCAoYWN0aW9uLCBuYXR1cmFsVGV4dEFjdGlvbklkLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEsIHRlc3REYXRhTGlzdClcbiAgICogc28gdGhlIHBhcmVudCBjYW4gY3JlYXRlIHRoZSBzdGVwIHZpYSBQT1NUIHRoZW4gUFVUIHdoZW4gQXBwbHkgaXMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRFbHNlSWZCcmFuY2hQYXlsb2FkKGJyYW5jaDoge1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdO1xuICAgIHRlbXBsYXRlVmFyaWFibGVzRm9ybTogRm9ybUdyb3VwO1xuICB9KTogeyBhY3Rpb246IHN0cmluZzsgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyB0ZXN0RGF0YUxpc3Q/OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+IH0ge1xuICAgIGNvbnN0IGNvbmRpdGlvbkxlZnQgPSBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGNvbmRpdGlvbk9wZXJhdG9yID0gYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8udmFsdWUgPz8gJ2lzJztcbiAgICBjb25zdCBjb25kaXRpb25SaWdodCA9IGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGxldCBuYXR1cmFsVGV4dEFjdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hdHVyYWxUZXh0VmFsdWU6IHN0cmluZyA9IGNvbmRpdGlvbkxlZnQ7XG4gICAgaWYgKGNvbmRpdGlvbkxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcoY29uZGl0aW9uTGVmdCk7XG4gICAgICBjb25zdCBpc051bWVyaWNJZCA9ICFpc05hTihOdW1iZXIobGVmdFZhbHVlKSkgJiYgbGVmdFZhbHVlLnRyaW0oKSAhPT0gJyc7XG4gICAgICBjb25zdCBzZWxlY3RlZEFjdGlvbjogYW55ID0gaXNOdW1lcmljSWRcbiAgICAgICAgPyB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IFN0cmluZyhvcHQuaWQpID09PSBsZWZ0VmFsdWUpXG4gICAgICAgIDogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHQubmFtZSA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHQudmFsdWUgPT09IGNvbmRpdGlvbkxlZnRcbiAgICAgICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSBzZWxlY3RlZEFjdGlvbi5pZDtcbiAgICAgICAgbmF0dXJhbFRleHRWYWx1ZSA9IHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0IHx8IHNlbGVjdGVkQWN0aW9uLm5hbWUgfHwgc2VsZWN0ZWRBY3Rpb24udmFsdWUgfHwgY29uZGl0aW9uTGVmdDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnkgPSB7fTtcbiAgICBjb25zdCB0ZXN0RGF0YUxpc3Q6IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBpZiAoYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMgJiYgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB0ZXN0RGF0YUxpc3QucHVzaCh7IHRlc3REYXRhOiBTdHJpbmcodmFsdWUpLCB0ZXN0RGF0YVR5cGU6ICdyYXcnIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgYWN0aW9uID0gW25hdHVyYWxUZXh0VmFsdWUsIGNvbmRpdGlvbk9wZXJhdG9yLCBjb25kaXRpb25SaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBhY3Rpb24gfHwgKGJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlPy5uYXR1cmFsVGV4dCA/PyAnJyksXG4gICAgICAuLi4obmF0dXJhbFRleHRBY3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLihPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSksXG4gICAgICAuLi4odGVzdERhdGFMaXN0Lmxlbmd0aCA+IDAgJiYgeyB0ZXN0RGF0YUxpc3QgfSksXG4gICAgfTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IGNvbmRpdGlvbkxlZnQgPSBmb3JtVmFsdWVzLmNvbmRpdGlvbkxlZnQgPz8gJyc7XG4gICAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBmb3JtVmFsdWVzLmNvbmRpdGlvbk9wZXJhdG9yID8/ICdpcyc7XG4gICAgY29uc3QgY29uZGl0aW9uUmlnaHQgPSBmb3JtVmFsdWVzLmNvbmRpdGlvblJpZ2h0ID8/ICcnO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIG5hdHVyYWwgdGV4dCBhY3Rpb24gYW5kIGdldCBuYXR1cmFsVGV4dCAobm90IElEKVxuICAgIGxldCBuYXR1cmFsVGV4dEFjdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hdHVyYWxUZXh0VmFsdWU6IHN0cmluZyA9IGNvbmRpdGlvbkxlZnQ7IC8vIERlZmF1bHQgdG8gY29uZGl0aW9uTGVmdFxuICAgIFxuICAgIGlmIChjb25kaXRpb25MZWZ0ICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gU3RyaW5nKGNvbmRpdGlvbkxlZnQpO1xuICAgICAgY29uc3QgaXNOdW1lcmljSWQgPSAhaXNOYU4oTnVtYmVyKGxlZnRWYWx1ZSkpICYmIGxlZnRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgXG4gICAgICBsZXQgc2VsZWN0ZWRBY3Rpb246IGFueTtcbiAgICAgIGlmIChpc051bWVyaWNJZCkge1xuICAgICAgICAvLyBGaW5kIGJ5IElEIGFuZCBnZXQgbmF0dXJhbFRleHRcbiAgICAgICAgc2VsZWN0ZWRBY3Rpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBsZWZ0VmFsdWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbmQgYnkgbmF0dXJhbFRleHQsIG5hbWUsIG9yIHZhbHVlXG4gICAgICAgIHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBvcHRpb24ubmF0dXJhbFRleHQgPT09IGNvbmRpdGlvbkxlZnQgfHwgb3B0aW9uLm5hbWUgPT09IGNvbmRpdGlvbkxlZnQgfHwgb3B0aW9uLnZhbHVlID09PSBjb25kaXRpb25MZWZ0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChzZWxlY3RlZEFjdGlvbikge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gc2VsZWN0ZWRBY3Rpb24uaWQ7XG4gICAgICAgIC8vIFVzZSBuYXR1cmFsVGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gbmFtZSBvciB2YWx1ZVxuICAgICAgICBuYXR1cmFsVGV4dFZhbHVlID0gc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQgfHwgc2VsZWN0ZWRBY3Rpb24ubmFtZSB8fCBzZWxlY3RlZEFjdGlvbi52YWx1ZSB8fCBjb25kaXRpb25MZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDb2xsZWN0IHRlbXBsYXRlIHZhcmlhYmxlcyB2YWx1ZXMgZm9yIGV2ZW50IG9iamVjdFxuICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzRGF0YTogYW55ID0ge307XG4gICAgLy8gQnVpbGQgdGVzdERhdGFMaXN0IGFycmF5IGluIHRoZSBvcmRlciBvZiB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICBjb25zdCB0ZXN0RGF0YUxpc3Q6IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIC8vIEFkZCB0byBldmVudCBvYmplY3QgKGUuZy4sIHNvdXJjZV92YWx1ZSwgdGFyZ2V0X3ZhbHVlKVxuICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YVt2YXJpYWJsZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIC8vIEFkZCB0byB0ZXN0RGF0YUxpc3QgYXJyYXkgKG9yZGVyIG1hdHRlcnMgLSBtYWludGFpbiB0ZW1wbGF0ZSB2YXJpYWJsZSBvcmRlcilcbiAgICAgICAgICB0ZXN0RGF0YUxpc3QucHVzaCh7XG4gICAgICAgICAgICB0ZXN0RGF0YTogU3RyaW5nKHZhbHVlKSxcbiAgICAgICAgICAgIHRlc3REYXRhVHlwZTogJ3JhdydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIGNvbmRpdGlvbiBzdHJpbmcgdXNpbmcgbmF0dXJhbFRleHQgKG5vdCBJRClcbiAgICB0aGlzLmNvbmRpdGlvbiA9IFtuYXR1cmFsVGV4dFZhbHVlLCBjb25kaXRpb25PcGVyYXRvciwgY29uZGl0aW9uUmlnaHRdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgXG4gICAgLy8gQnVpbGQgcGF5bG9hZCBmb3IgZWFjaCBuZXdseSBhZGRlZCBFTFNFIElGIChzbyBwYXJlbnQgY2FuIGNhbGwgUE9TVCB0aGVuIFBVVCB3aGVuIEFwcGx5IGlzIGNsaWNrZWQpXG4gICAgY29uc3QgbmV3RWxzZUlmQnJhbmNoZXMgPSB0aGlzLmVsc2VJZkJyYW5jaGVzLm1hcChiID0+IHRoaXMuYnVpbGRFbHNlSWZCcmFuY2hQYXlsb2FkKGIpKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlc1xuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IENvbmRpdGlvblN0ZXBDb25maWcgJiB7IFxuICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlcjsgXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7XG4gICAgICB0ZXN0RGF0YUxpc3Q/OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+O1xuICAgICAgbmV3RWxzZUlmQnJhbmNoZXM/OiBBcnJheTx7IGFjdGlvbjogc3RyaW5nOyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IHRlc3REYXRhTGlzdD86IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gfT47XG4gICAgfSA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiwgLy8gQ29uZGl0aW9uIG5vdyB1c2VzIG5hdHVyYWxUZXh0XG4gICAgICBzdGVwVHlwZTogdGhpcy5jb25maWcuc3RlcFR5cGUgfHwgU3RlcFR5cGVzLkNPTkRJVElPTl9JRiwgLy8gRW5zdXJlIHN0ZXBUeXBlIGlzIHNldFxuICAgICAgLi4uKG5hdHVyYWxUZXh0QWN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiB7IG5hdHVyYWxUZXh0QWN0aW9uSWQgfSBhcyBhbnkpLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRlbXBsYXRlVmFyaWFibGVzRGF0YSkubGVuZ3RoID4gMCAmJiB7IHRlbXBsYXRlVmFyaWFibGVzRGF0YSB9IGFzIGFueSksXG4gICAgICAuLi4odGVzdERhdGFMaXN0Lmxlbmd0aCA+IDAgJiYgeyB0ZXN0RGF0YUxpc3QgfSBhcyBhbnkpLFxuICAgICAgLi4uKG5ld0Vsc2VJZkJyYW5jaGVzLmxlbmd0aCA+IDAgJiYgeyBuZXdFbHNlSWZCcmFuY2hlcyB9IGFzIGFueSksXG4gICAgfTtcbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnIChpbmNsdWRlcyBuZXdFbHNlSWZCcmFuY2hlcyBzbyBwYXJlbnQgY2FuIGNyZWF0ZSBzdGVwcyBvbiBBcHBseSlcbiAgICBjb25zb2xlLmxvZygnQ29uZGl0aW9uLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKTtcbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQoeyBzdGVwOiB0aGlzLmNvbmZpZyBhcyBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBpc05hTihpbmRleCkgPyAwIDogaW5kZXggfSk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gY29uZGl0aW9uIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGU6ICdJRiAvIEVMU0UgU3RlcCBEZXRhaWxzJyxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKiogR2V0IHNlbGVjdCBjb25maWcgZm9yIGEgdGVtcGxhdGUgdmFyaWFibGUgKi9cbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGU6IGFueSwgYnJhbmNoSWRPcklzRWxzZTogc3RyaW5nIHwgYm9vbGVhbiA9IGZhbHNlKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgLy8gSWYgYnJhbmNoSWRPcklzRWxzZSBpcyBhIHN0cmluZywgaXQncyBhIGJyYW5jaCBJRDsgb3RoZXJ3aXNlIGl0J3MgYSBib29sZWFuIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgbGV0IGZvcm06IEZvcm1Hcm91cDtcbiAgICBpZiAodHlwZW9mIGJyYW5jaElkT3JJc0Vsc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmQoYiA9PiBiLmlkID09PSBicmFuY2hJZE9ySXNFbHNlKTtcbiAgICAgIGZvcm0gPSBicmFuY2g/LnRlbXBsYXRlVmFyaWFibGVzRm9ybSB8fCB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybSA9IGJyYW5jaElkT3JJc0Vsc2UgPyAodGhpcy5lbHNlSWZCcmFuY2hlc1swXT8udGVtcGxhdGVWYXJpYWJsZXNGb3JtIHx8IHRoaXMuZmIuZ3JvdXAoe30pKSA6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZvcm0gJiYgZm9ybS5nZXQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICBmb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwiJ2NxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gJyArIChpc05lc3RlZCA/ICcgY3FhLXBsLVsyNHB4XScgOiAnJylcIj5cbiAgPCEtLSBJbmxpbmUgRWRpdCBNb2RlOiBzdG9wIHByb3BhZ2F0aW9uIHNvIGRyb3Bkb3duL2F1dG9jb21wbGV0ZSBpbnRlcmFjdGlvbnMgZG9uJ3QgYnViYmxlIGFuZCBjb2xsYXBzZSB0aGUgc3RlcCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPCEtLSBGaXJzdCBSb3c6IENPTkRJVElPTiB0YWcsIGF1dG9jb21wbGV0ZSwgSUYvRUxTRSBpbmRpY2F0b3JzLCBFZGl0IEluIGRlcHRoLCBDYW5jZWwvQXBwbHkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gQ09ORElUSU9OIFRhZyAob3JhbmdlKSAtLT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LVsjRUE1ODBDXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctWyNGRkVERDVdXCI+XG4gICAgICAgICAgQ09ORElUSU9OXG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIEZpcnN0IGZpZWxkOiBsZWZ0IG9wZXJhbmQgKGUuZy4gVXNlcnR5cGUpIC0gYXV0b2NvbXBsZXRlIHdpdGggSUZfQ09ORElUSU9OIG5hdHVyYWwgdGV4dCBhY3Rpb25zIC0tPlxuICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtvcHRpb25zXT1cImNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb25MZWZ0JywgJGV2ZW50KVwiXG4gICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkNvbmRpdGlvbkxlZnRTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY29uZGl0aW9uXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cblxuICAgICAgICA8IS0tIFNlY29uZCBSb3c6IFRlbXBsYXRlIFZhcmlhYmxlcyBTZWN0aW9uIChzaG93biB3aGVuIHRlbXBsYXRlIGlzIHNlbGVjdGVkLCBpbmxpbmUgYmVmb3JlIEVkaXQgSW4gZGVwdGgpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUZW1wbGF0ZSAmJiB0ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiB0ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIE5vbi1ib29sZWFuIHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbicgJiYgdmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJ1wiPlxuICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciBzZWxlY3QgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSA9PT0gJ3R5cGUnIHx8IHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycgfHwgdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWdGb3JWYXJpYWJsZSh2YXJpYWJsZSwgZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gVGV4dCBJbnB1dCBmb3Igb3RoZXIgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ3R5cGUnICYmIHZhcmlhYmxlLm5hbWUgIT09ICdzY3JvbGxUbycgJiYgIXZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgJyArIHZhcmlhYmxlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJRiAvIEVMU0UgaW5kaWNhdG9ycyAtLT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI0RDRkNFN10gY3FhLXRleHQtWyMwMDgyMzZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjQjlGOENGXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYuNjY2MzQgMkwyLjk5OTY3IDUuNjY2NjdMMS4zMzMwMSA0XCIgc3Ryb2tlPVwiIzAwODIzNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICBJRlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwhLS0gQWRkIEVMU0UgSUYgYnV0dG9uIC0gYWx3YXlzIHZpc2libGUgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib25BZGRFbHNlKClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgQWRkIEVMU0UgSUZcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwhLS0gQWRkIEVsc2UgYnV0dG9uIC0gY2FsbHMgQVBJIHRvIGNyZWF0ZSBDT05ESVRJT05fRUxTRSBzdGVwIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRWxzZUJyYW5jaCgpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiPlxuICAgICAgICAgIEFkZCBFTFNFXG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPlxuICAgICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgICAgPC9hPiAgICAgIFxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IGJ1dHRvbnMgLSBzaG93biBvbiBJRiByb3cgd2hlbiBubyBFTFNFIElGIGJyYW5jaGVzIGFyZSBwcmVzZW50IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImVsc2VJZkJyYW5jaGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICBcbiAgPC9kaXY+XG5cbiAgPCEtLSBFTFNFIElGIFNlY3Rpb25zIGluIEVkaXQgTW9kZSAtIExvb3AgdGhyb3VnaCBhbGwgRUxTRSBJRiBicmFuY2hlcyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnJhbmNoIG9mIGVsc2VJZkJyYW5jaGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdXCI+XG4gICAgICA8IS0tIEZpcnN0IFJvdzogUmVtb3ZlIEVMU0UgSUYgYnV0dG9uLCBhdXRvY29tcGxldGUsIEVkaXQgSW4gZGVwdGgsIENhbmNlbC9BcHBseSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgICAgPCEtLSBSZW1vdmUgRUxTRSBJRiBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVFbHNlKGJyYW5jaC5pZClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyM5OUExQUZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLVsjRTVFN0VCXSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgIFJlbW92ZSBFTFNFIElGXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEVMU0UgSUYgYXV0b2NvbXBsZXRlIGZpZWxkOiBzYW1lIGFzIElGIGNvbmRpdGlvbiAtLT5cbiAgICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgKm5nSWY9XCJicmFuY2guZm9ybVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJjb25kaXRpb25MZWZ0QXV0b2NvbXBsZXRlT3B0aW9uc1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiYnJhbmNoLmZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJicmFuY2guZm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3B0aW9uU2VsZWN0KT1cIm9uRWxzZUNvbmRpdGlvbkxlZnRTZWxlY3QoJGV2ZW50LCBicmFuY2guaWQpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbmRpdGlvblwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gU2Vjb25kIFJvdzogRUxTRSBJRiBUZW1wbGF0ZSBWYXJpYWJsZXMgU2VjdGlvbiAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCwgaW5saW5lIGJlZm9yZSBFZGl0IEluIGRlcHRoKSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgJiYgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gTm9uLWJvb2xlYW4gdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhcmlhYmxlLm5hbWUgIT09ICdjdXN0b21fY29kZSdcIj5cbiAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciBzZWxlY3QgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlLCBicmFuY2guaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPCEtLSBUZXh0IElucHV0IGZvciBvdGhlciB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICd0eXBlJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2Nyb2xsVG8nICYmICF2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ2YXJpYWJsZS5sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gQ2FuY2VsIC8gQXBwbHkgYnV0dG9ucyAtIHNob3duIGluIGxhc3QgRUxTRSBJRiByb3cgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpID09PSBlbHNlSWZCcmFuY2hlcy5sZW5ndGggLSAxXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gQ29uZGl0aW9uIEhlYWRlciAobm9ybWFsIHZpZXcgd2hlbiBub3QgZWRpdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCIgW2NsYXNzXT1cIidzdGVwLXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMiAnICsgKGlzSW5zaWRlTG9vcCA/ICdjcWEtcGwtMTAgY3FhLXByLTQnIDogJ2NxYS1weC00JylcIj5cbiAgICA8IS0tIERyYWcgSGFuZGxlIEljb24gKHdoZW4gaXNSZW9yZGVyIGlzIHRydWUpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1tci0yIGNxYS1jdXJzb3ItbW92ZSBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLXRleHQtWyMxMTE4MjddXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQ2hlY2tib3ggKHdoZW4gaXNSZW9yZGVyIGlzIGZhbHNlKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcmVsYXRpdmUgY3FhLW1yLTJcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImNxYS1oLTQgY3FhLXctNCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1hcHBlYXJhbmNlLW5vbmUgY3FhLXJvdW5kZWQgc2hhZG93IGhvdmVyOmNxYS1zaGFkb3ctbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItc2xhdGUtMzAwIGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwic2VsZWN0ZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwic2VsZWN0ZWRcIlxuICAgICAgICBpZD1cImNoZWNrLWNvbmRpdGlvblwiIC8+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdGV4dC13aGl0ZSBjcWEtdG9wLTEvMiBjcWEtbGVmdC0xLzIgY3FhLS10cmFuc2xhdGUteC0xLzIgY3FhLS10cmFuc2xhdGUteS0xLzIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktMF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktMTAwXT1cInNlbGVjdGVkXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMiAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAgMy4xMjVMNC41IDguNjI1TDIgNi4xMjVcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLW1pbi13LVszMnB4XVwiPnt7IHN0ZXBOdW1iZXIgfX08L3NwYW4+XG4gICAgPCEtLSBFeHBhbmQvQ29sbGFwc2UgSWNvbiAtLT5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25Ub2dnbGVFeHBhbmRlZCgpXCIgY2xhc3M9XCJjcWEtcC0wXCI+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCIhZXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxMEw4IDZMNCAxMFwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIElGL0VMU0UgSWNvbiAtLT5cbiAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTQgMlYxMFwiIHN0cm9rZT1cIiM3QjMzMDZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTEyIDZDMTMuMTA0NiA2IDE0IDUuMTA0NTcgMTQgNEMxNCAyLjg5NTQzIDEzLjEwNDYgMiAxMiAyQzEwLjg5NTQgMiAxMCAyLjg5NTQzIDEwIDRDMTAgNS4xMDQ1NyAxMC44OTU0IDYgMTIgNlpcIlxuICAgICAgICAgIHN0cm9rZT1cIiM3QjMzMDZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTQgMTRDNS4xMDQ1NyAxNCA2IDEzLjEwNDYgNiAxMkM2IDEwLjg5NTQgNS4xMDQ1NyAxMCA0IDEwQzIuODk1NDMgMTAgMiAxMC44OTU0IDIgMTJDMiAxMy4xMDQ2IDIuODk1NDMgMTQgNCAxNFpcIlxuICAgICAgICAgIHN0cm9rZT1cIiM3QjMzMDZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0xMiA2QzEyIDcuNTkxMyAxMS4zNjc5IDkuMTE3NDIgMTAuMjQyNiAxMC4yNDI2QzkuMTE3NDIgMTEuMzY3OSA3LjU5MTMgMTIgNiAxMlwiIHN0cm9rZT1cIiM3QjMzMDZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+PC9kaXY+XG5cbiAgICA8IS0tIElGL0VMU0UgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzdCMzMwNl0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIElGIC8gRUxTRVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gQ29uZGl0aW9uIElucHV0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWwtMiBjcWEtZmxleC0xXCI+XG4gICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImNvbmRpdGlvblwiPjwvc3Bhbj5cbiAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XVwiPlxuICAgICAgICBJZlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+LnN1Y2Nlc3MtbWVzc2FnZTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF1cIj5cbiAgICAgICAgaXMgdmlzaWJsZVxuICAgICAgPC9zcGFuPiAtLT5cbiAgICAgIDwhLS0gPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvblwiXG4gICAgICAgIChpbnB1dCk9XCJvbkNvbmRpdGlvbkNoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZWxlbWVudCBgLnN1Y2Nlc3MtbWVzc2FnZWAgaXMgdmlzaWJsZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDAgY3FhLWJnLXdoaXRlIGNxYS10ZXh0LWdyYXktOTAwIGNxYS10ZXh0LXNtIGNxYS1mbGV4LTEgY3FhLW1heC13LW1kIGNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLXJpbmctMiBmb2N1czpjcWEtcmluZy1wcmltYXJ5IGZvY3VzOmNxYS1yaW5nLW9wYWNpdHktNTBcIlxuICAgICAgLz4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBiZWZvcmUgYWN0aW9uIGljb25zLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXI7IGhpZGRlbiB3aGVuIGluc2lkZSBzdGVwLWdyb3VwKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF1cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNyAxMS42NjY2SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTkuNTUyMDggMi4xMTI4QzkuNzg0MyAxLjg4MDU4IDEwLjA5OTMgMS43NTAxMiAxMC40Mjc3IDEuNzUwMTJDMTAuNzU2MSAxLjc1MDEyIDExLjA3MSAxLjg4MDU4IDExLjMwMzMgMi4xMTI4QzExLjUzNTUgMi4zNDUwMiAxMS42NjU5IDIuNjU5OTggMTEuNjY1OSAyLjk4ODM4QzExLjY2NTkgMy4zMTY3OSAxMS41MzU1IDMuNjMxNzUgMTEuMzAzMyAzLjg2Mzk3TDQuMjk3NDIgMTAuODcwNEM0LjE1ODY0IDExLjAwOTIgMy45ODcxIDExLjExMDcgMy43OTg2NyAxMS4xNjU2TDIuMTIzMzMgMTEuNjU0NEMyLjA3MzE0IDExLjY2OSAyLjAxOTkzIDExLjY2OTkgMS45NjkyOCAxMS42NTY5QzEuOTE4NjMgMTEuNjQzOSAxLjg3MjQgMTEuNjE3NiAxLjgzNTQzIDExLjU4MDZDMS43OTg0NiAxMS41NDM3IDEuNzcyMSAxMS40OTc0IDEuNzU5MTMgMTEuNDQ2OEMxLjc0NjE1IDExLjM5NjEgMS43NDcwMyAxMS4zNDI5IDEuNzYxNjcgMTEuMjkyN0wyLjI1MDUgOS42MTczOEMyLjMwNTQ2IDkuNDI5MTYgMi40MDY5OCA5LjI1NzgzIDIuNTQ1NjcgOS4xMTkyMkw5LjU1MjA4IDIuMTEyOFpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC4zMzM5OCA3SDkuNjY3MzJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTExLjY2NiA0LjY2NjYzSDUuODMyNjhDNS4xODgzNSA0LjY2NjYzIDQuNjY2MDIgNS4xODg5NiA0LjY2NjAyIDUuODMzMjlWMTEuNjY2NkM0LjY2NjAyIDEyLjMxMSA1LjE4ODM1IDEyLjgzMzMgNS44MzI2OCAxMi44MzMzSDExLjY2NkMxMi4zMTAzIDEyLjgzMzMgMTIuODMyNyAxMi4zMTEgMTIuODMyNyAxMS42NjY2VjUuODMzMjlDMTIuODMyNyA1LjE4ODk2IDEyLjMxMDMgNC42NjY2MyAxMS42NjYgNC42NjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMi4zMzI2OCA5LjMzMzI5QzEuNjkxMDIgOS4zMzMyOSAxLjE2NjAyIDguODA4MjkgMS4xNjYwMiA4LjE2NjYzVjIuMzMzMjlDMS4xNjYwMiAxLjY5MTYzIDEuNjkxMDIgMS4xNjY2MyAyLjMzMjY4IDEuMTY2NjNIOC4xNjYwMkM4LjgwNzY4IDEuMTY2NjMgOS4zMzI2OCAxLjY5MTYzIDkuMzMyNjggMi4zMzMyOVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEuNzUgMy41SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTExLjA4MjcgMy41VjExLjY2NjdDMTEuMDgyNyAxMi4yNSAxMC40OTkzIDEyLjgzMzMgOS45MTYwMiAxMi44MzMzSDQuMDgyNjhDMy40OTkzNSAxMi44MzMzIDIuOTE2MDIgMTIuMjUgMi45MTYwMiAxMS42NjY3VjMuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjY2NjAyIDMuNDk5OTZWMi4zMzMyOUM0LjY2NjAyIDEuNzQ5OTYgNS4yNDkzNSAxLjE2NjYzIDUuODMyNjggMS4xNjY2M0g4LjE2NjAyQzguNzQ5MzUgMS4xNjY2MyA5LjMzMjY4IDEuNzQ5OTYgOS4zMzI2OCAyLjMzMzI5VjMuNDk5OTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNS44MzM5OCA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNOC4xNjYwMiA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBCcmFuY2hlcyAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8IS0tIEJyYW5jaGVzIChJRiBUUlVFLCBFTFNFIElGLCBFTFNFKSAtLT5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgYnJhbmNoZXM7IGxldCBicmFuY2hJbmRleCA9IGluZGV4XCIgY2xhc3M9XCJjb25kaXRpb24tYnJhbmNoLXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDwhLS0gQnJhbmNoIEhlYWRlciAoMiA9IEVMU0UgSUYsIDMgPSBFTFNFOyBzdWIgc3RlcHMgc2hvdyAxLjEsIDIuMSwgMy4xIGZyb20gc3RlcCBjb25maWcpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbY2xhc3NdPVwiJ2NxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgJyArIGdldEJyYW5jaFRleHRDb2xvcihicmFuY2gpICsgJyAnICsgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2gpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLW1pbi13LVszMnB4XSBjcWEtZmxleC1zaHJpbmstMFwiPnt7IGJyYW5jaEluZGV4ICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJicmFuY2guYWN0aW9uXCIgW2lubmVySFRNTF09XCJicmFuY2guYWN0aW9uXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCcmFuY2ggQ29udGVudCAoTmVzdGVkIFN0ZXBzIOKAkyByZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXAsICRldmVudC5zdGVwSW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcEZvckJyYW5jaCk9XCJvbkFkZFN0ZXAoJGV2ZW50LmJyYW5jaClcIlxuICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGxpbmspPVwib25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChzdGVwVXBkYXRlKT1cInN0ZXBVcGRhdGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50LCBicmFuY2gpXCI+XG4gICAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXJcbiAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2JyYW5jaF09XCJicmFuY2hcIlxuICAgICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZSgkZXZlbnQuYnJhbmNoLCAkZXZlbnQuc3RlcCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKGFkZFN0ZXBGb3JCcmFuY2gpPVwib25BZGRTdGVwKCRldmVudC5icmFuY2gpXCJcbiAgICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobGluayk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIlxuICAgICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCkpOyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHN0ZXBVcGRhdGUpPVwic3RlcFVwZGF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1wdHkgYnJhbmNoIChJRiAvIEVMU0UgSUYgLyBFTFNFKTogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBubyBzdGVwcywgc2FtZSBhcyBsb29wIHN0ZXAgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYnJhbmNoLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY29uZGl0aW9uLWJyYW5jaC1lbXB0eSBjcWEtbWluLWgtWzUycHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wbC00IGNxYS1wci00XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkFkZFN0ZXAoYnJhbmNoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2F0dHIudGl0bGVdPVwiJ0FkZCBzdGVwIHRvICcgKyBnZXRCcmFuY2hMYWJlbChicmFuY2gpXCJcbiAgICAgICAgICBjbGFzcz1cImNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgSUYgTWFya2VyIC0tPlxuICAgIDxkaXYgW2NsYXNzXT1cIidjcWEtcGwtNCBjcWEtcHktMSBjcWEtdGV4dC1bIzdCMzMwNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0nXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgIEVORCBJRlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
904
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9jb25kaXRpb24tc3RlcC9jb25kaXRpb24tc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2NvbmRpdGlvbi1zdGVwL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXdDLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0JyQyxDQUFDO0FBVUYsTUFBTSxPQUFPLDhCQUE4QjtJQThGekMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0Z2QixhQUFRLEdBQXNCLEVBQUUsQ0FBQztRQUNqQyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUNuQyw0Q0FBNEM7UUFDbkMsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQ3hDLGdFQUFn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RyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29uZGl0aW9uU3RlcENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBUZXN0Q2FzZVN0ZXBDb25maWcsIE5vcm1hbFN0ZXBDb25maWcsIExvb3BTdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENxYUF1dG9jb21wbGV0ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUubW9kZWwnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuY29uc3QgQ09ORElUSU9OX0JSQU5DSF9FTVBUWV9TVFlMRVMgPSBgXG4gIC8qIEVtcHR5IElGIC8gRUxTRSBJRiAvIEVMU0U6IHNob3cgcGx1cyBpY29uIG9uIGJyYW5jaCByb3cgaG92ZXIgKHNhbWUgYXMgbG9vcCBzdGVwKSAqL1xuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1yb3c6aG92ZXIgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7IC8qIFNob3cgcGx1cyBpY29uIG9uIGJyYW5jaCByb3cgaG92ZXIgKi9cbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWNvbmRpdGlvbi1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtcbiAgICBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyxcbiAgICBDT05ESVRJT05fQlJBTkNIX0VNUFRZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VDb25kaXRpb25TdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBDb25kaXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KCkgY29uZGl0aW9uITogc3RyaW5nO1xuICBASW5wdXQoKSBicmFuY2hlczogQ29uZGl0aW9uQnJhbmNoW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyBmb3Igd2hpbGUgbG9vcCBjb25kaXRpb24gKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIChzaW1pbGFyIHRvIHN0ZXAtYnVpbGRlci1jb25kaXRpb24pICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZmllbGRzLCBvcGVyYXRvciBzZWxlY3QsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEFycmF5IG9mIEVMU0UgSUYgYnJhbmNoZXMgaW4gZWRpdCBtb2RlICovXG4gIGVsc2VJZkJyYW5jaGVzOiBBcnJheTx7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfT4gPSBbXTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgYW5kIGNxYS1jdXN0b20taW5wdXQgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIE9wZXJhdG9yIGRyb3Bkb3duIGNvbmZpZyAoSVMsIElTIE5PVCwgQ09OVEFJTlMsIGV0Yy4pICovXG4gIG9wZXJhdG9yU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICAvKiogQ29uZGl0aW9uIGxlZnQgb3BlcmFuZCBkcm9wZG93biBjb25maWcgKG5hdHVyYWwgdGV4dCBhY3Rpb25zIHdpdGggSUZfQ09ORElUSU9OKSAqL1xuICBjb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTbmFwc2hvdCBmb3IgQ2FuY2VsIHJldmVydCAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfSA9IHt9O1xuICBcbiAgLyoqIFNlbGVjdGVkIHRlbXBsYXRlIGZvciBJRiBjb25kaXRpb24gKi9cbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgLyoqIFRlbXBsYXRlIHZhcmlhYmxlcyBmb3IgSUYgY29uZGl0aW9uICovXG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICAvKiogRm9ybSBncm91cCBmb3IgdGVtcGxhdGUgdmFyaWFibGVzICovXG4gIHRlbXBsYXRlVmFyaWFibGVzRm9ybSE6IEZvcm1Hcm91cDtcblxuICBAVmlld0NoaWxkKCd2aWV3RGV0YWlsc1RyaWdnZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgdmlld0RldGFpbHNUcmlnZ2VyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGJyYW5jaFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgc3RlcEluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2ggfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBJbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgXCJBZGQgRWxzZVwiIHNvIHRoZSBwYXJlbnQgY2FuIGNhbGwgUE9TVCB0ZXN0X3N0ZXBzIHdpdGggY29uZGl0aW9uVHlwZSBDT05ESVRJT05fRUxTRSAqL1xuICBAT3V0cHV0KCkgYWRkRWxzZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb25kaXRpb25TdGVwQ29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkJyYW5jaD4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIGlzIHVwZGF0ZWQgKGUuZy4sIEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGxvb3Atc3RlcCBlZGl0IG1vZGUpICovXG4gIEBPdXRwdXQoKSBzdGVwVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50LCBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IGJyYW5jaC5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLmJyYW5jaGVzID0gdGhpcy5jb25maWcuYnJhbmNoZXMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZE9wZXJhdG9yU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBSZWJ1aWxkIGZvcm0gd2hlbiBvcHRpb25zIGFyZSBsb2FkZWQgdG8gcG9wdWxhdGUgaW5pdGlhbCB2YWx1ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWRcbiAgICAgIGlmICh0aGlzLmVkaXRGb3JtICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRFZGl0Rm9ybVdpdGhOYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGVkaXQgZm9ybSB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXJlIGxvYWRlZCB0byBwb3B1bGF0ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWQgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkRWRpdEZvcm1XaXRoTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgY3VycmVudCB2YWx1ZSBpcyBlbXB0eSBvciBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICE9PSBuYXR1cmFsVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgdGVtcGxhdGUgb2JqZWN0IChOYXR1cmFsVGV4dEFjdGlvbnMpIGZyb20gdGhlIG9wdGlvblxuICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgdGVtcGxhdGUgYW5kIGdldCB2YXJpYWJsZXNcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBJZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQsIGZpbmQgdGhlIG1hdGNoaW5nIG5hdHVyYWwgdGV4dCBhY3Rpb25cbiAgICBsZXQgY29uZGl0aW9uTGVmdFZhbHVlID0gJyc7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmIChjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUElcbiAgICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgLy8gR2V0IHRoZSBmdWxsIHRlbXBsYXRlIG9iamVjdCAoTmF0dXJhbFRleHRBY3Rpb25zKSBmcm9tIHRoZSBvcHRpb25cbiAgICAgICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlIGFuZCBnZXQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKTtcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgbm8gbmF0dXJhbFRleHRBY3Rpb25JZCBtYXRjaCBmb3VuZCwgcGFyc2UgZnJvbSBjb25kaXRpb24gc3RyaW5nXG4gICAgaWYgKCFjb25kaXRpb25MZWZ0VmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBsZWZ0O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB7IG9wZXJhdG9yLCByaWdodCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29uZGl0aW9uTGVmdDogW2NvbmRpdGlvbkxlZnRWYWx1ZV0sXG4gICAgICBjb25kaXRpb25PcGVyYXRvcjogW29wZXJhdG9yXSxcbiAgICAgIGNvbmRpdGlvblJpZ2h0OiBbcmlnaHRdLFxuICAgIH0pO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdGVtcGxhdGUgdmFyaWFibGVzIGZvcm0gaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbHNlSWZCcmFuY2goaW5kZXg/OiBudW1iZXIpOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBFTFNFIElGIGZvcm0gd2l0aCBlbXB0eSB2YWx1ZXMgb3IgZnJvbSBleGlzdGluZyBFTFNFIElGIGJyYW5jaCBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBlbHNlSWZCcmFuY2hlcyA9IHRoaXMuYnJhbmNoZXM/LmZpbHRlcihiID0+IGIudHlwZSA9PT0gJ2Vsc2UtaWYnKSB8fCBbXTtcbiAgICBjb25zdCBicmFuY2hJbmRleCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyBpbmRleCA6IGVsc2VJZkJyYW5jaGVzLmxlbmd0aDtcbiAgICBjb25zdCBlbHNlSWZCcmFuY2ggPSBlbHNlSWZCcmFuY2hlc1ticmFuY2hJbmRleF07XG4gICAgY29uc3QgZWxzZUNvbmRpdGlvbiA9IGVsc2VJZkJyYW5jaD8uYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHsgbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGVsc2VDb25kaXRpb24pO1xuICAgIFxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IFtsZWZ0XSxcbiAgICAgIGNvbmRpdGlvbk9wZXJhdG9yOiBbb3BlcmF0b3JdLFxuICAgICAgY29uZGl0aW9uUmlnaHQ6IFtyaWdodF0sXG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgZWxzZS1pZi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gLFxuICAgICAgZm9ybSxcbiAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IG51bGwsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogW10sXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0sXG4gICAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0OiBsZWZ0LCBjb25kaXRpb25PcGVyYXRvcjogb3BlcmF0b3IsIGNvbmRpdGlvblJpZ2h0OiByaWdodCB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRvclNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICAgIHsgaWQ6ICdpcycsIHZhbHVlOiAnaXMnLCBuYW1lOiAnSVMnLCBsYWJlbDogJ0lTJyB9LFxuICAgICAgeyBpZDogJ2lzIG5vdCcsIHZhbHVlOiAnaXMgbm90JywgbmFtZTogJ0lTIE5PVCcsIGxhYmVsOiAnSVMgTk9UJyB9LFxuICAgICAgeyBpZDogJ2NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIG5hbWU6ICdDT05UQUlOUycsIGxhYmVsOiAnQ09OVEFJTlMnIH0sXG4gICAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRVFVQUxTJywgbGFiZWw6ICdFUVVBTFMnIH0sXG4gICAgICB7IGlkOiAnc3RhcnRzIHdpdGgnLCB2YWx1ZTogJ3N0YXJ0cyB3aXRoJywgbmFtZTogJ1NUQVJUUyBXSVRIJywgbGFiZWw6ICdTVEFSVFMgV0lUSCcgfSxcbiAgICAgIHsgaWQ6ICdlbmRzIHdpdGgnLCB2YWx1ZTogJ2VuZHMgd2l0aCcsIG5hbWU6ICdFTkRTIFdJVEgnLCBsYWJlbDogJ0VORFMgV0lUSCcgfSxcbiAgICBdO1xuICAgIHRoaXMub3BlcmF0b3JTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25PcGVyYXRvcicsXG4gICAgICBwbGFjZWhvbGRlcjogJ09wZXJhdG9yJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gbGVmdCBzZWxlY3QgY29uZmlnIHdpdGggZmlsdGVyZWQgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKElGX0NPTkRJVElPTiBvbmx5KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG5hdHVyYWwgdGV4dCBhY3Rpb25zIHRvIG9ubHkgaW5jbHVkZSB0aG9zZSB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIklGX0NPTkRJVElPTlwiXG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ0lGX0NPTkRJVElPTic7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25MZWZ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGNvbmRpdGlvbiBsZWZ0IGF1dG9jb21wbGV0ZSAoSUZfQ09ORElUSU9OIG5hdHVyYWwgdGV4dCBhY3Rpb25zKSAqL1xuICBnZXQgY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnMoKTogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWc/Lm9wdGlvbnMgPz8gW107XG4gICAgcmV0dXJuIG9wdHMubWFwKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUEksIGZhbGxiYWNrIHRvIG5hbWUvdmFsdWUvaWRcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICAvLyBTdG9yZSB0aGUgZnVsbCB0ZW1wbGF0ZSBvYmplY3QgKE5hdHVyYWxUZXh0QWN0aW9ucykgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyBwcm9jZXNzaW5nXG4gICAgICAgIC8vIFVzZSBvcHRpb24udGVtcGxhdGUgaWYgYXZhaWxhYmxlIChmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyksIG90aGVyd2lzZSB1c2Ugb3B0aW9uIGl0c2VsZlxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgb25Db25kaXRpb25MZWZ0U2VsZWN0KG9wdGlvbjogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgXG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gUGFzcyB0aGUgZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMgb2JqZWN0IHdoaWNoIGhhcyB0aGUgdmFyaWFibGVzIHByb3BlcnR5XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZygnVGVtcGxhdGUgdmFyaWFibGVzIGxvYWRlZDonLCB2YXJpYWJsZXMsICdmcm9tIHRlbXBsYXRlOicsIGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB2YXJpYWJsZXMgfHwgW107XG4gICAgICAvLyBCdWlsZCBmb3JtIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdObyBtYXRjaGluZyB0ZW1wbGF0ZSBmb3VuZCBvciB0ZW1wbGF0ZSBoYXMgbm8gdmFyaWFibGVzJywge1xuICAgICAgICBmdWxsVGVtcGxhdGUsXG4gICAgICAgIGhhc1ZhcmlhYmxlczogZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMsXG4gICAgICAgIG9wdGlvblZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgIG9wdGlvblRlbXBsYXRlOiBvcHRpb24udGVtcGxhdGVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZGF0YSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBjb25maWdXaXRoRGF0YS50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge307XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gY29udHJvbHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGV4aXN0aW5nIGRhdGEgZmlyc3QsIHRoZW4gZnJvbSB2YXJpYWJsZSBkZWZhdWx0XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBib29sZWFuIHN0cmluZyB0byBib29sZWFuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJzEnO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRWxzZUNvbmRpdGlvbkxlZnRTZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0sIGJyYW5jaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBicmFuY2ggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmQoYiA9PiBiLmlkID09PSBicmFuY2hJZCk7XG4gICAgaWYgKCFicmFuY2gpIHJldHVybjtcbiAgICBcbiAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkRWxzZVRlbXBsYXRlVmFyaWFibGVzRm9ybShicmFuY2gpO1xuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIWJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgYnVpbGRFbHNlVGVtcGxhdGVWYXJpYWJsZXNGb3JtKGJyYW5jaDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU6IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W107XG4gICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBGb3JtR3JvdXA7XG4gICAgc25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdD86IHN0cmluZzsgY29uZGl0aW9uT3BlcmF0b3I/OiBzdHJpbmc7IGNvbmRpdGlvblJpZ2h0Pzogc3RyaW5nIH07XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoIWJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBjb250cm9sc1xuICAgIE9iamVjdC5rZXlzKGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZGF0YSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGUgKGZvciBFTFNFIElGIGJyYW5jaClcbiAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBjb25maWdXaXRoRGF0YS5lbHNlVGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIFxuICAgIC8vIEFkZCBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGV4aXN0aW5nIGRhdGEgZmlyc3QsIHRoZW4gZnJvbSB2YXJpYWJsZSBkZWZhdWx0XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBib29sZWFuIHN0cmluZyB0byBib29sZWFuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJzEnO1xuICAgICAgfVxuICAgICAgXG4gICAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgb25BZGRFbHNlKCk6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBFTFNFIElGIGJyYW5jaCAoVUkgcm93IG9ubHk7IEFQSXMgYXJlIGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIEFwcGx5KVxuICAgIGNvbnN0IG5ld0JyYW5jaCA9IHRoaXMuYnVpbGRFbHNlSWZCcmFuY2goKTtcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgfVxuXG4gIG9uQWRkRWxzZUJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBFbWl0IHNvIHBhcmVudCBjYW4gY2FsbCBQT1NUIHRlc3Rfc3RlcHMgd2l0aCBjb25kaXRpb25UeXBlIENPTkRJVElPTl9FTFNFXG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmFkZEVsc2UuZW1pdCh7IGNvbmRpdGlvblN0ZXBDb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVtb3ZlRWxzZShicmFuY2hJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHRoZSBFTFNFIElGIGJyYW5jaCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5maW5kSW5kZXgoYiA9PiBiLmlkID09PSBicmFuY2hJZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbHNlSWZCcmFuY2hlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYXJzZSBjb25kaXRpb24gc3RyaW5nIGludG8gbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IChlLmcuIFwiVXNlcnR5cGUgaXMgUHJlbWl1bVwiKSAqL1xuICBwcml2YXRlIHBhcnNlQ29uZGl0aW9uKGM6IHN0cmluZyk6IHsgbGVmdDogc3RyaW5nOyBvcGVyYXRvcjogc3RyaW5nOyByaWdodDogc3RyaW5nIH0ge1xuICAgIGlmICghYyB8fCB0eXBlb2YgYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGxlZnQ6ICdVc2VydHlwZScsIG9wZXJhdG9yOiAnaXMnLCByaWdodDogJ1ByZW1pdW0nIH07XG4gICAgfVxuICAgIGNvbnN0IHMgPSBjLnRyaW0oKTtcbiAgICBjb25zdCBvcGVyYXRvcnMgPSBbJyBpcyBub3QgJywgJyBpcyAnLCAnIGNvbnRhaW5zICcsICcgZXF1YWxzICcsICcgc3RhcnRzIHdpdGggJywgJyBlbmRzIHdpdGggJ107XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcGVyYXRvcnMpIHtcbiAgICAgIGNvbnN0IGkgPSBzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcCk7XG4gICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZWZ0OiBzLnNsaWNlKDAsIGkpLnRyaW0oKSxcbiAgICAgICAgICBvcGVyYXRvcjogb3AudHJpbSgpLFxuICAgICAgICAgIHJpZ2h0OiBzLnNsaWNlKGkgKyBvcC5sZW5ndGgpLnRyaW0oKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogcywgb3BlcmF0b3I6ICdpcycsIHJpZ2h0OiAnJyB9O1xuICB9XG5cbiAgLyoqIEJ1aWxkIGNvbmRpdGlvbiBzdHJpbmcgZnJvbSBmb3JtIHZhbHVlcyAqL1xuICBwcml2YXRlIGJ1aWxkQ29uZGl0aW9uRnJvbUZvcm0oKTogc3RyaW5nIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IG9wID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlID8/ICdpcyc7XG4gICAgY29uc3QgcmlnaHQgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUgPz8gJyc7XG4gICAgXG4gICAgLy8gSWYgbGVmdCBpcyBhbiBJRCAobnVtYmVyKSwgZmluZCB0aGUgbmF0dXJhbFRleHQgZnJvbSBvcHRpb25zXG4gICAgaWYgKGxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcobGVmdCk7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbnVtYmVyIChJRCkgb3IgaWYgd2UgbmVlZCB0byBmaW5kIHRoZSBuYXR1cmFsVGV4dFxuICAgICAgY29uc3QgaXNOdW1lcmljSWQgPSAhaXNOYU4oTnVtYmVyKGxlZnRWYWx1ZSkpICYmIGxlZnRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgXG4gICAgICBpZiAoaXNOdW1lcmljSWQpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgb3B0aW9uIGJ5IElEIGFuZCB1c2UgaXRzIG5hdHVyYWxUZXh0XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gbGVmdFZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbiAmJiBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGxlZnQgPSBTdHJpbmcoc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgYSBuYXR1cmFsVGV4dCBvciBuZWVkcyB0byBiZSBmb3VuZFxuICAgICAgICBjb25zdCBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLm5hdHVyYWxUZXh0ID09PSBsZWZ0IHx8IG9wdGlvbi5uYW1lID09PSBsZWZ0IHx8IG9wdGlvbi52YWx1ZSA9PT0gbGVmdFxuICAgICAgICApO1xuICAgICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24gJiYgc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBsZWZ0ID0gU3RyaW5nKHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gW2xlZnQsIG9wLCByaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGxTdGVwcyA9IHRoaXMuYnJhbmNoZXMucmVkdWNlPFRlc3RDYXNlU3RlcENvbmZpZ1tdPihcbiAgICAgIChhY2MsIGJyYW5jaCkgPT4gYWNjLmNvbmNhdChicmFuY2gubmVzdGVkU3RlcHMpLFxuICAgICAgW11cbiAgICApO1xuICAgIGlmIChhbGxTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnMCBzdGVwcyc7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0U3RlcCA9IGFsbFN0ZXBzWzBdO1xuICAgIGNvbnN0IGxhc3RTdGVwID0gYWxsU3RlcHNbYWxsU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgc3RhcnQgPSAoZmlyc3RTdGVwIGFzIGFueSkuc3RlcE51bWJlciB8fCAxO1xuICAgIGNvbnN0IGVuZCA9IChsYXN0U3RlcCBhcyBhbnkpLnN0ZXBOdW1iZXIgfHwgYWxsU3RlcHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ID0gYWxsU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiBgU3RlcHMgJHtzdGFydH0tJHtlbmR9ICgke2NvdW50fSBzdGVwJHtjb3VudCAhPT0gMSA/ICdzJyA6ICcnfSlgO1xuICB9XG5cbiAgLyoqIEV2ZW50IGtleS12YWx1ZSBwYWlycyBmb3IgZGlzcGxheSwgZXhjbHVkaW5nIGN1c3RvbUV2ZW50ICovXG4gIGdldEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jb25maWc/LmV2ZW50O1xuICAgIGlmICghZXZlbnQgfHwgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhldmVudClcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09ICdjdXN0b21FdmVudCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpIDogJydcbiAgICAgIH0pKTtcbiAgfVxuXG4gIG9uVG9nZ2xlRXhwYW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOnRoaXMuY29uZmlnLCBleHBhbmRlZDp0aGlzLmV4cGFuZGVkfSk7XG4gIH1cblxuICBvbkNvbmRpdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2g6IENvbmRpdGlvbkJyYW5jaCwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBzdGVwSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYnJhbmNoU3RlcENoYW5nZS5lbWl0KHsgYnJhbmNoLCBzdGVwLCBzdGVwSW5kZXggfSk7XG4gIH1cblxuICBvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBib29sZWFuIHwge2NvbmZpZzogVGVzdENhc2VTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0sIGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoLCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgYm90aCBib29sZWFuIGFuZCBvYmplY3QgZm9ybWF0c1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnICYmIGV2ZW50ICE9PSBudWxsICYmICdleHBhbmRlZCcgaW4gZXZlbnQpIHtcbiAgICAgIC8vIE9iamVjdCBmb3JtYXQgZnJvbSBzdGVwLWdyb3VwOiB7Y29uZmlnLCBleHBhbmRlZH1cbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudC5leHBhbmRlZDtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCdzIGNvbmZpZyBpcyBhIHN0ZXAtZ3JvdXAgKG5vdCB0aGUgY3VycmVudCBzdGVwKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5lc3RlZCBzdGVwLWdyb3VwIGV2ZW50cyBidWJibGUgdXAgY29ycmVjdGx5XG4gICAgICBpZiAodGhpcy5pc1N0ZXBHcm91cChldmVudC5jb25maWcpKSB7XG4gICAgICAgIC8vIFJlLWVtaXQgdGhlIHRvZ2dsZUV4cGFuZGVkIGV2ZW50IHdpdGggdGhlIG9iamVjdCBmb3JtYXQsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICAvLyBDYXN0IHRvIHNhdGlzZnkgVHlwZVNjcmlwdCAtIHRoZSByZW5kZXJlciBhY2NlcHRzIFRlc3RDYXNlU3RlcENvbmZpZyB3aGljaCBpbmNsdWRlcyBTdGVwR3JvdXBDb25maWdcbiAgICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6IGV2ZW50LmNvbmZpZyBhcyBhbnkgYXMgQ29uZGl0aW9uU3RlcENvbmZpZywgZXhwYW5kZWQ6IGV2ZW50LmV4cGFuZGVkfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvb2xlYW4gZm9ybWF0IGZyb20gb3RoZXIgc3RlcCB0eXBlc1xuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50IGFzIGJvb2xlYW47XG4gICAgfVxuICAgIHRoaXMub25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoeyBicmFuY2ggfSk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gsIHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoeyBicmFuY2gsIHN0ZXBJbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBpbiBhIGJyYW5jaCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgaW4gYSBicmFuY2ggc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgdGhpcy5hZGRCcmFuY2guZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZUJyYW5jaC5lbWl0KGJyYW5jaCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBnZXRCcmFuY2hMYWJlbChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJyYW5jaC5sYWJlbCB8fCAoYnJhbmNoLnR5cGUgPT09ICdpZicgPyAnSUYgVFJVRScgOiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnID8gJ0VMU0UgSUYnIDogJ0VMU0UnKTtcbiAgfVxuXG4gIGdldEJyYW5jaENvbG9yQ2xhc3MoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiBzdHJpbmcge1xuICAgIGlmIChicmFuY2gudHlwZSA9PT0gJ2lmJykge1xuICAgICAgcmV0dXJuICdjcWEtYmctWyMwREJEN0QxQV0nO1xuICAgIH0gZWxzZSBpZiAoYnJhbmNoLnR5cGUgPT09ICdlbHNlLWlmJykge1xuICAgICAgcmV0dXJuICdjcWEtYmcteWVsbG93LTUwIGNxYS1ib3JkZXIteWVsbG93LTIwMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY3FhLWJnLXJlZC01MCBjcWEtYm9yZGVyLXJlZC0yMDAnO1xuICAgIH1cbiAgfVxuXG4gIGdldEJyYW5jaFRleHRDb2xvcihicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgaWYgKGJyYW5jaC50eXBlID09PSAnaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjMEQ1NDJCXSc7XG4gICAgfSBlbHNlIGlmIChicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS10ZXh0LXllbGxvdy03MDAnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NxYS10ZXh0LXJlZC03MDAnO1xuICAgIH1cbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGNvbmRpdGlvbiBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSxcbiAgICAgIGNvbmRpdGlvbk9wZXJhdG9yOiB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlLFxuICAgICAgY29uZGl0aW9uUmlnaHQ6IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUsXG4gICAgfTtcbiAgICBcbiAgICAvLyBJZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQsIGZpbmQgdGhlIG1hdGNoaW5nIG5hdHVyYWwgdGV4dCBhY3Rpb25cbiAgICBsZXQgY29uZGl0aW9uTGVmdFZhbHVlID0gJyc7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmIChjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdBY3Rpb24pIHtcbiAgICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUElcbiAgICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbWF0Y2hpbmdBY3Rpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdBY3Rpb24ubmFtZSA/PyBtYXRjaGluZ0FjdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgbm8gbmF0dXJhbFRleHRBY3Rpb25JZCBtYXRjaCBmb3VuZCwgcGFyc2UgZnJvbSBjb25kaXRpb24gc3RyaW5nXG4gICAgaWYgKCFjb25kaXRpb25MZWZ0VmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBsZWZ0O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB7IG9wZXJhdG9yLCByaWdodCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKGNvbmRpdGlvbkxlZnRWYWx1ZSk7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy5zZXRWYWx1ZShvcGVyYXRvcik7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy5zZXRWYWx1ZShyaWdodCk7XG4gICAgXG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIC8vIERvIG5vdCBwcmUtcG9wdWxhdGUgRUxTRSBJRiBicmFuY2hlcyBpbiBlZGl0IG1vZGU7IHRoZXkgYXJlIHNob3duIG9ubHkgd2hlbiB1c2VyIGNsaWNrcyBcIkFkZCBFTFNFIElGXCJcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzID0gW107XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbkxlZnQgPz8gJycpO1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8uc2V0VmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uT3BlcmF0b3IgPz8gJ2lzJyk7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy5zZXRWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25SaWdodCA/PyAnJyk7XG4gICAgXG4gICAgLy8gUmVzZXQgYWxsIEVMU0UgSUYgYnJhbmNoZXMgdG8gdGhlaXIgc25hcHNob3RzXG4gICAgdGhpcy5lbHNlSWZCcmFuY2hlcy5mb3JFYWNoKGJyYW5jaCA9PiB7XG4gICAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25MZWZ0ID8/ICcnKTtcbiAgICAgIGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25PcGVyYXRvciA/PyAnaXMnKTtcbiAgICAgIGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25SaWdodCA/PyAnJyk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgYWxsIEVMU0UgSUYgYnJhbmNoZXNcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzID0gW107XG4gICAgXG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBwYXlsb2FkIGZvciBvbmUgRUxTRSBJRiBicmFuY2ggKGFjdGlvbiwgbmF0dXJhbFRleHRBY3Rpb25JZCwgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLCB0ZXN0RGF0YUxpc3QpXG4gICAqIHNvIHRoZSBwYXJlbnQgY2FuIGNyZWF0ZSB0aGUgc3RlcCB2aWEgUE9TVCB0aGVuIFBVVCB3aGVuIEFwcGx5IGlzIGNsaWNrZWQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRWxzZUlmQnJhbmNoUGF5bG9hZChicmFuY2g6IHtcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgfSk6IHsgYWN0aW9uOiBzdHJpbmc7IG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXI7IHRlbXBsYXRlVmFyaWFibGVzRGF0YT86IGFueTsgdGVzdERhdGFMaXN0PzogQXJyYXk8eyB0ZXN0RGF0YTogc3RyaW5nOyB0ZXN0RGF0YVR5cGU6IHN0cmluZyB9PiB9IHtcbiAgICBjb25zdCBjb25kaXRpb25MZWZ0ID0gYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjb25kaXRpb25PcGVyYXRvciA9IGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlID8/ICdpcyc7XG4gICAgY29uc3QgY29uZGl0aW9uUmlnaHQgPSBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy52YWx1ZSA/PyAnJztcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuYXR1cmFsVGV4dFZhbHVlOiBzdHJpbmcgPSBjb25kaXRpb25MZWZ0O1xuICAgIGlmIChjb25kaXRpb25MZWZ0ICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gU3RyaW5nKGNvbmRpdGlvbkxlZnQpO1xuICAgICAgY29uc3QgaXNOdW1lcmljSWQgPSAhaXNOYU4oTnVtYmVyKGxlZnRWYWx1ZSkpICYmIGxlZnRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRBY3Rpb246IGFueSA9IGlzTnVtZXJpY0lkXG4gICAgICAgID8gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiBTdHJpbmcob3B0LmlkKSA9PT0gbGVmdFZhbHVlKVxuICAgICAgICA6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgICAgKG9wdDogYW55KSA9PiBvcHQubmF0dXJhbFRleHQgPT09IGNvbmRpdGlvbkxlZnQgfHwgb3B0Lm5hbWUgPT09IGNvbmRpdGlvbkxlZnQgfHwgb3B0LnZhbHVlID09PSBjb25kaXRpb25MZWZ0XG4gICAgICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZEFjdGlvbikge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gc2VsZWN0ZWRBY3Rpb24uaWQ7XG4gICAgICAgIG5hdHVyYWxUZXh0VmFsdWUgPSBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCB8fCBzZWxlY3RlZEFjdGlvbi5uYW1lIHx8IHNlbGVjdGVkQWN0aW9uLnZhbHVlIHx8IGNvbmRpdGlvbkxlZnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzRGF0YTogYW55ID0ge307XG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+ID0gW107XG4gICAgaWYgKGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgdGVzdERhdGFMaXN0LnB1c2goeyB0ZXN0RGF0YTogU3RyaW5nKHZhbHVlKSwgdGVzdERhdGFUeXBlOiAncmF3JyB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbiA9IFtuYXR1cmFsVGV4dFZhbHVlLCBjb25kaXRpb25PcGVyYXRvciwgY29uZGl0aW9uUmlnaHRdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogYWN0aW9uIHx8IChicmFuY2guc2VsZWN0ZWRUZW1wbGF0ZT8ubmF0dXJhbFRleHQgPz8gJycpLFxuICAgICAgLi4uKG5hdHVyYWxUZXh0QWN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiB7IG5hdHVyYWxUZXh0QWN0aW9uSWQgfSksXG4gICAgICAuLi4oT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhKS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0pLFxuICAgICAgLi4uKHRlc3REYXRhTGlzdC5sZW5ndGggPiAwICYmIHsgdGVzdERhdGFMaXN0IH0pLFxuICAgIH07XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWVzID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCBjb25kaXRpb25MZWZ0ID0gZm9ybVZhbHVlcy5jb25kaXRpb25MZWZ0ID8/ICcnO1xuICAgIGNvbnN0IGNvbmRpdGlvbk9wZXJhdG9yID0gZm9ybVZhbHVlcy5jb25kaXRpb25PcGVyYXRvciA/PyAnaXMnO1xuICAgIGNvbnN0IGNvbmRpdGlvblJpZ2h0ID0gZm9ybVZhbHVlcy5jb25kaXRpb25SaWdodCA/PyAnJztcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBuYXR1cmFsIHRleHQgYWN0aW9uIGFuZCBnZXQgbmF0dXJhbFRleHQgKG5vdCBJRClcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuYXR1cmFsVGV4dFZhbHVlOiBzdHJpbmcgPSBjb25kaXRpb25MZWZ0OyAvLyBEZWZhdWx0IHRvIGNvbmRpdGlvbkxlZnRcbiAgICBcbiAgICBpZiAoY29uZGl0aW9uTGVmdCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IFN0cmluZyhjb25kaXRpb25MZWZ0KTtcbiAgICAgIGNvbnN0IGlzTnVtZXJpY0lkID0gIWlzTmFOKE51bWJlcihsZWZ0VmFsdWUpKSAmJiBsZWZ0VmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgIFxuICAgICAgbGV0IHNlbGVjdGVkQWN0aW9uOiBhbnk7XG4gICAgICBpZiAoaXNOdW1lcmljSWQpIHtcbiAgICAgICAgLy8gRmluZCBieSBJRCBhbmQgZ2V0IG5hdHVyYWxUZXh0XG4gICAgICAgIHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gbGVmdFZhbHVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaW5kIGJ5IG5hdHVyYWxUZXh0LCBuYW1lLCBvciB2YWx1ZVxuICAgICAgICBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLm5hdHVyYWxUZXh0ID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdGlvbi5uYW1lID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdGlvbi52YWx1ZSA9PT0gY29uZGl0aW9uTGVmdFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24pIHtcbiAgICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZCA9IHNlbGVjdGVkQWN0aW9uLmlkO1xuICAgICAgICAvLyBVc2UgbmF0dXJhbFRleHQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIG5hbWUgb3IgdmFsdWVcbiAgICAgICAgbmF0dXJhbFRleHRWYWx1ZSA9IHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0IHx8IHNlbGVjdGVkQWN0aW9uLm5hbWUgfHwgc2VsZWN0ZWRBY3Rpb24udmFsdWUgfHwgY29uZGl0aW9uTGVmdDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ29sbGVjdCB0ZW1wbGF0ZSB2YXJpYWJsZXMgdmFsdWVzIGZvciBldmVudCBvYmplY3RcbiAgICBjb25zdCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueSA9IHt9O1xuICAgIC8vIEJ1aWxkIHRlc3REYXRhTGlzdCBhcnJheSBpbiB0aGUgb3JkZXIgb2YgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+ID0gW107XG4gICAgXG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAvLyBBZGQgdG8gZXZlbnQgb2JqZWN0IChlLmcuLCBzb3VyY2VfdmFsdWUsIHRhcmdldF92YWx1ZSlcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAvLyBBZGQgdG8gdGVzdERhdGFMaXN0IGFycmF5IChvcmRlciBtYXR0ZXJzIC0gbWFpbnRhaW4gdGVtcGxhdGUgdmFyaWFibGUgb3JkZXIpXG4gICAgICAgICAgdGVzdERhdGFMaXN0LnB1c2goe1xuICAgICAgICAgICAgdGVzdERhdGE6IFN0cmluZyh2YWx1ZSksXG4gICAgICAgICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBCdWlsZCBjb25kaXRpb24gc3RyaW5nIHVzaW5nIG5hdHVyYWxUZXh0IChub3QgSUQpXG4gICAgdGhpcy5jb25kaXRpb24gPSBbbmF0dXJhbFRleHRWYWx1ZSwgY29uZGl0aW9uT3BlcmF0b3IsIGNvbmRpdGlvblJpZ2h0XS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIFxuICAgIC8vIEJ1aWxkIHBheWxvYWQgZm9yIGVhY2ggbmV3bHkgYWRkZWQgRUxTRSBJRiAoc28gcGFyZW50IGNhbiBjYWxsIFBPU1QgdGhlbiBQVVQgd2hlbiBBcHBseSBpcyBjbGlja2VkKVxuICAgIGNvbnN0IG5ld0Vsc2VJZkJyYW5jaGVzID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5tYXAoYiA9PiB0aGlzLmJ1aWxkRWxzZUlmQnJhbmNoUGF5bG9hZChiKSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIG5ldyB2YWx1ZXNcbiAgICBjb25zdCB1cGRhdGVkQ29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnICYgeyBcbiAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXI7IFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55O1xuICAgICAgdGVzdERhdGFMaXN0PzogQXJyYXk8eyB0ZXN0RGF0YTogc3RyaW5nOyB0ZXN0RGF0YVR5cGU6IHN0cmluZyB9PjtcbiAgICAgIG5ld0Vsc2VJZkJyYW5jaGVzPzogQXJyYXk8eyBhY3Rpb246IHN0cmluZzsgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyB0ZXN0RGF0YUxpc3Q/OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+IH0+O1xuICAgIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sIC8vIENvbmRpdGlvbiBub3cgdXNlcyBuYXR1cmFsVGV4dFxuICAgICAgc3RlcFR5cGU6IHRoaXMuY29uZmlnLnN0ZXBUeXBlIHx8IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsIC8vIEVuc3VyZSBzdGVwVHlwZSBpcyBzZXRcbiAgICAgIC4uLihuYXR1cmFsVGV4dEFjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgeyBuYXR1cmFsVGV4dEFjdGlvbklkIH0gYXMgYW55KSxcbiAgICAgIC4uLihPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSBhcyBhbnkpLFxuICAgICAgLi4uKHRlc3REYXRhTGlzdC5sZW5ndGggPiAwICYmIHsgdGVzdERhdGFMaXN0IH0gYXMgYW55KSxcbiAgICAgIC4uLihuZXdFbHNlSWZCcmFuY2hlcy5sZW5ndGggPiAwICYmIHsgbmV3RWxzZUlmQnJhbmNoZXMgfSBhcyBhbnkpLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudFxuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodGhpcy5jb25kaXRpb24pO1xuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZyAoaW5jbHVkZXMgbmV3RWxzZUlmQnJhbmNoZXMgc28gcGFyZW50IGNhbiBjcmVhdGUgc3RlcHMgb24gQXBwbHkpXG4gICAgY29uc29sZS5sb2coJ0NvbmRpdGlvbi1zdGVwOiBFbWl0dGluZyBzdGVwVXBkYXRlIGV2ZW50JywgdXBkYXRlZENvbmZpZyk7XG4gICAgdGhpcy5zdGVwVXBkYXRlLmVtaXQodXBkYXRlZENvbmZpZyk7XG4gICAgXG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdEluRGVwdGgoKTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgY29uc3QgaW5kZXggPSB0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnbnVtYmVyJyA/IHRoaXMuc3RlcE51bWJlciA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHRoaXMuc3RlcE51bWJlciwgMTApIDogMCk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KHsgc3RlcDogdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogaXNOYU4oaW5kZXgpID8gMCA6IGluZGV4IH0pO1xuICB9XG5cbiAgb25MaW5rKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGNvbmRpdGlvbiBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlOiAnSUYgLyBFTFNFIFN0ZXAgRGV0YWlscycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqIEdldCBzZWxlY3QgY29uZmlnIGZvciBhIHRlbXBsYXRlIHZhcmlhYmxlICovXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlOiBhbnksIGJyYW5jaElkT3JJc0Vsc2U6IHN0cmluZyB8IGJvb2xlYW4gPSBmYWxzZSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIC8vIElmIGJyYW5jaElkT3JJc0Vsc2UgaXMgYSBzdHJpbmcsIGl0J3MgYSBicmFuY2ggSUQ7IG90aGVyd2lzZSBpdCdzIGEgYm9vbGVhbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGxldCBmb3JtOiBGb3JtR3JvdXA7XG4gICAgaWYgKHR5cGVvZiBicmFuY2hJZE9ySXNFbHNlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgYnJhbmNoID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5maW5kKGIgPT4gYi5pZCA9PT0gYnJhbmNoSWRPcklzRWxzZSk7XG4gICAgICBmb3JtID0gYnJhbmNoPy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gfHwgdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm0gPSBicmFuY2hJZE9ySXNFbHNlID8gKHRoaXMuZWxzZUlmQnJhbmNoZXNbMF0/LnRlbXBsYXRlVmFyaWFibGVzRm9ybSB8fCB0aGlzLmZiLmdyb3VwKHt9KSkgOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChmb3JtICYmIGZvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgICAgZm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIidjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdICcgKyAoaXNOZXN0ZWQgPyAnIGNxYS1wbC1bMjRweF0nIDogJycpXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9hdXRvY29tcGxldGUgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDwhLS0gRmlyc3QgUm93OiBDT05ESVRJT04gdGFnLCBhdXRvY29tcGxldGUsIElGL0VMU0UgaW5kaWNhdG9ycywgRWRpdCBJbiBkZXB0aCwgQ2FuY2VsL0FwcGx5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgICA8IS0tIENPTkRJVElPTiBUYWcgKG9yYW5nZSkgLS0+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bI0VBNTgwQ10gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkZFREQ1XVwiPlxuICAgICAgICAgIENPTkRJVElPTlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBGaXJzdCBmaWVsZDogbGVmdCBvcGVyYW5kIChlLmcuIFVzZXJ0eXBlKSAtIGF1dG9jb21wbGV0ZSB3aXRoIElGX0NPTkRJVElPTiBuYXR1cmFsIHRleHQgYWN0aW9ucyAtLT5cbiAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJjb25kaXRpb25MZWZ0QXV0b2NvbXBsZXRlT3B0aW9uc1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnY29uZGl0aW9uTGVmdCcsICRldmVudClcIlxuICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25MZWZ0U2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbmRpdGlvblwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgPCEtLSBTZWNvbmQgUm93OiBUZW1wbGF0ZSBWYXJpYWJsZXMgU2VjdGlvbiAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCwgaW5saW5lIGJlZm9yZSBFZGl0IEluIGRlcHRoKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGUgJiYgdGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXNcIj5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBOb24tYm9vbGVhbiB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhcmlhYmxlLm5hbWUgIT09ICdjdXN0b21fY29kZSdcIj5cbiAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBmb3Igc2VsZWN0IHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGUsIGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgZm9yIG90aGVyIHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICd0eXBlJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2Nyb2xsVG8nICYmICF2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyICcgKyB2YXJpYWJsZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSUYgLyBFTFNFIGluZGljYXRvcnMgLS0+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNEQ0ZDRTddIGNxYS10ZXh0LVsjMDA4MjM2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0I5RjhDRl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02LjY2NjM0IDJMMi45OTk2NyA1LjY2NjY3TDEuMzMzMDEgNFwiIHN0cm9rZT1cIiMwMDgyMzZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgSUZcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8IS0tIEFkZCBFTFNFIElGIGJ1dHRvbiAtIGFsd2F5cyB2aXNpYmxlIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRWxzZSgpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiPlxuICAgICAgICAgIEFkZCBFTFNFIElGXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIEFkZCBFbHNlIGJ1dHRvbiAtIGNhbGxzIEFQSSB0byBjcmVhdGUgQ09ORElUSU9OX0VMU0Ugc3RlcCAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZEVsc2VCcmFuY2goKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICBBZGQgRUxTRVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8IS0tIEVkaXQgSW4gZGVwdGggbGluayAtLT5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgICBFZGl0IEluIGRlcHRoXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+XG4gICAgICAgIDwvYT4gICAgICBcbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSBidXR0b25zIC0gc2hvd24gb24gSUYgcm93IHdoZW4gbm8gRUxTRSBJRiBicmFuY2hlcyBhcmUgcHJlc2VudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJlbHNlSWZCcmFuY2hlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgXG4gIDwvZGl2PlxuXG4gIDwhLS0gRUxTRSBJRiBTZWN0aW9ucyBpbiBFZGl0IE1vZGUgLSBMb29wIHRocm91Z2ggYWxsIEVMU0UgSUYgYnJhbmNoZXMgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5jaCBvZiBlbHNlSWZCcmFuY2hlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiPlxuICAgICAgPCEtLSBGaXJzdCBSb3c6IFJlbW92ZSBFTFNFIElGIGJ1dHRvbiwgYXV0b2NvbXBsZXRlLCBFZGl0IEluIGRlcHRoLCBDYW5jZWwvQXBwbHkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgICAgIDwhLS0gUmVtb3ZlIEVMU0UgSUYgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlRWxzZShicmFuY2guaWQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjOTlBMUFGXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1bI0U1RTdFQl0gY3FhLXRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICBSZW1vdmUgRUxTRSBJRlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBFTFNFIElGIGF1dG9jb21wbGV0ZSBmaWVsZDogc2FtZSBhcyBJRiBjb25kaXRpb24gLS0+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiYnJhbmNoLmZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImJyYW5jaC5mb3JtLmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiYnJhbmNoLmZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkVsc2VDb25kaXRpb25MZWZ0U2VsZWN0KCRldmVudCwgYnJhbmNoLmlkKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFNlY29uZCBSb3c6IEVMU0UgSUYgVGVtcGxhdGUgVmFyaWFibGVzIFNlY3Rpb24gKHNob3duIHdoZW4gdGVtcGxhdGUgaXMgc2VsZWN0ZWQsIGlubGluZSBiZWZvcmUgRWRpdCBJbiBkZXB0aCkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcyAmJiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNcIj5cbiAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8IS0tIE5vbi1ib29sZWFuIHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBmb3Igc2VsZWN0IHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSA9PT0gJ3R5cGUnIHx8IHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycgfHwgdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWdGb3JWYXJpYWJsZSh2YXJpYWJsZSwgYnJhbmNoLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gVGV4dCBJbnB1dCBmb3Igb3RoZXIgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAndHlwZScgJiYgdmFyaWFibGUubmFtZSAhPT0gJ3Njcm9sbFRvJyAmJiAhdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidmFyaWFibGUubGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEVkaXQgSW4gZGVwdGggbGluayAtLT5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgICAgICBFZGl0IEluIGRlcHRoXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IGJ1dHRvbnMgLSBzaG93biBpbiBsYXN0IEVMU0UgSUYgcm93IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA9PT0gZWxzZUlmQnJhbmNoZXMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIENvbmRpdGlvbiBIZWFkZXIgKG5vcm1hbCB2aWV3IHdoZW4gbm90IGVkaXRpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdGluZ1wiIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgPyAnY3FhLXBsLTEwIGNxYS1wci00JyA6ICdjcWEtcHgtNCcpXCI+XG4gICAgPCEtLSBEcmFnIEhhbmRsZSBJY29uICh3aGVuIGlzUmVvcmRlciBpcyB0cnVlKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSkgLS0+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1jb25kaXRpb25cIiAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRleHQtd2hpdGUgY3FhLXRvcC0xLzIgY3FhLWxlZnQtMS8yIGNxYS0tdHJhbnNsYXRlLXgtMS8yIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTBdPVwiIXNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTEwMF09XCJzZWxlY3RlZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTIgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwIDMuMTI1TDQuNSA4LjYyNUwyIDYuMTI1XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF1cIj57eyBzdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIEljb24gLS0+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiIGNsYXNzPVwiY3FhLXAtMFwiPlxuICAgICAgPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgMTBMOCA2TDQgMTBcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBJRi9FTFNFIEljb24gLS0+XG4gICAgPGRpdj48c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk00IDJWMTBcIiBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xMiA2QzEzLjEwNDYgNiAxNCA1LjEwNDU3IDE0IDRDMTQgMi44OTU0MyAxMy4xMDQ2IDIgMTIgMkMxMC44OTU0IDIgMTAgMi44OTU0MyAxMCA0QzEwIDUuMTA0NTcgMTAuODk1NCA2IDEyIDZaXCJcbiAgICAgICAgICBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk00IDE0QzUuMTA0NTcgMTQgNiAxMy4xMDQ2IDYgMTJDNiAxMC44OTU0IDUuMTA0NTcgMTAgNCAxMEMyLjg5NTQzIDEwIDIgMTAuODk1NCAyIDEyQzIgMTMuMTA0NiAyLjg5NTQzIDE0IDQgMTRaXCJcbiAgICAgICAgICBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgNkMxMiA3LjU5MTMgMTEuMzY3OSA5LjExNzQyIDEwLjI0MjYgMTAuMjQyNkM5LjExNzQyIDExLjM2NzkgNy41OTEzIDEyIDYgMTJcIiBzdHJva2U9XCIjN0IzMzA2XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPjwvZGl2PlxuXG4gICAgPCEtLSBJRi9FTFNFIExhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM3QjMzMDZdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1ub25lXCI+XG4gICAgICBJRiAvIEVMU0VcbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIENvbmRpdGlvbiBJbnB1dCBhbmQgZXZlbnQga2V5LXZhbHVlIGRldGFpbHMgKGV4Y2x1ZGUgY3VzdG9tRXZlbnQpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiY29uZGl0aW9uXCI+PC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKS5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF1cIj57eyBpdGVtLmtleSB9fTo8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj57eyBpdGVtLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XVwiPlxuICAgICAgICBJZlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+LnN1Y2Nlc3MtbWVzc2FnZTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF1cIj5cbiAgICAgICAgaXMgdmlzaWJsZVxuICAgICAgPC9zcGFuPiAtLT5cbiAgICAgIDwhLS0gPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvblwiXG4gICAgICAgIChpbnB1dCk9XCJvbkNvbmRpdGlvbkNoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZWxlbWVudCBgLnN1Y2Nlc3MtbWVzc2FnZWAgaXMgdmlzaWJsZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDAgY3FhLWJnLXdoaXRlIGNxYS10ZXh0LWdyYXktOTAwIGNxYS10ZXh0LXNtIGNxYS1mbGV4LTEgY3FhLW1heC13LW1kIGNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLXJpbmctMiBmb2N1czpjcWEtcmluZy1wcmltYXJ5IGZvY3VzOmNxYS1yaW5nLW9wYWNpdHktNTBcIlxuICAgICAgLz4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBiZWZvcmUgYWN0aW9uIGljb25zLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXI7IGhpZGRlbiB3aGVuIGluc2lkZSBzdGVwLWdyb3VwKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF1cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNyAxMS42NjY2SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTkuNTUyMDggMi4xMTI4QzkuNzg0MyAxLjg4MDU4IDEwLjA5OTMgMS43NTAxMiAxMC40Mjc3IDEuNzUwMTJDMTAuNzU2MSAxLjc1MDEyIDExLjA3MSAxLjg4MDU4IDExLjMwMzMgMi4xMTI4QzExLjUzNTUgMi4zNDUwMiAxMS42NjU5IDIuNjU5OTggMTEuNjY1OSAyLjk4ODM4QzExLjY2NTkgMy4zMTY3OSAxMS41MzU1IDMuNjMxNzUgMTEuMzAzMyAzLjg2Mzk3TDQuMjk3NDIgMTAuODcwNEM0LjE1ODY0IDExLjAwOTIgMy45ODcxIDExLjExMDcgMy43OTg2NyAxMS4xNjU2TDIuMTIzMzMgMTEuNjU0NEMyLjA3MzE0IDExLjY2OSAyLjAxOTkzIDExLjY2OTkgMS45NjkyOCAxMS42NTY5QzEuOTE4NjMgMTEuNjQzOSAxLjg3MjQgMTEuNjE3NiAxLjgzNTQzIDExLjU4MDZDMS43OTg0NiAxMS41NDM3IDEuNzcyMSAxMS40OTc0IDEuNzU5MTMgMTEuNDQ2OEMxLjc0NjE1IDExLjM5NjEgMS43NDcwMyAxMS4zNDI5IDEuNzYxNjcgMTEuMjkyN0wyLjI1MDUgOS42MTczOEMyLjMwNTQ2IDkuNDI5MTYgMi40MDY5OCA5LjI1NzgzIDIuNTQ1NjcgOS4xMTkyMkw5LjU1MjA4IDIuMTEyOFpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC4zMzM5OCA3SDkuNjY3MzJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTExLjY2NiA0LjY2NjYzSDUuODMyNjhDNS4xODgzNSA0LjY2NjYzIDQuNjY2MDIgNS4xODg5NiA0LjY2NjAyIDUuODMzMjlWMTEuNjY2NkM0LjY2NjAyIDEyLjMxMSA1LjE4ODM1IDEyLjgzMzMgNS44MzI2OCAxMi44MzMzSDExLjY2NkMxMi4zMTAzIDEyLjgzMzMgMTIuODMyNyAxMi4zMTEgMTIuODMyNyAxMS42NjY2VjUuODMzMjlDMTIuODMyNyA1LjE4ODk2IDEyLjMxMDMgNC42NjY2MyAxMS42NjYgNC42NjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMi4zMzI2OCA5LjMzMzI5QzEuNjkxMDIgOS4zMzMyOSAxLjE2NjAyIDguODA4MjkgMS4xNjYwMiA4LjE2NjYzVjIuMzMzMjlDMS4xNjYwMiAxLjY5MTYzIDEuNjkxMDIgMS4xNjY2MyAyLjMzMjY4IDEuMTY2NjNIOC4xNjYwMkM4LjgwNzY4IDEuMTY2NjMgOS4zMzI2OCAxLjY5MTYzIDkuMzMyNjggMi4zMzMyOVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEuNzUgMy41SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTExLjA4MjcgMy41VjExLjY2NjdDMTEuMDgyNyAxMi4yNSAxMC40OTkzIDEyLjgzMzMgOS45MTYwMiAxMi44MzMzSDQuMDgyNjhDMy40OTkzNSAxMi44MzMzIDIuOTE2MDIgMTIuMjUgMi45MTYwMiAxMS42NjY3VjMuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjY2NjAyIDMuNDk5OTZWMi4zMzMyOUM0LjY2NjAyIDEuNzQ5OTYgNS4yNDkzNSAxLjE2NjYzIDUuODMyNjggMS4xNjY2M0g4LjE2NjAyQzguNzQ5MzUgMS4xNjY2MyA5LjMzMjY4IDEuNzQ5OTYgOS4zMzI2OCAyLjMzMzI5VjMuNDk5OTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNS44MzM5OCA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNOC4xNjYwMiA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBCcmFuY2hlcyAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8IS0tIEJyYW5jaGVzIChJRiBUUlVFLCBFTFNFIElGLCBFTFNFKSAtLT5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgYnJhbmNoZXM7IGxldCBicmFuY2hJbmRleCA9IGluZGV4XCIgY2xhc3M9XCJjb25kaXRpb24tYnJhbmNoLXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDwhLS0gQnJhbmNoIEhlYWRlciAoMiA9IEVMU0UgSUYsIDMgPSBFTFNFOyBzdWIgc3RlcHMgc2hvdyAxLjEsIDIuMSwgMy4xIGZyb20gc3RlcCBjb25maWcpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbY2xhc3NdPVwiJ2NxYS1weC00IGNxYS1weS0yIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgJyArIGdldEJyYW5jaFRleHRDb2xvcihicmFuY2gpICsgJyAnICsgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2gpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLW1pbi13LVszMnB4XSBjcWEtZmxleC1zaHJpbmstMFwiPnt7IGJyYW5jaEluZGV4ICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJicmFuY2guYWN0aW9uXCIgW2lubmVySFRNTF09XCJicmFuY2guYWN0aW9uXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCcmFuY2ggQ29udGVudCAoTmVzdGVkIFN0ZXBzIOKAkyByZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXAsICRldmVudC5zdGVwSW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcEZvckJyYW5jaCk9XCJvbkFkZFN0ZXAoJGV2ZW50LmJyYW5jaClcIlxuICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGxpbmspPVwib25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChzdGVwVXBkYXRlKT1cInN0ZXBVcGRhdGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50LCBicmFuY2gpXCI+XG4gICAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXJcbiAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2JyYW5jaF09XCJicmFuY2hcIlxuICAgICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZSgkZXZlbnQuYnJhbmNoLCAkZXZlbnQuc3RlcCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKGFkZFN0ZXBGb3JCcmFuY2gpPVwib25BZGRTdGVwKCRldmVudC5icmFuY2gpXCJcbiAgICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobGluayk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIlxuICAgICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCkpOyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHN0ZXBVcGRhdGUpPVwic3RlcFVwZGF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1wdHkgYnJhbmNoIChJRiAvIEVMU0UgSUYgLyBFTFNFKTogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBubyBzdGVwcywgc2FtZSBhcyBsb29wIHN0ZXAgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYnJhbmNoLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY29uZGl0aW9uLWJyYW5jaC1lbXB0eSBjcWEtbWluLWgtWzUycHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wbC00IGNxYS1wci00XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkFkZFN0ZXAoYnJhbmNoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2F0dHIudGl0bGVdPVwiJ0FkZCBzdGVwIHRvICcgKyBnZXRCcmFuY2hMYWJlbChicmFuY2gpXCJcbiAgICAgICAgICBjbGFzcz1cImNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgSUYgTWFya2VyIC0tPlxuICAgIDxkaXYgW2NsYXNzXT1cIidjcWEtcGwtNCBjcWEtcHktMSBjcWEtdGV4dC1bIzdCMzMwNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0nXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgIEVORCBJRlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|