@cqa-lib/cqa-ui 1.1.358 → 1.1.360

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.
@@ -120,11 +120,19 @@ export class TestCaseConditionStepComponent {
120
120
  }
121
121
  /** Emit clickAction when user clicks on condition/branch action badges (element, test_data, etc.) so parent can open edit modals */
122
122
  onConditionActionClick(event, branch) {
123
+ if (this.isInsideStepGroup)
124
+ return;
123
125
  const step = branch?.id != null
124
126
  ? { ...this.config, id: String(branch.id) }
125
127
  : this.config;
126
128
  this.clickAction.emit({ event, step });
127
129
  }
130
+ /** Forward clickAction from nested steps only when not inside a step-group (Element/Test Data modals disabled there). */
131
+ onNestedClickAction(payload) {
132
+ if (!this.isInsideStepGroup) {
133
+ this.clickAction.emit(payload);
134
+ }
135
+ }
128
136
  ngOnInit() {
129
137
  if (this.config) {
130
138
  this.id = this.config.id;
@@ -1161,13 +1169,13 @@ export class TestCaseConditionStepComponent {
1161
1169
  }
1162
1170
  }
1163
1171
  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 });
1164
- 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", index: "index", condition: "condition", branches: "branches", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", editable: "editable", 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", addStepForLoop: "addStepForLoop", 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", openExternal: "openExternal" }, 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: shown in first branch row below when user clicks Edit from branch row (top block hidden) -->\n <div *ngIf=\"false && 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]=\"conditionLeftDisplayValue\"\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 - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\n Add ELSE IF\n </button>\n <!-- Add Else button - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\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 <!-- Step row: always visible (no template edit here; template edit only in branch row below). Has edit/delete. -->\n <div [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-4 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : '')\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Checkbox/Drag Handle column - same structure as normal-step for alignment -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder && !isInsideStepGroup\" 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 and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" 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 CONDITION\n </span>\n\n <!-- Step row: read-only (condition, summary, actions) when not editing step row -->\n <ng-container *ngIf=\"editContext !== 'stepRow'\">\n <!-- First condition text as plain text (no HTML) -->\n <div *ngIf=\"getConditionPlainText()\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-px-1 cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-truncate\">{{ getConditionPlainText() }}</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto cqa-flex-wrap cqa-px-1\">\n <!-- Branch type badges: IF, ELSE IF (with count), ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-flex-shrink-0\">\n <span *ngFor=\"let badge of getBranchTypeBadges()\"\n [class]=\"'cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-[10px] cqa-leading-[15px] cqa-font-medium ' + badge.badgeClass\">\n {{ badge.label }}\n <ng-container *ngIf=\"badge.count\">+{{ badge.count }}</ng-container>\n </span>\n </div>\n <div\n class=\"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 <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\">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 <!-- Copy button hidden for now -->\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </ng-container>\n\n <!-- Step row: edit mode (CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Cancel, Apply) when editContext === 'stepRow' -->\n <ng-container *ngIf=\"editContext === 'stepRow'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-min-w-0\">\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 </ng-container>\n </div>\n\n <!-- ELSE IF Sections in Edit Mode - shown below step row when editing and has 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-1 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 [compact]=\"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 <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 <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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 <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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(undefined, getBranchById(branch.id), getBranchIndexById(branch.id)); $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 <!-- Expanded Content with Branches (shown when expanded or when editing so edit UI appears in first branch row) -->\n <div *ngIf=\"expanded || isEditing\" 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\" [attr.data-branch-id]=\"branch?.id\">\n <!-- Edit mode (IF TRUE branch): shows CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Edit/Delete, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === 0 && editingBranchIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, 0); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Edit mode (ELSE IF branch): shows CONDITION, autocomplete, Add ELSE IF / Add ELSE, Edit In depth, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === editingBranchIndex && branch.type === 'else-if'\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <!-- ELSE IF condition autocomplete: same options and value model as IF, but initialized from this branch's condition -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, branchIndex); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Branch Header (read-only): display when not editing this branch row -->\n <div\n *ngIf=\"editContext !== 'branchRow' || branchIndex !== editingBranchIndex\"\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"getBranchConditionDisplay(branch)\" [innerHTML]=\"getBranchConditionDisplay(branch)\" (click)=\"onConditionActionClick($event, branch)\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\"></span>\n <ng-container *ngIf=\"getBranchEventDetailsForDisplay(branch).length > 0\">\n <span *ngFor=\"let item of getBranchEventDetailsForDisplay(branch)\" 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]\" (click)=\"onConditionActionClick($event, branch)\">\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 </div>\n <!-- Edit on first branch (IF TRUE) and ELSE IF; Delete on first = whole step, on ELSE IF/ELSE = that branch only -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px] cqa-flex-shrink-0\">\n <button *ngIf=\"branchIndex === 0 || branch.type === 'else-if'\" type=\"button\" (click)=\"onEditFromBranchRow(branchIndex); $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)=\"branchIndex === 0 ? onDelete() : onDeleteBranch(branch); $event.stopPropagation()\" title=\"{{ branchIndex === 0 ? 'Delete step' : 'Delete branch' }}\" 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 <span *ngIf=\"getBranchCreatedDate(branch)\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-flex-shrink-0 cqa-ml-auto\">{{ getBranchCreatedDate(branch) | date:'d MMM yyyy' }}</span>\n </div>\n\n <!-- START marker per branch: START IF, START ELSE IF, or START ELSE (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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 [style.min-height.px]=\"branch.nestedSteps.length === 0 ? 52 : null\"\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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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 When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"branch.nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" 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()\" (mousedown)=\"$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\n <!-- END marker per branch: END IF, END ELSE IF, or END ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n <!-- END CONDITION: final marker after all branches -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END CONDITION</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}.step-row{vertical-align:middle;letter-spacing:normal}\n", ".nested-step-drop-list:has(.step-drag-placeholder-nested:only-child){min-height:52px}.condition-branch-empty{opacity:1;transition:opacity .1s ease}.condition-branch-row:hover .step-actions{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", "compact"], 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", "isDuplicating", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "editable", "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 } });
1172
+ 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", index: "index", condition: "condition", branches: "branches", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", editable: "editable", 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", addStepForLoop: "addStepForLoop", 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", openExternal: "openExternal" }, 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: shown in first branch row below when user clicks Edit from branch row (top block hidden) -->\n <div *ngIf=\"false && 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]=\"conditionLeftDisplayValue\"\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 - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\n Add ELSE IF\n </button>\n <!-- Add Else button - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\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 <!-- Step row: always visible (no template edit here; template edit only in branch row below). Has edit/delete. -->\n <div [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-4 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : '')\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Checkbox/Drag Handle column - same structure as normal-step for alignment -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder && !isInsideStepGroup\" 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 and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" 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 CONDITION\n </span>\n\n <!-- Step row: read-only (condition, summary, actions) when not editing step row -->\n <ng-container *ngIf=\"editContext !== 'stepRow'\">\n <!-- First condition text as plain text (no HTML) -->\n <div *ngIf=\"getConditionPlainText()\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-px-1 cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-truncate\">{{ getConditionPlainText() }}</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto cqa-flex-wrap cqa-px-1\">\n <!-- Branch type badges: IF, ELSE IF (with count), ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-flex-shrink-0\">\n <span *ngFor=\"let badge of getBranchTypeBadges()\"\n [class]=\"'cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-[10px] cqa-leading-[15px] cqa-font-medium ' + badge.badgeClass\">\n {{ badge.label }}\n <ng-container *ngIf=\"badge.count\">+{{ badge.count }}</ng-container>\n </span>\n </div>\n <div\n class=\"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 <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\">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 <!-- Copy button hidden for now -->\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </ng-container>\n\n <!-- Step row: edit mode (CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Cancel, Apply) when editContext === 'stepRow' -->\n <ng-container *ngIf=\"editContext === 'stepRow'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-min-w-0\">\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 </ng-container>\n </div>\n\n <!-- ELSE IF Sections in Edit Mode - shown below step row when editing and has 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-1 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 [compact]=\"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 <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 <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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 <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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(undefined, getBranchById(branch.id), getBranchIndexById(branch.id)); $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 <!-- Expanded Content with Branches (shown when expanded or when editing so edit UI appears in first branch row) -->\n <div *ngIf=\"expanded || isEditing\" 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\" [attr.data-branch-id]=\"branch?.id\">\n <!-- Edit mode (IF TRUE branch): shows CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Edit/Delete, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === 0 && editingBranchIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, 0); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Edit mode (ELSE IF branch): shows CONDITION, autocomplete, Add ELSE IF / Add ELSE, Edit In depth, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === editingBranchIndex && branch.type === 'else-if'\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <!-- ELSE IF condition autocomplete: same options and value model as IF, but initialized from this branch's condition -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, branchIndex); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Branch Header (read-only): display when not editing this branch row -->\n <div\n *ngIf=\"editContext !== 'branchRow' || branchIndex !== editingBranchIndex\"\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"getBranchConditionDisplay(branch)\" [innerHTML]=\"getBranchConditionDisplay(branch)\" (click)=\"onConditionActionClick($event, branch)\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\"></span>\n <ng-container *ngIf=\"getBranchEventDetailsForDisplay(branch).length > 0\">\n <span *ngFor=\"let item of getBranchEventDetailsForDisplay(branch)\" 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]\" (click)=\"onConditionActionClick($event, branch)\">\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 </div>\n <!-- Edit on first branch (IF TRUE) and ELSE IF; Delete on first = whole step, on ELSE IF/ELSE = that branch only -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px] cqa-flex-shrink-0\">\n <button *ngIf=\"branchIndex === 0 || branch.type === 'else-if'\" type=\"button\" (click)=\"onEditFromBranchRow(branchIndex); $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)=\"branchIndex === 0 ? onDelete() : onDeleteBranch(branch); $event.stopPropagation()\" title=\"{{ branchIndex === 0 ? 'Delete step' : 'Delete branch' }}\" 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 <span *ngIf=\"getBranchCreatedDate(branch)\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-flex-shrink-0 cqa-ml-auto\">{{ getBranchCreatedDate(branch) | date:'d MMM yyyy' }}</span>\n </div>\n\n <!-- START marker per branch: START IF, START ELSE IF, or START ELSE (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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)=\"onNestedClickAction($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 [style.min-height.px]=\"branch.nestedSteps.length === 0 ? 52 : null\"\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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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)=\"onNestedClickAction($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 When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"branch.nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" 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()\" (mousedown)=\"$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\n <!-- END marker per branch: END IF, END ELSE IF, or END ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n <!-- END CONDITION: final marker after all branches -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END CONDITION</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}.step-row{vertical-align:middle;letter-spacing:normal}\n", ".nested-step-drop-list:has(.step-drag-placeholder-nested:only-child){min-height:52px}.condition-branch-empty{opacity:1;transition:opacity .1s ease}.condition-branch-row:hover .step-actions{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", "compact"], 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", "isDuplicating", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "editable", "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 } });
1165
1173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseConditionStepComponent, decorators: [{
1166
1174
  type: Component,
1167
1175
  args: [{ selector: 'cqa-test-case-condition-step', host: { class: 'cqa-ui-root' }, styles: [
1168
1176
  STEP_ROW_ACTIONS_STYLES,
1169
1177
  CONDITION_BRANCH_EMPTY_STYLES,
1170
- ], template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: shown in first branch row below when user clicks Edit from branch row (top block hidden) -->\n <div *ngIf=\"false && 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]=\"conditionLeftDisplayValue\"\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 - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\n Add ELSE IF\n </button>\n <!-- Add Else button - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\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 <!-- Step row: always visible (no template edit here; template edit only in branch row below). Has edit/delete. -->\n <div [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-4 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : '')\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Checkbox/Drag Handle column - same structure as normal-step for alignment -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder && !isInsideStepGroup\" 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 and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" 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 CONDITION\n </span>\n\n <!-- Step row: read-only (condition, summary, actions) when not editing step row -->\n <ng-container *ngIf=\"editContext !== 'stepRow'\">\n <!-- First condition text as plain text (no HTML) -->\n <div *ngIf=\"getConditionPlainText()\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-px-1 cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-truncate\">{{ getConditionPlainText() }}</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto cqa-flex-wrap cqa-px-1\">\n <!-- Branch type badges: IF, ELSE IF (with count), ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-flex-shrink-0\">\n <span *ngFor=\"let badge of getBranchTypeBadges()\"\n [class]=\"'cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-[10px] cqa-leading-[15px] cqa-font-medium ' + badge.badgeClass\">\n {{ badge.label }}\n <ng-container *ngIf=\"badge.count\">+{{ badge.count }}</ng-container>\n </span>\n </div>\n <div\n class=\"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 <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\">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 <!-- Copy button hidden for now -->\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </ng-container>\n\n <!-- Step row: edit mode (CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Cancel, Apply) when editContext === 'stepRow' -->\n <ng-container *ngIf=\"editContext === 'stepRow'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-min-w-0\">\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 </ng-container>\n </div>\n\n <!-- ELSE IF Sections in Edit Mode - shown below step row when editing and has 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-1 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 [compact]=\"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 <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 <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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 <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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(undefined, getBranchById(branch.id), getBranchIndexById(branch.id)); $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 <!-- Expanded Content with Branches (shown when expanded or when editing so edit UI appears in first branch row) -->\n <div *ngIf=\"expanded || isEditing\" 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\" [attr.data-branch-id]=\"branch?.id\">\n <!-- Edit mode (IF TRUE branch): shows CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Edit/Delete, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === 0 && editingBranchIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, 0); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Edit mode (ELSE IF branch): shows CONDITION, autocomplete, Add ELSE IF / Add ELSE, Edit In depth, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === editingBranchIndex && branch.type === 'else-if'\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <!-- ELSE IF condition autocomplete: same options and value model as IF, but initialized from this branch's condition -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, branchIndex); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Branch Header (read-only): display when not editing this branch row -->\n <div\n *ngIf=\"editContext !== 'branchRow' || branchIndex !== editingBranchIndex\"\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"getBranchConditionDisplay(branch)\" [innerHTML]=\"getBranchConditionDisplay(branch)\" (click)=\"onConditionActionClick($event, branch)\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\"></span>\n <ng-container *ngIf=\"getBranchEventDetailsForDisplay(branch).length > 0\">\n <span *ngFor=\"let item of getBranchEventDetailsForDisplay(branch)\" 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]\" (click)=\"onConditionActionClick($event, branch)\">\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 </div>\n <!-- Edit on first branch (IF TRUE) and ELSE IF; Delete on first = whole step, on ELSE IF/ELSE = that branch only -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px] cqa-flex-shrink-0\">\n <button *ngIf=\"branchIndex === 0 || branch.type === 'else-if'\" type=\"button\" (click)=\"onEditFromBranchRow(branchIndex); $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)=\"branchIndex === 0 ? onDelete() : onDeleteBranch(branch); $event.stopPropagation()\" title=\"{{ branchIndex === 0 ? 'Delete step' : 'Delete branch' }}\" 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 <span *ngIf=\"getBranchCreatedDate(branch)\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-flex-shrink-0 cqa-ml-auto\">{{ getBranchCreatedDate(branch) | date:'d MMM yyyy' }}</span>\n </div>\n\n <!-- START marker per branch: START IF, START ELSE IF, or START ELSE (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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 [style.min-height.px]=\"branch.nestedSteps.length === 0 ? 52 : null\"\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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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 When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"branch.nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" 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()\" (mousedown)=\"$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\n <!-- END marker per branch: END IF, END ELSE IF, or END ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n <!-- END CONDITION: final marker after all branches -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END CONDITION</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1178
+ ], template: "<div [class]=\"'cqa-flex cqa-flex-col cqa-border cqa-border-solid cqa-border-[#E5E7EB] ' + (isNested ? ' cqa-pl-[24px]' : '')\">\n <!-- Inline Edit Mode: shown in first branch row below when user clicks Edit from branch row (top block hidden) -->\n <div *ngIf=\"false && 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]=\"conditionLeftDisplayValue\"\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 - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElse()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\n Add ELSE IF\n </button>\n <!-- Add Else button - disabled when ELSE already exists -->\n <button\n type=\"button\"\n (click)=\"onAddElseBranch()\"\n [disabled]=\"hasElseBranch\"\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-transition-colors\"\n [class.cqa-cursor-pointer]=\"!hasElseBranch\"\n [class.cqa-cursor-not-allowed]=\"hasElseBranch\"\n [class.cqa-opacity-60]=\"hasElseBranch\">\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 <!-- Step row: always visible (no template edit here; template edit only in branch row below). Has edit/delete. -->\n <div [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-4 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : '')\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Checkbox/Drag Handle column - same structure as normal-step for alignment -->\n <div class=\"cqa-inline-flex cqa-items-center\">\n <div *ngIf=\"isReorder && !isInsideStepGroup\" 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 and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" 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 CONDITION\n </span>\n\n <!-- Step row: read-only (condition, summary, actions) when not editing step row -->\n <ng-container *ngIf=\"editContext !== 'stepRow'\">\n <!-- First condition text as plain text (no HTML) -->\n <div *ngIf=\"getConditionPlainText()\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-px-1 cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-truncate\">{{ getConditionPlainText() }}</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto cqa-flex-wrap cqa-px-1\">\n <!-- Branch type badges: IF, ELSE IF (with count), ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-flex-shrink-0\">\n <span *ngFor=\"let badge of getBranchTypeBadges()\"\n [class]=\"'cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-[10px] cqa-leading-[15px] cqa-font-medium ' + badge.badgeClass\">\n {{ badge.label }}\n <ng-container *ngIf=\"badge.count\">+{{ badge.count }}</ng-container>\n </span>\n </div>\n <div\n class=\"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 <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\">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 <!-- Copy button hidden for now -->\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </ng-container>\n\n <!-- Step row: edit mode (CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Cancel, Apply) when editContext === 'stepRow' -->\n <ng-container *ngIf=\"editContext === 'stepRow'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-2 cqa-flex-1 cqa-flex-wrap cqa-min-w-0\">\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 </ng-container>\n </div>\n\n <!-- ELSE IF Sections in Edit Mode - shown below step row when editing and has 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-1 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 [compact]=\"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 <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 <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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 <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\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(undefined, getBranchById(branch.id), getBranchIndexById(branch.id)); $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 <!-- Expanded Content with Branches (shown when expanded or when editing so edit UI appears in first branch row) -->\n <div *ngIf=\"expanded || isEditing\" 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\" [attr.data-branch-id]=\"branch?.id\">\n <!-- Edit mode (IF TRUE branch): shows CONDITION, autocomplete, IF, Add ELSE IF, Add ELSE, Edit In depth, Edit/Delete, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === 0 && editingBranchIndex === 0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <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\">IF</span>\n <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, 0); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Edit mode (ELSE IF branch): shows CONDITION, autocomplete, Add ELSE IF / Add ELSE, Edit In depth, Cancel/Apply -->\n <div\n *ngIf=\"editContext === 'branchRow' && branchIndex === editingBranchIndex && branch.type === 'else-if'\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n [class]=\"'cqa-px-1 cqa-py-2.5 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between cqa-flex-wrap ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\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]\">CONDITION</span>\n <!-- ELSE IF condition autocomplete: same options and value model as IF, but initialized from this branch's condition -->\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"conditionLeftAutocompleteOptions\"\n [value]=\"conditionLeftDisplayValue\"\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 <button type=\"button\" (click)=\"onAddElse(); $event.stopPropagation()\" 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-transition-colors cqa-cursor-pointer\">Add ELSE IF</button>\n <button type=\"button\" (click)=\"onAddElseBranch(); $event.stopPropagation()\" [disabled]=\"hasElseBranch\" [attr.aria-disabled]=\"hasElseBranch\" 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-transition-colors\" [class.cqa-cursor-pointer]=\"!hasElseBranch\" [class.cqa-cursor-not-allowed]=\"hasElseBranch\" [class.cqa-opacity-60]=\"hasElseBranch\">Add ELSE</button>\n <a href=\"#\" (click)=\"onEditInDepth(undefined, branch, branchIndex); $event.preventDefault()\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">Edit In depth<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 </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\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 <!-- Branch Header (read-only): display when not editing this branch row -->\n <div\n *ngIf=\"editContext !== 'branchRow' || branchIndex !== editingBranchIndex\"\n [class]=\"'cqa-px-4 cqa-py-2 cqa-text-[12px] cqa-leading-[15px] cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between ' + getBranchTextColor(branch) + ' ' + getBranchColorClass(branch)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px] cqa-flex-shrink-0\">{{ getBranchDisplayNumber(branchIndex) }}</span>\n <span>{{ getBranchLabel(branch) }}</span>\n <span *ngIf=\"getBranchConditionDisplay(branch)\" [innerHTML]=\"getBranchConditionDisplay(branch)\" (click)=\"onConditionActionClick($event, branch)\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\"></span>\n <ng-container *ngIf=\"getBranchEventDetailsForDisplay(branch).length > 0\">\n <span *ngFor=\"let item of getBranchEventDetailsForDisplay(branch)\" 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]\" (click)=\"onConditionActionClick($event, branch)\">\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 </div>\n <!-- Edit on first branch (IF TRUE) and ELSE IF; Delete on first = whole step, on ELSE IF/ELSE = that branch only -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px] cqa-flex-shrink-0\">\n <button *ngIf=\"branchIndex === 0 || branch.type === 'else-if'\" type=\"button\" (click)=\"onEditFromBranchRow(branchIndex); $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)=\"branchIndex === 0 ? onDelete() : onDeleteBranch(branch); $event.stopPropagation()\" title=\"{{ branchIndex === 0 ? 'Delete step' : 'Delete branch' }}\" 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 <span *ngIf=\"getBranchCreatedDate(branch)\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-flex-shrink-0 cqa-ml-auto\">{{ getBranchCreatedDate(branch) | date:'d MMM yyyy' }}</span>\n </div>\n\n <!-- START marker per branch: START IF, START ELSE IF, or START ELSE (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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)=\"onNestedClickAction($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 [style.min-height.px]=\"branch.nestedSteps.length === 0 ? 52 : null\"\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 [isInsideStepGroup]=\"isInsideStepGroup\"\n [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\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 (addStepForLoop)=\"onAddStepForLoop($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)=\"onNestedOpenExternal($event)\"\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)=\"onNestedClickAction($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 When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"branch.nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" 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()\" (mousedown)=\"$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\n <!-- END marker per branch: END IF, END ELSE IF, or END ELSE -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndBranchLabel(branch) }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n <!-- END CONDITION: final marker after all branches -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4\" style=\"border-top: 1px solid #E5E7EB;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#7B3306] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END CONDITION</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#7B3306] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1171
1179
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
1172
1180
  type: Input
1173
1181
  }], id: [{
@@ -1260,4 +1268,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1260
1268
  }], openExternal: [{
1261
1269
  type: Output
1262
1270
  }] } });
1263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9jb25kaXRpb24tc3RlcC9jb25kaXRpb24tc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2NvbmRpdGlvbi1zdGVwL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXdDLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5QnJDLENBQUM7QUFVRixNQUFNLE9BQU8sOEJBQThCO0lBc0h6QyxZQUNVLEVBQWUsRUFDZixHQUFzQjtRQUR0QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFqSHZCLGFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsNENBQTRDO1FBQ25DLHVC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QU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29uZGl0aW9uU3RlcENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBUZXN0Q2FzZVN0ZXBDb25maWcsIE5vcm1hbFN0ZXBDb25maWcsIExvb3BTdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENxYUF1dG9jb21wbGV0ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUubW9kZWwnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuY29uc3QgQ09ORElUSU9OX0JSQU5DSF9FTVBUWV9TVFlMRVMgPSBgXG4gIC8qIEVtcHR5IGRyb3Agem9uZTogZW5zdXJlIG1pbiBoZWlnaHQgZm9yIGRyYWctZHJvcCB0byB3b3JrIChJRi9FTFNFIElGL0VMU0UgYnJhbmNoZXMpICovXG4gIC5uZXN0ZWQtc3RlcC1kcm9wLWxpc3Q6aGFzKC5zdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkOm9ubHktY2hpbGQpIHtcbiAgICBtaW4taGVpZ2h0OiA1MnB4O1xuICB9XG4gIC8qIEVtcHR5IElGIC8gRUxTRSBJRiAvIEVMU0U6IGFsd2F5cyBzaG93IHBsdXMgaWNvbiB3aGVuIG5vIHN0ZXBzICh2aXNpYmxlIHdpdGhvdXQgaG92ZXIpICovXG4gIC5jb25kaXRpb24tYnJhbmNoLWVtcHR5IHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBlYXNlO1xuICB9XG4gIC8qIFNob3cgZWRpdC9kZWxldGUgaWNvbnMgd2hlbiBob3ZlcmluZyBvdmVyIGJyYW5jaCByb3cgaGVhZGVyIChJRiBUUlVFLCBFTFNFIElGLCBFTFNFKSAqL1xuICAuY29uZGl0aW9uLWJyYW5jaC1yb3c6aG92ZXIgLnN0ZXAtYWN0aW9ucyB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWNvbmRpdGlvbi1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtcbiAgICBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyxcbiAgICBDT05ESVRJT05fQlJBTkNIX0VNUFRZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VDb25kaXRpb25TdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBDb25kaXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFycmF5IGluZGV4IGZyb20gcGFyZW50IHJlbmRlcmVyIC0gdXNlIHRoaXMgZm9yIGVkaXRJbkRlcHRoIGluc3RlYWQgb2Ygc3RlcE51bWJlciAoc3RlcE51bWJlciBcIjEwLjNcIiBwYXJzZXMgdG8gMTApICovXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBjb25kaXRpb24hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJyYW5jaGVzOiBDb25kaXRpb25CcmFuY2hbXSA9IFtdO1xuICBASW5wdXQoKSBleHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGlzTmVzdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlTG9vcDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZVN0ZXBHcm91cDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Jlb3JkZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uICovXG4gIEBJbnB1dCgpIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBGdW5jdGlvbiB0byBwcm9jZXNzIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2ltaWxhciB0byBzdGVwLWJ1aWxkZXItY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogKHRlbXBsYXRlOiBhbnkpID0+IGFueVtdID0gKCkgPT4gW107XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBhYm92ZSBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5BYm92ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYmVsb3cgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQmVsb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBhZGRTdGVwQmV0d2VlbkFib3ZlIGFuZCBhZGRTdGVwQmV0d2VlbkJlbG93IGluc3RlYWQuIElmIHNldCwgYXBwbGllcyB0byBib3RoIGJ1dHRvbnMuICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gbm9uLW51bGwsIGVkaXQgbW9kZSBpcyBvcGVuOiAnc3RlcFJvdycgPSBlZGl0IFVJIGluIHN0ZXAgcm93IG9ubHksICdicmFuY2hSb3cnID0gZWRpdCBVSSBpbiBicmFuY2ggcm93IG9ubHkgKi9cbiAgZWRpdENvbnRleHQ6ICdzdGVwUm93JyB8ICdicmFuY2hSb3cnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFdoaWNoIGJyYW5jaCBpbmRleCBpcyBiZWluZyBlZGl0ZWQgd2hlbiBlZGl0Q29udGV4dCA9PT0gJ2JyYW5jaFJvdycgKDAgPSBJRiBUUlVFLCAxKyA9IEVMU0UgSUYpICovXG4gIGVkaXRpbmdCcmFuY2hJbmRleDogbnVtYmVyID0gMDtcblxuICAvKiogVHJ1ZSB3aGVuIGVkaXRDb250ZXh0IGlzIHNldCAoZWl0aGVyIHN0ZXAgcm93IG9yIGJyYW5jaCByb3cgZWRpdCkuICovXG4gIGdldCBpc0VkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdENvbnRleHQgIT09IG51bGw7XG4gIH1cblxuICAvKiogQXJyYXkgb2YgRUxTRSBJRiBicmFuY2hlcyBpbiBlZGl0IG1vZGUgKi9cbiAgZWxzZUlmQnJhbmNoZXM6IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdO1xuICAgIHRlbXBsYXRlVmFyaWFibGVzRm9ybTogRm9ybUdyb3VwO1xuICAgIHNuYXBzaG90OiB7IGNvbmRpdGlvbkxlZnQ/OiBzdHJpbmc7IGNvbmRpdGlvbk9wZXJhdG9yPzogc3RyaW5nOyBjb25kaXRpb25SaWdodD86IHN0cmluZyB9O1xuICB9PiA9IFtdO1xuXG4gIC8qKiBGb3JtIGZvciBlZGl0IG1vZGU7IGJvdW5kIHRvIGNxYS1keW5hbWljLXNlbGVjdCBhbmQgY3FhLWN1c3RvbS1pbnB1dCAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogT3BlcmF0b3IgZHJvcGRvd24gY29uZmlnIChJUywgSVMgTk9ULCBDT05UQUlOUywgZXRjLikgKi9cbiAgb3BlcmF0b3JTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIC8qKiBDb25kaXRpb24gbGVmdCBvcGVyYW5kIGRyb3Bkb3duIGNvbmZpZyAobmF0dXJhbCB0ZXh0IGFjdGlvbnMgd2l0aCBJRl9DT05ESVRJT04pICovXG4gIGNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIFNuYXBzaG90IGZvciBDYW5jZWwgcmV2ZXJ0ICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7IGNvbmRpdGlvbkxlZnQ/OiBzdHJpbmc7IGNvbmRpdGlvbk9wZXJhdG9yPzogc3RyaW5nOyBjb25kaXRpb25SaWdodD86IHN0cmluZyB9ID0ge307XG4gIFxuICAvKiogU2VsZWN0ZWQgdGVtcGxhdGUgZm9yIElGIGNvbmRpdGlvbiAqL1xuICBzZWxlY3RlZFRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICAvKiogVGVtcGxhdGUgdmFyaWFibGVzIGZvciBJRiBjb25kaXRpb24gKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIC8qKiBGb3JtIGdyb3VwIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMgKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtITogRm9ybUdyb3VwO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb25maWc6IENvbmRpdGlvblN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIGNvbmRpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgYnJhbmNoU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBicmFuY2g6IENvbmRpdGlvbkJyYW5jaDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBzdGVwSW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgYWRkU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIGEgbmVzdGVkIGxvb3Atc3RlcCBlbWl0cyBhZGRTdGVwRm9yTG9vcCAoZW1wdHkgc3RhdGUgcGx1cyBidXR0b24pLiAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEZvckxvb3AgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbG9vcFN0ZXBDb25maWc6IExvb3BTdGVwQ29uZmlnIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx7IGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoOyBzdGVwSW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgYWRkQnJhbmNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFwiQWRkIEVsc2VcIiBzbyB0aGUgcGFyZW50IGNhbiBjYWxsIFBPU1QgdGVzdF9zdGVwcyB3aXRoIGNvbmRpdGlvblR5cGUgQ09ORElUSU9OX0VMU0UgKi9cbiAgQE91dHB1dCgpIGFkZEVsc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29uZGl0aW9uU3RlcENvbmZpZzogQ29uZGl0aW9uU3RlcENvbmZpZyB9PigpO1xuICAvKiogUGF5bG9hZCBjYW4gYmUgYnJhbmNoIG9ubHkgKGxlZ2FjeSkgb3IgeyBicmFuY2gsIHN0ZXBOdW1iZXIgfSBmb3IgZGVsZXRlIG1vZGFsIGxhYmVsIGUuZy4gXCJTdGVwIDUgRUxTRVwiLiAqL1xuICBAT3V0cHV0KCkgZGVsZXRlQnJhbmNoID0gbmV3IEV2ZW50RW1pdHRlcjxDb25kaXRpb25CcmFuY2ggfCB7IGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoOyBzdGVwTnVtYmVyPzogbnVtYmVyIHwgc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBkdXBsaWNhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleD86IG51bWJlcjsgdGVtcGxhdGVPdmVycmlkZT86IGFueTsgaXNDcmVhdGVNb2RlPzogYm9vbGVhbjsgY3JlYXRlTW9kZUJyYW5jaERhdGE/OiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIGlzIHVwZGF0ZWQgKGUuZy4sIEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGxvb3Atc3RlcCBlZGl0IG1vZGUpICovXG4gIEBPdXRwdXQoKSBzdGVwVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogUmUtZW1pdCB3aGVuIG5lc3RlZCBzdGVwIGdyb3VwIGVtaXRzIG9wZW5FeHRlcm5hbCAocmVkaXJlY3QgdG8gc3RlcCBncm91cCBpbiBuZXcgdGFiKSAqL1xuICBAT3V0cHV0KCkgb3BlbkV4dGVybmFsID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9PigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50LCBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IGJyYW5jaC5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0IGNsaWNrQWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb24gY29uZGl0aW9uL2JyYW5jaCBhY3Rpb24gYmFkZ2VzIChlbGVtZW50LCB0ZXN0X2RhdGEsIGV0Yy4pIHNvIHBhcmVudCBjYW4gb3BlbiBlZGl0IG1vZGFscyAqL1xuICBvbkNvbmRpdGlvbkFjdGlvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBicmFuY2g/OiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgPSBicmFuY2g/LmlkICE9IG51bGxcbiAgICAgID8geyAuLi50aGlzLmNvbmZpZywgaWQ6IFN0cmluZyhicmFuY2guaWQpIH0gYXMgVGVzdENhc2VTdGVwQ29uZmlnXG4gICAgICA6IHRoaXMuY29uZmlnO1xuICAgIHRoaXMuY2xpY2tBY3Rpb24uZW1pdCh7IGV2ZW50LCBzdGVwIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZDtcbiAgICAgIHRoaXMuc3RlcE51bWJlciA9IHRoaXMuY29uZmlnLnN0ZXBOdW1iZXI7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIHRoaXMuYnJhbmNoZXMgPSB0aGlzLmNvbmZpZy5icmFuY2hlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkRWRpdEZvcm0oKTtcbiAgICB0aGlzLmJ1aWxkT3BlcmF0b3JTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgICAgLy8gVXBkYXRlIGNvbmRpdGlvbiBhbmQgYnJhbmNoZXMgd2hlbiBjb25maWcgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBpbW1lZGlhdGUgVUkgdXBkYXRlcylcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgVUkgcmVmbGVjdHMgY2hhbmdlcyBpbW1lZGlhdGVseSwgZXZlbiBpZiBjb25maWcgb2JqZWN0IHJlZmVyZW5jZSBkb2Vzbid0IGNoYW5nZVxuICAgICAgaWYgKHRoaXMuY29uZmlnLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnLmJyYW5jaGVzKSB7XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSB0aGlzLmNvbmZpZy5icmFuY2hlcztcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byBlbnN1cmUgVUkgdXBkYXRlc1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29uZGl0aW9uJ10gJiYgdGhpcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ29uZGl0aW9uIGlucHV0IGNoYW5nZWQsIHVwZGF0ZSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYnJhbmNoZXMnXSAmJiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAvLyBCcmFuY2hlcyBjaGFuZ2VkLCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBSZWJ1aWxkIGZvcm0gd2hlbiBvcHRpb25zIGFyZSBsb2FkZWQgdG8gcG9wdWxhdGUgaW5pdGlhbCB2YWx1ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWRcbiAgICAgIGlmICh0aGlzLmVkaXRGb3JtICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRFZGl0Rm9ybVdpdGhOYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGVkaXQgZm9ybSB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXJlIGxvYWRlZCB0byBwb3B1bGF0ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWQgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkRWRpdEZvcm1XaXRoTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgY3VycmVudCB2YWx1ZSBpcyBlbXB0eSBvciBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICE9PSBuYXR1cmFsVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgdGVtcGxhdGUgb2JqZWN0IChOYXR1cmFsVGV4dEFjdGlvbnMpIGZyb20gdGhlIG9wdGlvblxuICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgdGVtcGxhdGUgYW5kIGdldCB2YXJpYWJsZXNcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBJZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQsIGZpbmQgdGhlIG1hdGNoaW5nIG5hdHVyYWwgdGV4dCBhY3Rpb25cbiAgICBsZXQgY29uZGl0aW9uTGVmdFZhbHVlID0gJyc7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmIChjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUElcbiAgICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgLy8gR2V0IHRoZSBmdWxsIHRlbXBsYXRlIG9iamVjdCAoTmF0dXJhbFRleHRBY3Rpb25zKSBmcm9tIHRoZSBvcHRpb25cbiAgICAgICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlIGFuZCBnZXQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKTtcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgbm8gbmF0dXJhbFRleHRBY3Rpb25JZCBtYXRjaCBmb3VuZCwgcGFyc2UgZnJvbSBjb25kaXRpb24gc3RyaW5nXG4gICAgaWYgKCFjb25kaXRpb25MZWZ0VmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBsZWZ0O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB7IG9wZXJhdG9yLCByaWdodCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLmNvbmRpdGlvbik7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29uZGl0aW9uTGVmdDogW2NvbmRpdGlvbkxlZnRWYWx1ZV0sXG4gICAgICBjb25kaXRpb25PcGVyYXRvcjogW29wZXJhdG9yXSxcbiAgICAgIGNvbmRpdGlvblJpZ2h0OiBbcmlnaHRdLFxuICAgIH0pO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdGVtcGxhdGUgdmFyaWFibGVzIGZvcm0gaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbHNlSWZCcmFuY2goaW5kZXg/OiBudW1iZXIpOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBFTFNFIElGIGZvcm0gd2l0aCBlbXB0eSB2YWx1ZXMgb3IgZnJvbSBleGlzdGluZyBFTFNFIElGIGJyYW5jaCBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBlbHNlSWZCcmFuY2hlcyA9IHRoaXMuYnJhbmNoZXM/LmZpbHRlcihiID0+IGIudHlwZSA9PT0gJ2Vsc2UtaWYnKSB8fCBbXTtcbiAgICBjb25zdCBicmFuY2hJbmRleCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyBpbmRleCA6IGVsc2VJZkJyYW5jaGVzLmxlbmd0aDtcbiAgICBjb25zdCBlbHNlSWZCcmFuY2ggPSBlbHNlSWZCcmFuY2hlc1ticmFuY2hJbmRleF07XG4gICAgY29uc3QgZWxzZUNvbmRpdGlvbiA9IGVsc2VJZkJyYW5jaD8uYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHsgbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGVsc2VDb25kaXRpb24pO1xuICAgIFxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IFtsZWZ0XSxcbiAgICAgIGNvbmRpdGlvbk9wZXJhdG9yOiBbb3BlcmF0b3JdLFxuICAgICAgY29uZGl0aW9uUmlnaHQ6IFtyaWdodF0sXG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgZWxzZS1pZi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gLFxuICAgICAgZm9ybSxcbiAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IG51bGwsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogW10sXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0sXG4gICAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0OiBsZWZ0LCBjb25kaXRpb25PcGVyYXRvcjogb3BlcmF0b3IsIGNvbmRpdGlvblJpZ2h0OiByaWdodCB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRvclNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICAgIHsgaWQ6ICdpcycsIHZhbHVlOiAnaXMnLCBuYW1lOiAnSVMnLCBsYWJlbDogJ0lTJyB9LFxuICAgICAgeyBpZDogJ2lzIG5vdCcsIHZhbHVlOiAnaXMgbm90JywgbmFtZTogJ0lTIE5PVCcsIGxhYmVsOiAnSVMgTk9UJyB9LFxuICAgICAgeyBpZDogJ2NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIG5hbWU6ICdDT05UQUlOUycsIGxhYmVsOiAnQ09OVEFJTlMnIH0sXG4gICAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRVFVQUxTJywgbGFiZWw6ICdFUVVBTFMnIH0sXG4gICAgICB7IGlkOiAnc3RhcnRzIHdpdGgnLCB2YWx1ZTogJ3N0YXJ0cyB3aXRoJywgbmFtZTogJ1NUQVJUUyBXSVRIJywgbGFiZWw6ICdTVEFSVFMgV0lUSCcgfSxcbiAgICAgIHsgaWQ6ICdlbmRzIHdpdGgnLCB2YWx1ZTogJ2VuZHMgd2l0aCcsIG5hbWU6ICdFTkRTIFdJVEgnLCBsYWJlbDogJ0VORFMgV0lUSCcgfSxcbiAgICBdO1xuICAgIHRoaXMub3BlcmF0b3JTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25PcGVyYXRvcicsXG4gICAgICBwbGFjZWhvbGRlcjogJ09wZXJhdG9yJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gbGVmdCBzZWxlY3QgY29uZmlnIHdpdGggZmlsdGVyZWQgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKElGX0NPTkRJVElPTiBvbmx5KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG5hdHVyYWwgdGV4dCBhY3Rpb25zIHRvIG9ubHkgaW5jbHVkZSB0aG9zZSB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIklGX0NPTkRJVElPTlwiXG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ0lGX0NPTkRJVElPTic7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb25MZWZ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IENvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGNvbmRpdGlvbiBsZWZ0IGF1dG9jb21wbGV0ZSAoSUZfQ09ORElUSU9OIG5hdHVyYWwgdGV4dCBhY3Rpb25zKSAqL1xuICBnZXQgY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnMoKTogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbmRpdGlvbkxlZnRTZWxlY3RDb25maWc/Lm9wdGlvbnMgPz8gW107XG4gICAgcmV0dXJuIG9wdHMubWFwKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGV4YWN0bHkgYXMgcmVjZWl2ZWQgZnJvbSBBUEksIGZhbGxiYWNrIHRvIG5hbWUvdmFsdWUvaWRcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICAvLyBTdG9yZSB0aGUgZnVsbCB0ZW1wbGF0ZSBvYmplY3QgKE5hdHVyYWxUZXh0QWN0aW9ucykgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyBwcm9jZXNzaW5nXG4gICAgICAgIC8vIFVzZSBvcHRpb24udGVtcGxhdGUgaWYgYXZhaWxhYmxlIChmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyksIG90aGVyd2lzZSB1c2Ugb3B0aW9uIGl0c2VsZlxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdmFsdWUgZm9yIElGL0VMU0UgSUYgY29uZGl0aW9uIGF1dG9jb21wbGV0ZS5cbiAgICogLSBGb3IgSUYgKHN0ZXAgcm93IC8gSUYgYnJhbmNoIGVkaXQpLCBzaG93IG5hdHVyYWxUZXh0IGZyb20gb3B0aW9uIG1hdGNoaW5nIG5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBmb3JtIGlzIGVtcHR5LlxuICAgKiAtIEZvciBFTFNFIElGIGJyYW5jaCBlZGl0LCBhbHdheXMgdXNlIHRoZSBmb3JtIHZhbHVlIChzbyBjbGVhcmluZyBsZWF2ZXMgdGhlIGZpZWxkIGVtcHR5IGluc3RlYWQgb2YgcmV2ZXJ0aW5nIHRvIElGKS5cbiAgICovXG4gIGdldCBjb25kaXRpb25MZWZ0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBpc0Zvcm1IdG1sID0gZm9ybVZhbHVlICYmIChTdHJpbmcoZm9ybVZhbHVlKS5pbmNsdWRlcygnPCcpIHx8IFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc+JykpO1xuXG4gICAgLy8gV2hlbiBlZGl0aW5nIGFuIEVMU0UgSUYgYnJhbmNoLCBkb24ndCBmYWxsIGJhY2sgdG8gSUYncyBuYXR1cmFsVGV4dDsganVzdCBzaG93IHRoZSBjdXJyZW50IGZvcm0gdmFsdWUuXG4gICAgY29uc3QgaXNFZGl0aW5nRWxzZUlmQnJhbmNoID1cbiAgICAgIHRoaXMuZWRpdENvbnRleHQgPT09ICdicmFuY2hSb3cnICYmXG4gICAgICB0eXBlb2YgdGhpcy5lZGl0aW5nQnJhbmNoSW5kZXggPT09ICdudW1iZXInICYmXG4gICAgICB0aGlzLmVkaXRpbmdCcmFuY2hJbmRleCA+IDA7XG4gICAgaWYgKGlzRWRpdGluZ0Vsc2VJZkJyYW5jaCkge1xuICAgICAgaWYgKGlzRm9ybUh0bWwpIHJldHVybiAnJztcbiAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgbmF0dXJhbFRleHRTdHIgPSBTdHJpbmcobmF0dXJhbFRleHQpO1xuICAgICAgICAgIGlmICghZm9ybVZhbHVlIHx8IGZvcm1WYWx1ZSA9PT0gbmF0dXJhbFRleHRTdHIgfHwgaXNGb3JtSHRtbCkgcmV0dXJuIG5hdHVyYWxUZXh0U3RyO1xuICAgICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9ybUh0bWwpIHJldHVybiAnJztcbiAgICByZXR1cm4gZm9ybVZhbHVlO1xuICB9XG5cbiAgb25Db25kaXRpb25MZWZ0U2VsZWN0KG9wdGlvbjogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBvcHRWYWwgPSAob3B0aW9uLnZhbHVlID8/ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSAob3B0Lm5hdHVyYWxUZXh0ID8/IG9wdC5uYW1lID8/IG9wdC52YWx1ZSA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgICAgcmV0dXJuIG4gPT09IG9wdFZhbCB8fCAob3B0LnRlbXBsYXRlICYmIChvcHQudGVtcGxhdGUgYXMgYW55KS5uYXR1cmFsVGV4dD8udG9TdHJpbmcoKS50cmltKCkgPT09IG9wdFZhbCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgXG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gUGFzcyB0aGUgZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMgb2JqZWN0IHdoaWNoIGhhcyB0aGUgdmFyaWFibGVzIHByb3BlcnR5XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZygnVGVtcGxhdGUgdmFyaWFibGVzIGxvYWRlZDonLCB2YXJpYWJsZXMsICdmcm9tIHRlbXBsYXRlOicsIGZ1bGxUZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB2YXJpYWJsZXMgfHwgW107XG4gICAgICAvLyBCdWlsZCBmb3JtIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdObyBtYXRjaGluZyB0ZW1wbGF0ZSBmb3VuZCBvciB0ZW1wbGF0ZSBoYXMgbm8gdmFyaWFibGVzJywge1xuICAgICAgICBmdWxsVGVtcGxhdGUsXG4gICAgICAgIGhhc1ZhcmlhYmxlczogZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMsXG4gICAgICAgIG9wdGlvblZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgIG9wdGlvblRlbXBsYXRlOiBvcHRpb24udGVtcGxhdGVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8vIEF1dG8tb3BlbiBFZGl0IEluIGRlcHRoIHdoZW4gdXNlciBzZWxlY3RzIGEgY29uZGl0aW9uIGZyb20gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAvLyBQYXNzIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZSBzbyB0aGUgbW9kYWwgc2hvd3MgdGhlIG5ld2x5IHNlbGVjdGVkIHRlbXBsYXRlLCBub3QgdGhlIG9sZCBzdGVwIHRlbXBsYXRlLlxuICAgIC8vIFByZWZlciBzZWxlY3RlZFRlbXBsYXRlICh2YWxpZGF0ZWQpLCB0aGVuIGZ1bGxUZW1wbGF0ZSwgdGhlbiBvcHRpb24udGVtcGxhdGUgKGZyb20gYXV0b2NvbXBsZXRlKVxuICAgIGNvbnN0IHRlbXBsYXRlVG9QYXNzID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlIHx8IGZ1bGxUZW1wbGF0ZSB8fCBvcHRpb24udGVtcGxhdGU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uRWRpdEluRGVwdGgodGVtcGxhdGVUb1Bhc3MpLCAxMDApO1xuICB9XG4gIFxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZGF0YSBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBjb25maWdXaXRoRGF0YS50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge307XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gY29udHJvbHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2YWx1ZSBmcm9tIGV4aXN0aW5nIGRhdGEgZmlyc3QsIHRoZW4gZnJvbSB2YXJpYWJsZSBkZWZhdWx0XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBib29sZWFuIHN0cmluZyB0byBib29sZWFuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJzEnO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRWxzZUNvbmRpdGlvbkxlZnRTZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0sIGJyYW5jaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBicmFuY2ggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmQoYiA9PiBiLmlkID09PSBicmFuY2hJZCk7XG4gICAgaWYgKCFicmFuY2gpIHJldHVybjtcbiAgICBcbiAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgXG4gICAgLy8gR2V0IHRlbXBsYXRlIGZyb20gb3B0aW9uIC0gb3B0aW9uLnRlbXBsYXRlIHNob3VsZCBjb250YWluIHRoZSBmdWxsIE5hdHVyYWxUZXh0QWN0aW9ucyBvYmplY3RcbiAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gb3B0aW9uLnRlbXBsYXRlO1xuICAgIFxuICAgIC8vIElmIHRlbXBsYXRlIG5vdCBpbiBvcHRpb24sIHRyeSB0byBmaW5kIGZyb20gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBieSBtYXRjaGluZyBuYXR1cmFsVGV4dFxuICAgIGxldCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ1RlbXBsYXRlO1xuICAgIGlmICghZnVsbFRlbXBsYXRlIHx8ICFmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgICAvLyBVc2UgdGVtcGxhdGUgcHJvcGVydHkgZnJvbSBvcHRpb24gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHRoZSBvcHRpb24gaXRzZWxmXG4gICAgICBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgZm9yIHJlZmVyZW5jZVxuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkRWxzZVRlbXBsYXRlVmFyaWFibGVzRm9ybShicmFuY2gpO1xuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIWJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLy8gQXV0by1vcGVuIEVkaXQgSW4gZGVwdGggd2hlbiB1c2VyIHNlbGVjdHMgYSBjb25kaXRpb24gZnJvbSB0aGUgRUxTRSBJRiBhdXRvY29tcGxldGUuXG4gICAgLy8gRm9yIGV4aXN0aW5nIGJyYW5jaDogcGFzcyBicmFuY2ggYW5kIGJyYW5jaEluZGV4IHNvIG1vZGFsIHNob3dzIFwiRWRpdCBTdGVwIE5cIi5cbiAgICAvLyBGb3IgbmV3IGJyYW5jaCAoaWQgc3RhcnRzIHdpdGggXCJlbHNlLWlmLVwiID0gdGVtcCBVSSBpZCk6IHBhc3MgaXNDcmVhdGVNb2RlIHNvIG1vZGFsIHNob3dzIFwiQ3JlYXRlIFN0ZXBcIiBhbmQgY2FsbHMgY3JlYXRlIEFQSSBvbiBzYXZlLlxuICAgIGNvbnN0IGNvbmZpZ0JyYW5jaCA9IHRoaXMuZ2V0QnJhbmNoQnlJZChicmFuY2hJZCk7XG4gICAgY29uc3QgYnJhbmNoSW5kZXggPSB0aGlzLmdldEJyYW5jaEluZGV4QnlJZChicmFuY2hJZCk7XG4gICAgY29uc3QgaXNOZXdCcmFuY2ggPSB0eXBlb2YgYnJhbmNoSWQgPT09ICdzdHJpbmcnICYmIGJyYW5jaElkLnN0YXJ0c1dpdGgoJ2Vsc2UtaWYtJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uRWRpdEluRGVwdGgoZnVsbFRlbXBsYXRlLCBjb25maWdCcmFuY2ggPz8gdW5kZWZpbmVkLCBicmFuY2hJbmRleCA+PSAwID8gYnJhbmNoSW5kZXggOiB1bmRlZmluZWQsIGlzTmV3QnJhbmNoLCBicmFuY2gpLCAxMDApO1xuICB9XG4gIFxuICBwcml2YXRlIGJ1aWxkRWxzZVRlbXBsYXRlVmFyaWFibGVzRm9ybShicmFuY2g6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdO1xuICAgIHRlbXBsYXRlVmFyaWFibGVzRm9ybTogRm9ybUdyb3VwO1xuICAgIHNuYXBzaG90OiB7IGNvbmRpdGlvbkxlZnQ/OiBzdHJpbmc7IGNvbmRpdGlvbk9wZXJhdG9yPzogc3RyaW5nOyBjb25kaXRpb25SaWdodD86IHN0cmluZyB9O1xuICB9KTogdm9pZCB7XG4gICAgaWYgKCFicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyhicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnJlbW92ZUNvbnRyb2woa2V5KTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBHZXQgZXhpc3RpbmcgdGVtcGxhdGUgdmFyaWFibGVzIGRhdGEgZnJvbSBjb25maWcgaWYgYXZhaWxhYmxlIChmb3IgRUxTRSBJRiBicmFuY2gpXG4gICAgY29uc3QgY29uZmlnV2l0aERhdGEgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gY29uZmlnV2l0aERhdGEuZWxzZVRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICBcbiAgICAvLyBBZGQgZm9ybSBjb250cm9scyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIFRyeSB0byBnZXQgdmFsdWUgZnJvbSBleGlzdGluZyBkYXRhIGZpcnN0LCB0aGVuIGZyb20gdmFyaWFibGUgZGVmYXVsdFxuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnQgYm9vbGVhbiBzdHJpbmcgdG8gYm9vbGVhblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICcxJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQWRkRWxzZSgpOiB2b2lkIHtcbiAgICAvLyBBZGQgYSBuZXcgRUxTRSBJRiBicmFuY2ggKFVJIHJvdyBvbmx5OyBBUElzIGFyZSBjYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBBcHBseSlcbiAgICBjb25zdCBuZXdCcmFuY2ggPSB0aGlzLmJ1aWxkRWxzZUlmQnJhbmNoKCk7XG4gICAgdGhpcy5lbHNlSWZCcmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gIH1cblxuICBvbkFkZEVsc2VCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gRW1pdCBzbyBwYXJlbnQgY2FuIGNhbGwgUE9TVCB0ZXN0X3N0ZXBzIHdpdGggY29uZGl0aW9uVHlwZSBDT05ESVRJT05fRUxTRVxuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5hZGRFbHNlLmVtaXQoeyBjb25kaXRpb25TdGVwQ29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUVsc2UoYnJhbmNoSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSB0aGUgRUxTRSBJRiBicmFuY2ggd2l0aCB0aGUgZ2l2ZW4gSURcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZWxzZUlmQnJhbmNoZXMuZmluZEluZGV4KGIgPT4gYi5pZCA9PT0gYnJhbmNoSWQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RyaXAgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcgdG8gZ2V0IHBsYWluIHRleHQgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sIHx8IHR5cGVvZiBodG1sICE9PSAnc3RyaW5nJykgcmV0dXJuIGh0bWw7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpdiBlbGVtZW50IHRvIHBhcnNlIEhUTUwgYW5kIGV4dHJhY3QgdGV4dFxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiBkaXYudGV4dENvbnRlbnQgfHwgZGl2LmlubmVyVGV4dCB8fCBodG1sLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICB9XG5cbiAgLyoqIFBhcnNlIGNvbmRpdGlvbiBzdHJpbmcgaW50byBsZWZ0LCBvcGVyYXRvciwgcmlnaHQgKGUuZy4gXCJVc2VydHlwZSBpcyBQcmVtaXVtXCIpXG4gICAqIFN0cmlwcyBIVE1MIHRhZ3MgYmVmb3JlIHBhcnNpbmcgdG8gaGFuZGxlIGZvcm1hdHRlZCBjb25kaXRpb25zICovXG4gIHByaXZhdGUgcGFyc2VDb25kaXRpb24oYzogc3RyaW5nKTogeyBsZWZ0OiBzdHJpbmc7IG9wZXJhdG9yOiBzdHJpbmc7IHJpZ2h0OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFjIHx8IHR5cGVvZiBjICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgbGVmdDogJycsIG9wZXJhdG9yOiAnaXMnLCByaWdodDogJycgfTtcbiAgICB9XG4gICAgLy8gU3RyaXAgSFRNTCB0YWdzIGJlZm9yZSBwYXJzaW5nIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGZvcm1hdHRlZCBjb25kaXRpb25zXG4gICAgY29uc3QgcGxhaW5UZXh0ID0gdGhpcy5zdHJpcEh0bWxUYWdzKGMpLnRyaW0oKTtcbiAgICBjb25zdCBvcGVyYXRvcnMgPSBbJyBpcyBub3QgJywgJyBpcyAnLCAnIGNvbnRhaW5zICcsICcgZXF1YWxzICcsICcgc3RhcnRzIHdpdGggJywgJyBlbmRzIHdpdGggJ107XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcGVyYXRvcnMpIHtcbiAgICAgIGNvbnN0IGkgPSBwbGFpblRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wKTtcbiAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxlZnQ6IHBsYWluVGV4dC5zbGljZSgwLCBpKS50cmltKCksXG4gICAgICAgICAgb3BlcmF0b3I6IG9wLnRyaW0oKSxcbiAgICAgICAgICByaWdodDogcGxhaW5UZXh0LnNsaWNlKGkgKyBvcC5sZW5ndGgpLnRyaW0oKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogcGxhaW5UZXh0LCBvcGVyYXRvcjogJ2lzJywgcmlnaHQ6ICcnIH07XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9uIHN0cmluZyBmcm9tIGZvcm0gdmFsdWVzICovXG4gIHByaXZhdGUgYnVpbGRDb25kaXRpb25Gcm9tRm9ybSgpOiBzdHJpbmcge1xuICAgIGxldCBsZWZ0ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3Qgb3AgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8udmFsdWUgPz8gJ2lzJztcbiAgICBjb25zdCByaWdodCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25SaWdodCcpPy52YWx1ZSA/PyAnJztcbiAgICBcbiAgICAvLyBJZiBsZWZ0IGlzIGFuIElEIChudW1iZXIpLCBmaW5kIHRoZSBuYXR1cmFsVGV4dCBmcm9tIG9wdGlvbnNcbiAgICBpZiAobGVmdCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IFN0cmluZyhsZWZ0KTtcbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBudW1iZXIgKElEKSBvciBpZiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5hdHVyYWxUZXh0XG4gICAgICBjb25zdCBpc051bWVyaWNJZCA9ICFpc05hTihOdW1iZXIobGVmdFZhbHVlKSkgJiYgbGVmdFZhbHVlLnRyaW0oKSAhPT0gJyc7XG4gICAgICBcbiAgICAgIGlmIChpc051bWVyaWNJZCkge1xuICAgICAgICAvLyBGaW5kIHRoZSBvcHRpb24gYnkgSUQgYW5kIHVzZSBpdHMgbmF0dXJhbFRleHRcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRBY3Rpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBsZWZ0VmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uICYmIHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgbGVmdCA9IFN0cmluZyhzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYWxyZWFkeSBhIG5hdHVyYWxUZXh0IG9yIG5lZWRzIHRvIGJlIGZvdW5kXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBvcHRpb24ubmF0dXJhbFRleHQgPT09IGxlZnQgfHwgb3B0aW9uLm5hbWUgPT09IGxlZnQgfHwgb3B0aW9uLnZhbHVlID09PSBsZWZ0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbiAmJiBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGxlZnQgPSBTdHJpbmcoc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBbbGVmdCwgb3AsIHJpZ2h0XS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBDb3VudCBzdGVwcyBhcyBjb25kaXRpb25zIChiYWRnZXMpOiBJRiA9IDEgKyBudW1iZXIgb2YgRUxTRSBJRiArIDEgaWYgRUxTRSAqL1xuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBicmFuY2hDb3VudCA9IHRoaXMuYnJhbmNoZXM/Lmxlbmd0aCA/PyAwO1xuICAgIHJldHVybiBicmFuY2hDb3VudCA+IDAgPyBgJHticmFuY2hDb3VudH0gc3RlcCR7YnJhbmNoQ291bnQgIT09IDEgPyAncycgOiAnJ31gIDogJzAgc3RlcHMnO1xuICB9XG5cbiAgLyoqIEJyYW5jaCB0eXBlIGJhZGdlcyBmb3Igc3RlcCByb3c6IElGLCBFTFNFIElGICh3aXRoIGNvdW50IGlmIG11bHRpcGxlKSwgRUxTRSAqL1xuICBnZXRCcmFuY2hUeXBlQmFkZ2VzKCk6IHsgbGFiZWw6IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IHR5cGU6ICdpZicgfCAnZWxzZS1pZicgfCAnZWxzZSc7IGJhZGdlQ2xhc3M6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGJhZGdlczogeyBsYWJlbDogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgdHlwZTogJ2lmJyB8ICdlbHNlLWlmJyB8ICdlbHNlJzsgYmFkZ2VDbGFzczogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IGVsc2VJZkNvdW50ID0gdGhpcy5icmFuY2hlcz8uZmlsdGVyKGIgPT4gYi50eXBlID09PSAnZWxzZS1pZicpLmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IGhhc0Vsc2UgPSB0aGlzLmhhc0Vsc2VCcmFuY2g7XG5cbiAgICBiYWRnZXMucHVzaCh7IGxhYmVsOiAnSUYnLCB0eXBlOiAnaWYnLCBiYWRnZUNsYXNzOiAnY3FhLWJnLVsjMERCRDdEMUFdIGNxYS10ZXh0LVsjMEQ1NDJCXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzBEQkQ3RF0nIH0pO1xuICAgIGlmIChlbHNlSWZDb3VudCA+IDApIHtcbiAgICAgIGJhZGdlcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdFTFNFIElGJyxcbiAgICAgICAgY291bnQ6IGVsc2VJZkNvdW50ID4gMSA/IGVsc2VJZkNvdW50IDogdW5kZWZpbmVkLFxuICAgICAgICB0eXBlOiAnZWxzZS1pZicsXG4gICAgICAgIGJhZGdlQ2xhc3M6ICdjcWEtYmcteWVsbG93LTUwIGNxYS10ZXh0LXllbGxvdy03MDAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXIteWVsbG93LTIwMCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaGFzRWxzZSkge1xuICAgICAgYmFkZ2VzLnB1c2goeyBsYWJlbDogJ0VMU0UnLCB0eXBlOiAnZWxzZScsIGJhZGdlQ2xhc3M6ICdjcWEtYmctcmVkLTUwIGNxYS10ZXh0LXJlZC03MDAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItcmVkLTIwMCcgfSk7XG4gICAgfVxuICAgIHJldHVybiBiYWRnZXM7XG4gIH1cblxuICAvKiogQ29uZGl0aW9uIHRleHQgYXMgcGxhaW4gdGV4dCAoc3RyaXBzIEhUTUwpLCB0cnVuY2F0ZWQgd2l0aCBcIi4uLlwiIGlmIGxvbmcgKi9cbiAgZ2V0Q29uZGl0aW9uUGxhaW5UZXh0KG1heExlbmd0aDogbnVtYmVyID0gNjApOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25kaXRpb24gfHwgdHlwZW9mIHRoaXMuY29uZGl0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBsYWluID0gdGhpcy5jb25kaXRpb24ucmVwbGFjZSgvPFtePl0qPi9nLCAnJykudHJpbSgpO1xuICAgIGlmIChwbGFpbi5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gcGxhaW47XG4gICAgbGV0IHRydW5jYXRlZCA9IHBsYWluLnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgLy8gVHJpbSB0cmFpbGluZyBwdW5jdHVhdGlvbiB0byBhdm9pZCBcIi4uLi5cIiB3aGVuIHRleHQgZW5kcyB3aXRoIFwiLlwiXG4gICAgdHJ1bmNhdGVkID0gdHJ1bmNhdGVkLnJlcGxhY2UoL1suLDs6IT9dKyQvLCAnJyk7XG4gICAgcmV0dXJuIHRydW5jYXRlZCArICcuLi4nO1xuICB9XG5cbiAgLyoqIEV2ZW50IGtleS12YWx1ZSBwYWlycyBmb3IgZGlzcGxheSwgZXhjbHVkaW5nIGN1c3RvbUV2ZW50ICovXG4gIGdldEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jb25maWc/LmV2ZW50O1xuICAgIGlmICghZXZlbnQgfHwgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhldmVudClcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09ICdjdXN0b21FdmVudCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpIDogJydcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBFdmVudCBrZXktdmFsdWUgcGFpcnMgZm9yIGEgYnJhbmNoIChlLmcuIHNlbGVjdG9yLCBlbGVtZW50KSAtIGZvciBJRiB1c2VzIGNvbmZpZy5ldmVudCwgZm9yIEVMU0UgSUYvRUxTRSB1c2VzIGJyYW5jaC5ldmVudCAqL1xuICBnZXRCcmFuY2hFdmVudERldGFpbHNGb3JEaXNwbGF5KGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGV2ZW50ID0gKGJyYW5jaCBhcyBhbnkpLmV2ZW50ID8/IChicmFuY2gudHlwZSA9PT0gJ2lmJyA/IHRoaXMuY29uZmlnPy5ldmVudCA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV2ZW50KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gJ2N1c3RvbUV2ZW50JylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoLCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5icmFuY2hTdGVwQ2hhbmdlLmVtaXQoeyBicmFuY2gsIHN0ZXAsIHN0ZXBJbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IG9wZW5FeHRlcm5hbCBmcm9tIG5lc3RlZCBzdGVwIGdyb3VwIHNvIHJlZGlyZWN0IHdvcmtzIGZvciBzdGVwIGdyb3VwcyBpbnNpZGUgY29uZGl0aW9uIGJyYW5jaGVzLiAqL1xuICBvbk5lc3RlZE9wZW5FeHRlcm5hbChwYXlsb2FkOiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9KTogdm9pZCB7XG4gICAgaWYgKHBheWxvYWQ/LnN0ZXApIHtcbiAgICAgIHRoaXMub3BlbkV4dGVybmFsLmVtaXQocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgb25OZXN0ZWRUb2dnbGVFeHBhbmRlZChldmVudDogYm9vbGVhbiB8IHtjb25maWc6IFRlc3RDYXNlU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59LCBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseVxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIENvbmRpdGlvblN0ZXBDb25maWcsIGV4cGFuZGVkOiBldmVudC5leHBhbmRlZH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb29sZWFuIGZvcm1hdCBmcm9tIG90aGVyIHN0ZXAgdHlwZXNcbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudCBhcyBib29sZWFuO1xuICAgIH1cbiAgICB0aGlzLm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uQWRkU3RlcChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgYnJhbmNoIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBhZGRTdGVwRm9yTG9vcCBldmVudCBmcm9tIG5lc3RlZCBsb29wLXN0ZXAgKGVtcHR5IHN0YXRlIHBsdXMgYnV0dG9uKS4gKi9cbiAgb25BZGRTdGVwRm9yTG9vcChldmVudDogeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfSwgYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICAvLyBSZS1lbWl0IGFkZFN0ZXBGb3JMb29wIHNvIGl0IGJ1YmJsZXMgdXAgdG8gdGhlIHBvcnRhbCwgd2hpY2ggd2lsbCBoYW5kbGUgY3JlYXRpbmcgdGhlIHN0ZXBcbiAgICAvLyB3aXRoIHRoZSBjb3JyZWN0IHBhcmVudElkIChsb29wIHN0ZXAgaWQpIGFuZCBicmFuY2ggY29udGV4dFxuICAgIHRoaXMuYWRkU3RlcEZvckxvb3AuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gsIHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoeyBicmFuY2gsIHN0ZXBJbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBpbiBhIGJyYW5jaCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgaW4gYSBicmFuY2ggc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgdGhpcy5hZGRCcmFuY2guZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICBjb25zdCBicmFuY2hJbmRleCA9IHRoaXMuYnJhbmNoZXM/LmluZGV4T2YoYnJhbmNoKSA/PyAwO1xuICAgIGNvbnN0IGRpc3BsYXlOdW1iZXIgPSB0aGlzLmdldEJyYW5jaERpc3BsYXlOdW1iZXIoYnJhbmNoSW5kZXgpO1xuICAgIHRoaXMuZGVsZXRlQnJhbmNoLmVtaXQoeyBicmFuY2gsIHN0ZXBOdW1iZXI6IGRpc3BsYXlOdW1iZXIgfSk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgcGF5bG9hZDogQ29uZGl0aW9uQnJhbmNoIHwgeyBicmFuY2g6IENvbmRpdGlvbkJyYW5jaDsgc3RlcE51bWJlcj86IG51bWJlciB8IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gUmUtZW1pdCBkZWxldGVCcmFuY2ggc28gc3RlcC1saXN0IGNhbiBvcGVuIGRlbGV0ZSBtb2RhbCBhbmQgY2FsbCBBUEkuXG4gICAgY29uc3QgYnJhbmNoID0gcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgJ2JyYW5jaCcgaW4gcGF5bG9hZCA/IChwYXlsb2FkIGFzIHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2ggfSkuYnJhbmNoIDogKHBheWxvYWQgYXMgQ29uZGl0aW9uQnJhbmNoKTtcbiAgICBjb25zdCBicmFuY2hJbmRleCA9IHRoaXMuYnJhbmNoZXM/LmluZGV4T2YoYnJhbmNoKSA/PyAwO1xuICAgIGNvbnN0IGRpc3BsYXlOdW1iZXIgPSB0aGlzLmdldEJyYW5jaERpc3BsYXlOdW1iZXIoYnJhbmNoSW5kZXgpO1xuICAgIGNvbnN0IHRvRW1pdDogeyBicmFuY2g6IENvbmRpdGlvbkJyYW5jaDsgc3RlcE51bWJlcj86IG51bWJlciB8IHN0cmluZyB9ID1cbiAgICAgIHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmICdicmFuY2gnIGluIHBheWxvYWRcbiAgICAgICAgPyB7IGJyYW5jaDogKHBheWxvYWQgYXMgeyBicmFuY2g6IENvbmRpdGlvbkJyYW5jaCB9KS5icmFuY2gsIHN0ZXBOdW1iZXI6IChwYXlsb2FkIGFzIGFueSkuc3RlcE51bWJlciA/PyBkaXNwbGF5TnVtYmVyIH1cbiAgICAgICAgOiB7IGJyYW5jaDogcGF5bG9hZCBhcyBDb25kaXRpb25CcmFuY2gsIHN0ZXBOdW1iZXI6IGRpc3BsYXlOdW1iZXIgfTtcbiAgICB0aGlzLmRlbGV0ZUJyYW5jaC5lbWl0KHRvRW1pdCk7XG4gIH1cblxuICBpc05vcm1hbFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBOb3JtYWxTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2V2ZW50VHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzTG9vcFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBMb29wU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdsb29wVHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzQ29uZGl0aW9uU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIENvbmRpdGlvblN0ZXBDb25maWcge1xuICAgIHJldHVybiAnY29uZGl0aW9uJyBpbiBzdGVwICYmICdicmFuY2hlcycgaW4gc3RlcDtcbiAgfVxuXG4gIGlzU3RlcEdyb3VwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgU3RlcEdyb3VwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2dyb3VwTmFtZScgaW4gc3RlcDtcbiAgfVxuXG4gIGdldEJyYW5jaExhYmVsKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnJhbmNoLmxhYmVsIHx8IChicmFuY2gudHlwZSA9PT0gJ2lmJyA/ICdJRiBUUlVFJyA6IGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicgPyAnRUxTRSBJRicgOiAnRUxTRScpO1xuICB9XG5cbiAgLyoqIENvbmRpdGlvbiB0ZXh0IGZvciBicmFuY2ggaGVhZGVyIGRpc3BsYXk6IElGIHVzZXMgbWFpbiBjb25kaXRpb24sIEVMU0UgSUYvRUxTRSB1c2UgYnJhbmNoLmFjdGlvbiAqL1xuICBnZXRCcmFuY2hDb25kaXRpb25EaXNwbGF5KGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICBpZiAoYnJhbmNoLnR5cGUgPT09ICdpZicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiA/PyAnJztcbiAgICB9XG4gICAgcmV0dXJuIGJyYW5jaC5hY3Rpb24gPz8gJyc7XG4gIH1cblxuICAvKiogU3RhcnQgbWFya2VyIGxhYmVsIGZvciBlYWNoIGJyYW5jaDogU1RBUlQgSUYsIFNUQVJUIEVMU0UgSUYsIG9yIFNUQVJUIEVMU0UgKi9cbiAgZ2V0U3RhcnRCcmFuY2hMYWJlbChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJyYW5jaC50eXBlID09PSAnaWYnID8gJ1NUQVJUIElGJyA6IGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicgPyAnU1RBUlQgRUxTRSBJRicgOiAnU1RBUlQgRUxTRSc7XG4gIH1cblxuICAvKiogRW5kIG1hcmtlciBsYWJlbCBmb3IgZWFjaCBicmFuY2g6IEVORCBJRiwgRU5EIEVMU0UgSUYsIG9yIEVORCBFTFNFICovXG4gIGdldEVuZEJyYW5jaExhYmVsKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnJhbmNoLnR5cGUgPT09ICdpZicgPyAnRU5EIElGJyA6IGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicgPyAnRU5EIEVMU0UgSUYnIDogJ0VORCBFTFNFJztcbiAgfVxuXG4gIC8qKiBCcmFuY2ggZGlzcGxheSBudW1iZXI6IGZ1bGwgaGllcmFyY2hpY2FsIG51bWJlci4gSUYgPSBzdGVwTnVtYmVyIChlLmcuIDIuMS41MCksIEVMU0UgSUYgPSAyLjEuNTEsIEVMU0UgPSAyLjEuNTIuICovXG4gIGdldEJyYW5jaERpc3BsYXlOdW1iZXIoYnJhbmNoSW5kZXg6IG51bWJlcik6IG51bWJlciB8IHN0cmluZyB7XG4gICAgaWYgKGJyYW5jaEluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGVwTnVtYmVyO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyh0aGlzLnN0ZXBOdW1iZXIpLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgbGFzdE51bSA9IHBhcnNlSW50KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLCAxMCkgfHwgMDtcbiAgICBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9IFN0cmluZyhsYXN0TnVtICsgYnJhbmNoSW5kZXgpO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7XG4gIH1cblxuICAvKiogRmluZCBicmFuY2ggaW4gYnJhbmNoZXMgYnkgaWQgKGZvciBlbHNlSWZCcmFuY2hlcyB3aGljaCB1c2Ugc2FtZSBpZCkuICovXG4gIGdldEJyYW5jaEJ5SWQoYnJhbmNoSWQ/OiBzdHJpbmcgfCBudW1iZXIpOiBDb25kaXRpb25CcmFuY2ggfCB1bmRlZmluZWQge1xuICAgIGlmIChicmFuY2hJZCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmJyYW5jaGVzPy5maW5kKGIgPT4gYi5pZCAhPSBudWxsICYmIFN0cmluZyhiLmlkKSA9PT0gU3RyaW5nKGJyYW5jaElkKSk7XG4gIH1cblxuICAvKiogR2V0IGJyYW5jaCBpbmRleCBpbiBicmFuY2hlcyBieSBpZC4gKi9cbiAgZ2V0QnJhbmNoSW5kZXhCeUlkKGJyYW5jaElkPzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBicmFuY2ggPSB0aGlzLmdldEJyYW5jaEJ5SWQoYnJhbmNoSWQpO1xuICAgIHJldHVybiBicmFuY2ggIT0gbnVsbCA/ICh0aGlzLmJyYW5jaGVzPy5pbmRleE9mKGJyYW5jaCkgPz8gLTEpIDogLTE7XG4gIH1cblxuICBnZXRCcmFuY2hDb2xvckNsYXNzKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICBpZiAoYnJhbmNoLnR5cGUgPT09ICdpZicpIHtcbiAgICAgIHJldHVybiAnY3FhLWJnLVsjMERCRDdEMUFdJztcbiAgICB9IGVsc2UgaWYgKGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicpIHtcbiAgICAgIHJldHVybiAnY3FhLWJnLXllbGxvdy01MCBjcWEtYm9yZGVyLXllbGxvdy0yMDAnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NxYS1iZy1yZWQtNTAgY3FhLWJvcmRlci1yZWQtMjAwJztcbiAgICB9XG4gIH1cblxuICBnZXRCcmFuY2hUZXh0Q29sb3IoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiBzdHJpbmcge1xuICAgIGlmIChicmFuY2gudHlwZSA9PT0gJ2lmJykge1xuICAgICAgcmV0dXJuICdjcWEtdGV4dC1bIzBENTQyQl0nO1xuICAgIH0gZWxzZSBpZiAoYnJhbmNoLnR5cGUgPT09ICdlbHNlLWlmJykge1xuICAgICAgcmV0dXJuICdjcWEtdGV4dC15ZWxsb3ctNzAwJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjcWEtdGV4dC1yZWQtNzAwJztcbiAgICB9XG4gIH1cblxuICAvKiogQ3JlYXRlZCBkYXRlIGZvciBicmFuY2ggaGVhZGVyIGRpc3BsYXk6IGJyYW5jaC1zcGVjaWZpYyBvciBmYWxsYmFjayB0byBjb25maWcuICovXG4gIGdldEJyYW5jaENyZWF0ZWREYXRlKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYnJhbmNoLmNyZWF0ZWREYXRlID8/IHRoaXMuY29uZmlnPy5jcmVhdGVkRGF0ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gY29uZGl0aW9uIGFscmVhZHkgaGFzIGFuIEVMU0UgYnJhbmNoIChkaXNhYmxlcyBBZGQgRUxTRSBJRiAvIEFkZCBFTFNFKS4gKi9cbiAgZ2V0IGhhc0Vsc2VCcmFuY2goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnJhbmNoZXM/LnNvbWUoYiA9PiBiLnR5cGUgPT09ICdlbHNlJykgPz8gZmFsc2U7XG4gIH1cblxuICBvbk9wZW5FeHRlcm5hbCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBjb25kaXRpb24gc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICAvKiogU2hhcmVkIGluaXQgZm9yIGVkaXQgbW9kZTsgdGhlbiBjYWxsIG9uRWRpdEZyb21TdGVwUm93IG9yIG9uRWRpdEZyb21CcmFuY2hSb3cgdG8gc2V0IGNvbnRleHQuICovXG4gIHByaXZhdGUgaW5pdEVkaXRGb3JtKGJyYW5jaD86IENvbmRpdGlvbkJyYW5jaCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSxcbiAgICAgIGNvbmRpdGlvbk9wZXJhdG9yOiB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlLFxuICAgICAgY29uZGl0aW9uUmlnaHQ6IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUsXG4gICAgfTtcblxuICAgIGxldCBjb25kaXRpb25MZWZ0VmFsdWUgPSAnJztcbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZWRpdGluZ0Vsc2VJZiA9ICEhYnJhbmNoICYmIGJyYW5jaC50eXBlID09PSAnZWxzZS1pZic7XG4gICAgY29uc3QgaGFzVGVtcGxhdGUgPVxuICAgICAgIWVkaXRpbmdFbHNlSWYgJiZcbiAgICAgIGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmXG4gICAgICB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiZcbiAgICAgIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKGhhc1RlbXBsYXRlKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0FjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nQWN0aW9uKSB7XG4gICAgICAgIC8vIEZvciB0ZW1wbGF0ZS1iYXNlZCBjb25kaXRpb25zLCB1c2UgdGhlIGZ1bGwgbmF0dXJhbFRleHQgKGl0J3MgYSBjb21wbGV0ZSBzZW50ZW5jZSlcbiAgICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbWF0Y2hpbmdBY3Rpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdBY3Rpb24ubmFtZSA/PyBtYXRjaGluZ0FjdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNvbmRpdGlvbkxlZnRWYWx1ZSkge1xuICAgICAgLy8gTm8gdGVtcGxhdGUgb3IgZWRpdGluZyBFTFNFIElGOiBwYXJzZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb24gc3RyaW5nXG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID1cbiAgICAgICAgZWRpdGluZ0Vsc2VJZiAmJiBicmFuY2g/LmFjdGlvbiA/IFN0cmluZyhicmFuY2guYWN0aW9uKSA6ICh0aGlzLmNvbmRpdGlvbiA/PyAnJyk7XG4gICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMucGFyc2VDb25kaXRpb24oc291cmNlVGV4dCk7XG4gICAgICBjb25kaXRpb25MZWZ0VmFsdWUgPSBsZWZ0O1xuICAgIH1cblxuICAgIC8vIE9ubHkgcGFyc2Ugb3BlcmF0b3IgYW5kIHJpZ2h0IGlmIHdlIGRvbid0IGhhdmUgYSB0ZW1wbGF0ZSAodGVtcGxhdGVzIGFyZSBjb21wbGV0ZSBzZW50ZW5jZXMpXG4gICAgaWYgKCFoYXNUZW1wbGF0ZSkge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9XG4gICAgICAgIGVkaXRpbmdFbHNlSWYgJiYgYnJhbmNoPy5hY3Rpb24gPyBTdHJpbmcoYnJhbmNoLmFjdGlvbikgOiAodGhpcy5jb25kaXRpb24gPz8gJycpO1xuICAgICAgY29uc3QgeyBvcGVyYXRvciwgcmlnaHQgfSA9IHRoaXMucGFyc2VDb25kaXRpb24oc291cmNlVGV4dCk7XG4gICAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKG9wZXJhdG9yKTtcbiAgICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8uc2V0VmFsdWUocmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgdGVtcGxhdGVzLCBjbGVhciBvcGVyYXRvciBhbmQgcmlnaHQgKHRlbXBsYXRlIG5hdHVyYWxUZXh0IGlzIHRoZSBmdWxsIGNvbmRpdGlvbilcbiAgICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8uc2V0VmFsdWUoJ2lzJyk7XG4gICAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKCcnKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKGNvbmRpdGlvbkxlZnRWYWx1ZSk7XG4gICAgdGhpcy5lbHNlSWZCcmFuY2hlcyA9IFtdO1xuICB9XG5cbiAgLyoqIEVkaXQgZnJvbSBzdGVwIHJvdzogZWRpdCBVSSBhcHBlYXJzIGluIHRoZSBzdGVwIHJvdyBvbmx5IChmaXJzdCBicmFuY2ggc3RheXMgcmVhZC1vbmx5KS4gKi9cbiAgb25FZGl0RnJvbVN0ZXBSb3coKTogdm9pZCB7XG4gICAgdGhpcy5pbml0RWRpdEZvcm0oKTtcbiAgICB0aGlzLmVkaXRDb250ZXh0ID0gJ3N0ZXBSb3cnO1xuICB9XG5cbiAgLyoqIEVkaXQgZnJvbSBicmFuY2ggcm93OiBlZGl0IFVJIGFwcGVhcnMgaW4gdGhhdCBicmFuY2ggcm93IChJRiBUUlVFIG9yIEVMU0UgSUYpLiAqL1xuICBvbkVkaXRGcm9tQnJhbmNoUm93KGJyYW5jaEluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgY29uc3QgYnJhbmNoID0gdGhpcy5icmFuY2hlcyAmJiB0aGlzLmJyYW5jaGVzLmxlbmd0aCA+IGJyYW5jaEluZGV4XG4gICAgICA/IHRoaXMuYnJhbmNoZXNbYnJhbmNoSW5kZXhdXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluaXRFZGl0Rm9ybShicmFuY2gpO1xuICAgIHRoaXMuZWRpdGluZ0JyYW5jaEluZGV4ID0gYnJhbmNoSW5kZXg7XG4gICAgdGhpcy5lZGl0Q29udGV4dCA9ICdicmFuY2hSb3cnO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBvbkVkaXRGcm9tU3RlcFJvdyBvciBvbkVkaXRGcm9tQnJhbmNoUm93LiBLZXB0IGZvciBjb21wYXRpYmlsaXR5LiAqL1xuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0RWRpdEZvcm0oKTtcbiAgICB0aGlzLmVkaXRDb250ZXh0ID0gJ2JyYW5jaFJvdyc7XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbkxlZnQgPz8gJycpO1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8uc2V0VmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uT3BlcmF0b3IgPz8gJ2lzJyk7XG4gICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy5zZXRWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25SaWdodCA/PyAnJyk7XG4gICAgXG4gICAgLy8gUmVzZXQgYWxsIEVMU0UgSUYgYnJhbmNoZXMgdG8gdGhlaXIgc25hcHNob3RzXG4gICAgdGhpcy5lbHNlSWZCcmFuY2hlcy5mb3JFYWNoKGJyYW5jaCA9PiB7XG4gICAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25MZWZ0ID8/ICcnKTtcbiAgICAgIGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25PcGVyYXRvciA/PyAnaXMnKTtcbiAgICAgIGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKGJyYW5jaC5zbmFwc2hvdC5jb25kaXRpb25SaWdodCA/PyAnJyk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgYWxsIEVMU0UgSUYgYnJhbmNoZXNcbiAgICB0aGlzLmVsc2VJZkJyYW5jaGVzID0gW107XG5cbiAgICB0aGlzLmVkaXRDb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLmVkaXRpbmdCcmFuY2hJbmRleCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcGF5bG9hZCBmb3Igb25lIEVMU0UgSUYgYnJhbmNoIChhY3Rpb24sIG5hdHVyYWxUZXh0QWN0aW9uSWQsIHRlbXBsYXRlVmFyaWFibGVzRGF0YSwgdGVzdERhdGFMaXN0KVxuICAgKiBzbyB0aGUgcGFyZW50IGNhbiBjcmVhdGUgdGhlIHN0ZXAgdmlhIFBPU1QgdGhlbiBQVVQgd2hlbiBBcHBseSBpcyBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEVsc2VJZkJyYW5jaFBheWxvYWQoYnJhbmNoOiB7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU6IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W107XG4gICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBGb3JtR3JvdXA7XG4gIH0pOiB7IGFjdGlvbjogc3RyaW5nOyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IHRlc3REYXRhTGlzdD86IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gfSB7XG4gICAgY29uc3QgY29uZGl0aW9uTGVmdCA9IGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy52YWx1ZSA/PyAnaXMnO1xuICAgIGNvbnN0IGNvbmRpdGlvblJpZ2h0ID0gYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUgPz8gJyc7XG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmF0dXJhbFRleHRWYWx1ZTogc3RyaW5nID0gY29uZGl0aW9uTGVmdDtcbiAgICBpZiAoY29uZGl0aW9uTGVmdCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IFN0cmluZyhjb25kaXRpb25MZWZ0KTtcbiAgICAgIGNvbnN0IGlzTnVtZXJpY0lkID0gIWlzTmFOKE51bWJlcihsZWZ0VmFsdWUpKSAmJiBsZWZ0VmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aW9uOiBhbnkgPSBpc051bWVyaWNJZFxuICAgICAgICA/IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4gU3RyaW5nKG9wdC5pZCkgPT09IGxlZnRWYWx1ZSlcbiAgICAgICAgOiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgICAgIChvcHQ6IGFueSkgPT4gb3B0Lm5hdHVyYWxUZXh0ID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdC5uYW1lID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdC52YWx1ZSA9PT0gY29uZGl0aW9uTGVmdFxuICAgICAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24pIHtcbiAgICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZCA9IHNlbGVjdGVkQWN0aW9uLmlkO1xuICAgICAgICBuYXR1cmFsVGV4dFZhbHVlID0gc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQgfHwgc2VsZWN0ZWRBY3Rpb24ubmFtZSB8fCBzZWxlY3RlZEFjdGlvbi52YWx1ZSB8fCBjb25kaXRpb25MZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueSA9IHt9O1xuICAgIGNvbnN0IHRlc3REYXRhTGlzdDogQXJyYXk8eyB0ZXN0RGF0YTogc3RyaW5nOyB0ZXN0RGF0YVR5cGU6IHN0cmluZyB9PiA9IFtdO1xuICAgIGlmIChicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcyAmJiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YVt2YXJpYWJsZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHRlc3REYXRhTGlzdC5wdXNoKHsgdGVzdERhdGE6IFN0cmluZyh2YWx1ZSksIHRlc3REYXRhVHlwZTogJ3JhdycgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBhY3Rpb24gPSBbbmF0dXJhbFRleHRWYWx1ZSwgY29uZGl0aW9uT3BlcmF0b3IsIGNvbmRpdGlvblJpZ2h0XS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IGFjdGlvbiB8fCAoYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGU/Lm5hdHVyYWxUZXh0ID8/ICcnKSxcbiAgICAgIC4uLihuYXR1cmFsVGV4dEFjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgeyBuYXR1cmFsVGV4dEFjdGlvbklkIH0pLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRlbXBsYXRlVmFyaWFibGVzRGF0YSkubGVuZ3RoID4gMCAmJiB7IHRlbXBsYXRlVmFyaWFibGVzRGF0YSB9KSxcbiAgICAgIC4uLih0ZXN0RGF0YUxpc3QubGVuZ3RoID4gMCAmJiB7IHRlc3REYXRhTGlzdCB9KSxcbiAgICB9O1xuICB9XG5cbiAgb25FZGl0QXBwbHkoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZWRpdEZvcm0udmFsdWU7XG4gICAgY29uc3QgY29uZGl0aW9uTGVmdCA9IGZvcm1WYWx1ZXMuY29uZGl0aW9uTGVmdCA/PyAnJztcbiAgICBjb25zdCBjb25kaXRpb25PcGVyYXRvciA9IGZvcm1WYWx1ZXMuY29uZGl0aW9uT3BlcmF0b3IgPz8gJ2lzJztcbiAgICBjb25zdCBjb25kaXRpb25SaWdodCA9IGZvcm1WYWx1ZXMuY29uZGl0aW9uUmlnaHQgPz8gJyc7XG5cbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBuYXR1cmFsIHRleHQgYWN0aW9uIGFuZCBnZXQgbmF0dXJhbFRleHQgKG5vdCBJRClcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuYXR1cmFsVGV4dFZhbHVlOiBzdHJpbmcgPSBjb25kaXRpb25MZWZ0OyAvLyBEZWZhdWx0IHRvIGNvbmRpdGlvbkxlZnRcbiAgICBcbiAgICBpZiAoY29uZGl0aW9uTGVmdCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IFN0cmluZyhjb25kaXRpb25MZWZ0KTtcbiAgICAgIGNvbnN0IGlzTnVtZXJpY0lkID0gIWlzTmFOKE51bWJlcihsZWZ0VmFsdWUpKSAmJiBsZWZ0VmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgIFxuICAgICAgbGV0IHNlbGVjdGVkQWN0aW9uOiBhbnk7XG4gICAgICBpZiAoaXNOdW1lcmljSWQpIHtcbiAgICAgICAgLy8gRmluZCBieSBJRCBhbmQgZ2V0IG5hdHVyYWxUZXh0XG4gICAgICAgIHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gbGVmdFZhbHVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaW5kIGJ5IG5hdHVyYWxUZXh0LCBuYW1lLCBvciB2YWx1ZVxuICAgICAgICBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLm5hdHVyYWxUZXh0ID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdGlvbi5uYW1lID09PSBjb25kaXRpb25MZWZ0IHx8IG9wdGlvbi52YWx1ZSA9PT0gY29uZGl0aW9uTGVmdFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24pIHtcbiAgICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZCA9IHNlbGVjdGVkQWN0aW9uLmlkO1xuICAgICAgICAvLyBVc2UgbmF0dXJhbFRleHQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIG5hbWUgb3IgdmFsdWVcbiAgICAgICAgbmF0dXJhbFRleHRWYWx1ZSA9IHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0IHx8IHNlbGVjdGVkQWN0aW9uLm5hbWUgfHwgc2VsZWN0ZWRBY3Rpb24udmFsdWUgfHwgY29uZGl0aW9uTGVmdDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ29sbGVjdCB0ZW1wbGF0ZSB2YXJpYWJsZXMgdmFsdWVzIGZvciBldmVudCBvYmplY3RcbiAgICBjb25zdCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueSA9IHt9O1xuICAgIC8vIEJ1aWxkIHRlc3REYXRhTGlzdCBhcnJheSBpbiB0aGUgb3JkZXIgb2YgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+ID0gW107XG4gICAgXG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAvLyBBZGQgdG8gZXZlbnQgb2JqZWN0IChlLmcuLCBzb3VyY2VfdmFsdWUsIHRhcmdldF92YWx1ZSlcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAvLyBBZGQgdG8gdGVzdERhdGFMaXN0IGFycmF5IChvcmRlciBtYXR0ZXJzIC0gbWFpbnRhaW4gdGVtcGxhdGUgdmFyaWFibGUgb3JkZXIpXG4gICAgICAgICAgdGVzdERhdGFMaXN0LnB1c2goe1xuICAgICAgICAgICAgdGVzdERhdGE6IFN0cmluZyh2YWx1ZSksXG4gICAgICAgICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBCdWlsZCBjb25kaXRpb24gc3RyaW5nXG4gICAgLy8gSWYgd2UgaGF2ZSBhIG5hdHVyYWxUZXh0QWN0aW9uSWQgKHRlbXBsYXRlKSwgdXNlIHRoZSBmdWxsIG5hdHVyYWxUZXh0VmFsdWUgYXMtaXMgKGl0J3MgYWxyZWFkeSBhIGNvbXBsZXRlIHNlbnRlbmNlKVxuICAgIC8vIE90aGVyd2lzZSwgYnVpbGQgZnJvbSBwYXJ0czogY29uZGl0aW9uTGVmdCArIG9wZXJhdG9yICsgY29uZGl0aW9uUmlnaHRcbiAgICBsZXQgcmF3Q29uZGl0aW9uOiBzdHJpbmc7XG4gICAgaWYgKG5hdHVyYWxUZXh0QWN0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGVtcGxhdGUtYmFzZWQgY29uZGl0aW9uOiBuYXR1cmFsVGV4dFZhbHVlIGlzIHRoZSBmdWxsIHRlbXBsYXRlIChlLmcuLCBcIkNoZWNrIHRoZSB0ZXh0ICN7bGFiZWx9IGlzIHByZXNlbnQgb24gdGhlIGN1cnJlbnQgcGFnZVwiKVxuICAgICAgcmF3Q29uZGl0aW9uID0gbmF0dXJhbFRleHRWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFudWFsIGNvbmRpdGlvbjogYnVpbGQgZnJvbSBwYXJ0c1xuICAgICAgcmF3Q29uZGl0aW9uID0gW25hdHVyYWxUZXh0VmFsdWUsIGNvbmRpdGlvbk9wZXJhdG9yLCBjb25kaXRpb25SaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0VkaXRpbmdCcmFuY2hSb3cgPSB0aGlzLmVkaXRDb250ZXh0ID09PSAnYnJhbmNoUm93JztcbiAgICBjb25zdCBicmFuY2hGb3JFZGl0ID0gaXNFZGl0aW5nQnJhbmNoUm93ICYmIHRoaXMuYnJhbmNoZXMgJiYgdGhpcy5icmFuY2hlcy5sZW5ndGggPiB0aGlzLmVkaXRpbmdCcmFuY2hJbmRleFxuICAgICAgPyB0aGlzLmJyYW5jaGVzW3RoaXMuZWRpdGluZ0JyYW5jaEluZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGlzRWRpdGluZ0Vsc2VJZkJyYW5jaCA9ICEhYnJhbmNoRm9yRWRpdCAmJiBicmFuY2hGb3JFZGl0LnR5cGUgPT09ICdlbHNlLWlmJztcblxuICAgIC8vIEZvciBkaXNwbGF5IGluIHRoZSBoZWFkZXIsIHN1YnN0aXR1dGUgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIHdpdGggSFRNTCBiYWRnZXMgdXNpbmcgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLlxuICAgIC8vIFRoaXMgbWlycm9ycyB0aGUgcmVuZGVyZXIgYmVoYXZpb3Igc28gdXNlcnMgbmV2ZXIgc2VlIHJhdyAje2xhYmVsfSB0ZXh0IHdoaWxlIGVkaXRpbmcuXG4gICAgLy8gLSBGb3IgSUYgKHN0ZXAgcm93IC8gSUYgYnJhbmNoIGVkaXQpLCB1cGRhdGUgbWFpbiBjb25kaXRpb24gaGVhZGVyLlxuICAgIC8vIC0gRm9yIEVMU0UgSUYgZWRpdCwgdXBkYXRlIG9ubHkgdGhhdCBicmFuY2gncyBhY3Rpb24gdGV4dDsga2VlcCBJRiBoZWFkZXIgdW5jaGFuZ2VkLlxuICAgIGNvbnN0IGZvcm1hdHRlZEZvckRpc3BsYXkgPSB0aGlzLnN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbEZvckNvbmRpdGlvbihyYXdDb25kaXRpb24sIHRlbXBsYXRlVmFyaWFibGVzRGF0YSk7XG4gICAgaWYgKGlzRWRpdGluZ0Vsc2VJZkJyYW5jaCAmJiBicmFuY2hGb3JFZGl0KSB7XG4gICAgICAvLyBVcGRhdGUgRUxTRSBJRiBicmFuY2ggYWN0aW9uIGZvciBpbW1lZGlhdGUgVUkgZmVlZGJhY2tcbiAgICAgIChicmFuY2hGb3JFZGl0IGFzIGFueSkuYWN0aW9uID0gZm9ybWF0dGVkRm9yRGlzcGxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb24gPSBmb3JtYXR0ZWRGb3JEaXNwbGF5O1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHBheWxvYWQgZm9yIGVhY2ggbmV3bHkgYWRkZWQgRUxTRSBJRiAoc28gcGFyZW50IGNhbiBjYWxsIFBPU1QgdGhlbiBQVVQgd2hlbiBBcHBseSBpcyBjbGlja2VkKVxuICAgIGNvbnN0IG5ld0Vsc2VJZkJyYW5jaGVzID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5tYXAoYiA9PiB0aGlzLmJ1aWxkRWxzZUlmQnJhbmNoUGF5bG9hZChiKSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIG5ldyB2YWx1ZXNcbiAgICBjb25zdCB1cGRhdGVkQ29uZmlnQmFzZTogQ29uZGl0aW9uU3RlcENvbmZpZyAmIHtcbiAgICAgIGlkPzogc3RyaW5nO1xuICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlcjtcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YT86IGFueTtcbiAgICAgIHRlc3REYXRhTGlzdD86IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT47XG4gICAgICBuZXdFbHNlSWZCcmFuY2hlcz86IEFycmF5PHsgYWN0aW9uOiBzdHJpbmc7IG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXI7IHRlbXBsYXRlVmFyaWFibGVzRGF0YT86IGFueTsgdGVzdERhdGFMaXN0PzogQXJyYXk8eyB0ZXN0RGF0YTogc3RyaW5nOyB0ZXN0RGF0YVR5cGU6IHN0cmluZyB9PiB9PjtcbiAgICAgIGlzRWxzZUlmQnJhbmNoPzogYm9vbGVhbjtcbiAgICAgIHBhcmVudENvbmRpdGlvbklkPzogc3RyaW5nO1xuICAgIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHN0ZXBUeXBlOiB0aGlzLmNvbmZpZy5zdGVwVHlwZSB8fCBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLCAvLyBFbnN1cmUgc3RlcFR5cGUgaXMgc2V0XG4gICAgICAuLi4obmF0dXJhbFRleHRBY3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9IGFzIGFueSksXG4gICAgICAuLi4oT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhKS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0gYXMgYW55KSxcbiAgICAgIC4uLih0ZXN0RGF0YUxpc3QubGVuZ3RoID4gMCAmJiB7IHRlc3REYXRhTGlzdCB9IGFzIGFueSksXG4gICAgICAuLi4obmV3RWxzZUlmQnJhbmNoZXMubGVuZ3RoID4gMCAmJiB7IG5ld0Vsc2VJZkJyYW5jaGVzIH0gYXMgYW55KSxcbiAgICB9O1xuXG4gICAgbGV0IHVwZGF0ZWRDb25maWc6IHR5cGVvZiB1cGRhdGVkQ29uZmlnQmFzZTtcbiAgICBpZiAoaXNFZGl0aW5nRWxzZUlmQnJhbmNoICYmIGJyYW5jaEZvckVkaXQgJiYgYnJhbmNoRm9yRWRpdC5pZCAhPSBudWxsKSB7XG4gICAgICAvLyBFZGl0aW5nIGV4aXN0aW5nIEVMU0UgSUYgYnJhbmNoOiB0YXJnZXQgdGhhdCBicmFuY2gncyBzdGVwIElEIGFuZCBzZW5kIHJhdyBjb25kaXRpb24gc28gYmFja2VuZCB1cGRhdGVzIHRoZSBicmFuY2ggb25seS5cbiAgICAgIHVwZGF0ZWRDb25maWcgPSB7XG4gICAgICAgIC4uLnVwZGF0ZWRDb25maWdCYXNlLFxuICAgICAgICBpZDogU3RyaW5nKGJyYW5jaEZvckVkaXQuaWQpLFxuICAgICAgICBjb25kaXRpb246IHJhd0NvbmRpdGlvbixcbiAgICAgICAgaXNFbHNlSWZCcmFuY2g6IHRydWUsXG4gICAgICAgIHBhcmVudENvbmRpdGlvbklkOiBTdHJpbmcodGhpcy5jb25maWcuaWQpLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElGIGNvbmRpdGlvbiBlZGl0IChzdGVwIHJvdyBvciBJRiBicmFuY2ggcm93KTogdXNlIGZvcm1hdHRlZCBjb25kaXRpb24gZm9yIGRpc3BsYXlcbiAgICAgIHVwZGF0ZWRDb25maWcgPSB7XG4gICAgICAgIC4uLnVwZGF0ZWRDb25maWdCYXNlLFxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgaW5kaXZpZHVhbCBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29uZGl0aW9uKTtcbiAgICBcbiAgICAvLyBFbWl0IHN0ZXAgdXBkYXRlIGV2ZW50IHdpdGggZnVsbCBjb25maWcgKGluY2x1ZGVzIG5ld0Vsc2VJZkJyYW5jaGVzIHNvIHBhcmVudCBjYW4gY3JlYXRlIHN0ZXBzIG9uIEFwcGx5KVxuICAgIGNvbnNvbGUubG9nKCdDb25kaXRpb24tc3RlcDogRW1pdHRpbmcgc3RlcFVwZGF0ZSBldmVudCcsIHVwZGF0ZWRDb25maWcpO1xuICAgIHRoaXMuc3RlcFVwZGF0ZS5lbWl0KHVwZGF0ZWRDb25maWcpO1xuXG4gICAgdGhpcy5lZGl0Q29udGV4dCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTG9jYWwgaGVscGVyIHRvIHN1YnN0aXR1dGUgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIGluIHRoZSBjb25kaXRpb24gdGV4dCB3aXRoIEhUTUwgYmFkZ2Ugc3BhbnMuXG4gICAqIE1pcnJvcnMgdGhlIHBvcnRhbCByZW5kZXJlcidzIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbCBzbyBpbmxpbmUgZWRpdCBtb2RlIG5ldmVyIHNob3dzIHJhdyAje2xhYmVsfS5cbiAgICovXG4gIHByaXZhdGUgc3Vic3RpdHV0ZVRlbXBsYXRlVmFyaWFibGVzVG9IdG1sRm9yQ29uZGl0aW9uKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGRhdGEgPSB2YXJpYWJsZXMgJiYgdHlwZW9mIHZhcmlhYmxlcyA9PT0gJ29iamVjdCcgPyB2YXJpYWJsZXMgOiB7fTtcbiAgICBjb25zdCBlc2NhcGUgPSAodjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi50ZXh0Q29udGVudCA9IHY7XG4gICAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgICB9O1xuICAgIGNvbnN0IGVsZW1lbnRWYXJzID0gWydsYWJlbCcsICdkZXNjcmlwdGlvbicsICdlbGVtZW50JywgJ3NlbGVjdG9yJywgJ2FpX3Rhc2snLCAncXVlcnknLCAnY3VzdG9tX2NvZGUnXTtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYXJzID0gWydhdHRyaWJ1dGUnXTtcblxuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcI1xceyhbXn1dKylcXH0vZywgKF8sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoZGF0YSBhcyBhbnkpW2tleV07XG4gICAgICBjb25zdCBkaXNwbGF5VmFsID0gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyA/IFN0cmluZyh2YWwpIDoga2V5O1xuICAgICAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZShkaXNwbGF5VmFsKTtcbiAgICAgIGlmIChlbGVtZW50VmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiZWxlbWVudFwiPiR7ZXNjYXBlZH08L3NwYW4+YDtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVWYXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJhdHRyaWJ1dGVcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cInRlc3RfZGF0YVwiPiR7ZXNjYXBlZH08L3NwYW4+YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGVkaXRJbkRlcHRoLiBXaGVuIGJyYW5jaCBpcyBwcm92aWRlZCAoRUxTRSBJRi9FTFNFIGJyYW5jaCByb3cpLCB1c2UgYnJhbmNoJ3MgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAqIGFuZCBicmFuY2ggZGlzcGxheSBudW1iZXIgZm9yIGNvcnJlY3QgXCJFZGl0IFN0ZXAgTlwiIHRpdGxlLiBXaGVuIGlzQ3JlYXRlTW9kZSAobmV3IEVMU0UgSUYpLCBtb2RhbCBzaG93cyBcIkNyZWF0ZSBJbiBkZXB0aFwiIGFuZCBjYWxscyBjcmVhdGUgQVBJIG9uIHNhdmUuXG4gICAqL1xuICBvbkVkaXRJbkRlcHRoKHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnksIGJyYW5jaD86IENvbmRpdGlvbkJyYW5jaCwgYnJhbmNoSW5kZXg/OiBudW1iZXIsIGlzQ3JlYXRlTW9kZT86IGJvb2xlYW4sIGVsc2VJZkJyYW5jaD86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICAgIGxldCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJyYW5jaCAhPSBudWxsICYmIGJyYW5jaEluZGV4ICE9IG51bGwgJiYgYnJhbmNoSW5kZXggPj0gMCAmJiAhaXNDcmVhdGVNb2RlKSB7XG4gICAgICAvLyBCcmFuY2ggcm93IChFTFNFIElGL0VMU0UpIC0gZXhpc3RpbmcgYnJhbmNoOiB1c2UgbmVzdGVkIGNvbmRpdGlvbiBzdGVwIGlmIHByZXNlbnQsIGVsc2UgbWFpbiBjb25maWcgd2l0aCBicmFuY2ggaWRcbiAgICAgIGNvbnN0IG5lc3RlZENvbmRpdGlvbiA9IGJyYW5jaC5uZXN0ZWRTdGVwcz8uWzBdIGFzIENvbmRpdGlvblN0ZXBDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICBzdGVwID0gKG5lc3RlZENvbmRpdGlvbiAmJiB0aGlzLmlzQ29uZGl0aW9uU3RlcChuZXN0ZWRDb25kaXRpb24pKVxuICAgICAgICA/IG5lc3RlZENvbmRpdGlvblxuICAgICAgICA6ICh7IC4uLnRoaXMuY29uZmlnLCBpZDogYnJhbmNoLmlkICE9IG51bGwgPyBTdHJpbmcoYnJhbmNoLmlkKSA6IHRoaXMuY29uZmlnLmlkIH0gYXMgVGVzdENhc2VTdGVwQ29uZmlnKTtcbiAgICAgIC8vIERpc3BsYXkgaW5kZXg6IGdldEJyYW5jaERpc3BsYXlOdW1iZXIoMSk9OTMgLT4gaW5kZXggOTIgZm9yIFwiRWRpdCBTdGVwIDkzXCJcbiAgICAgIGNvbnN0IGRpc3BsYXlOdW0gPSB0aGlzLmdldEJyYW5jaERpc3BsYXlOdW1iZXIoYnJhbmNoSW5kZXgpO1xuICAgICAgaW5kZXggPSB0eXBlb2YgZGlzcGxheU51bSA9PT0gJ251bWJlcicgPyBkaXNwbGF5TnVtIC0gMSA6ICh0eXBlb2YgZGlzcGxheU51bSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChTdHJpbmcoZGlzcGxheU51bSksIDEwKSAtIDEgOiAwKTtcbiAgICB9IGVsc2UgaWYgKGlzQ3JlYXRlTW9kZSkge1xuICAgICAgLy8gQ3JlYXRlIG1vZGUgKG5ldyBFTFNFIElGIGJyYW5jaCkgLSBkb24ndCBzZXQgaW5kZXggc28gbW9kYWwgc2hvd3MgXCJDcmVhdGUgU3RlcFwiXG4gICAgICBzdGVwID0gdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnO1xuICAgICAgaW5kZXggPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1haW4gc3RlcCByb3csIElGIGJyYW5jaFxuICAgICAgaW5kZXggPSB0eXBlb2YgdGhpcy5pbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLmluZGV4XG4gICAgICAgIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKSk7XG4gICAgICBzdGVwID0gdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnO1xuICAgIH1cbiAgICBjb25zdCBwYXlsb2FkOiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg/OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnk7IGlzQ3JlYXRlTW9kZT86IGJvb2xlYW47IGNyZWF0ZU1vZGVCcmFuY2hEYXRhPzogYW55IH0gPSB7XG4gICAgICBzdGVwLFxuICAgICAgaW5kZXg6IGluZGV4ICE9PSB1bmRlZmluZWQgPyAoaXNOYU4oaW5kZXgpID8gMCA6IE1hdGgubWF4KDAsIGluZGV4KSkgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBpZiAodGVtcGxhdGVPdmVycmlkZSkge1xuICAgICAgcGF5bG9hZC50ZW1wbGF0ZU92ZXJyaWRlID0gdGVtcGxhdGVPdmVycmlkZTtcbiAgICB9XG4gICAgaWYgKGlzQ3JlYXRlTW9kZSAmJiBlbHNlSWZCcmFuY2gpIHtcbiAgICAgIHBheWxvYWQuaXNDcmVhdGVNb2RlID0gdHJ1ZTtcbiAgICAgIC8vIFBhc3MgdGVtcGxhdGUgdmFyaWFibGVzIGZvcm0gZGF0YSBmb3IgY3JlYXRlIG1vZGVcbiAgICAgIGlmIChlbHNlSWZCcmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIGVsc2VJZkJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICAgIHBheWxvYWQuY3JlYXRlTW9kZUJyYW5jaERhdGEgPSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBlbHNlSWZCcmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLFxuICAgICAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IGVsc2VJZkJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBjb25kaXRpb24gc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICBvbkR1cGxpY2F0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KCk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChjaGVja2VkKTtcbiAgfVxuXG4gIG9uTW9yZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gIH1cblxuICBvblZpZXdEZXRhaWxzKGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRlc2NyaXB0aW9uIHx8IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMudmlld0RldGFpbHMuZW1pdCh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aXRsZTogJ0lGIC8gRUxTRSBTdGVwIERldGFpbHMnLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgYSB0ZW1wbGF0ZSB2YXJpYWJsZSAqL1xuICBnZXRTZWxlY3RDb25maWdGb3JWYXJpYWJsZSh2YXJpYWJsZTogYW55LCBicmFuY2hJZE9ySXNFbHNlOiBzdHJpbmcgfCBib29sZWFuID0gZmFsc2UpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG5cbiAgICAvLyBJZiBicmFuY2hJZE9ySXNFbHNlIGlzIGEgc3RyaW5nLCBpdCdzIGEgYnJhbmNoIElEOyBvdGhlcndpc2UgaXQncyBhIGJvb2xlYW4gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBsZXQgZm9ybTogRm9ybUdyb3VwO1xuICAgIGlmICh0eXBlb2YgYnJhbmNoSWRPcklzRWxzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IHRoaXMuZWxzZUlmQnJhbmNoZXMuZmluZChiID0+IGIuaWQgPT09IGJyYW5jaElkT3JJc0Vsc2UpO1xuICAgICAgZm9ybSA9IGJyYW5jaD8udGVtcGxhdGVWYXJpYWJsZXNGb3JtIHx8IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtID0gYnJhbmNoSWRPcklzRWxzZSA/ICh0aGlzLmVsc2VJZkJyYW5jaGVzWzBdPy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gfHwgdGhpcy5mYi5ncm91cCh7fSkpIDogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdmFyaWFibGUubmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZm9ybSAmJiBmb3JtLmdldCh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICAgIGZvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IFtjbGFzc109XCInY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXSAnICsgKGlzTmVzdGVkID8gJyBjcWEtcGwtWzI0cHhdJyA6ICcnKVwiPlxuICA8IS0tIElubGluZSBFZGl0IE1vZGU6IHNob3duIGluIGZpcnN0IGJyYW5jaCByb3cgYmVsb3cgd2hlbiB1c2VyIGNsaWNrcyBFZGl0IGZyb20gYnJhbmNoIHJvdyAodG9wIGJsb2NrIGhpZGRlbikgLS0+XG4gIDxkaXYgKm5nSWY9XCJmYWxzZSAmJiBpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDwhLS0gRmlyc3QgUm93OiBDT05ESVRJT04gdGFnLCBhdXRvY29tcGxldGUsIElGL0VMU0UgaW5kaWNhdG9ycywgRWRpdCBJbiBkZXB0aCwgQ2FuY2VsL0FwcGx5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgICA8IS0tIENPTkRJVElPTiBUYWcgKG9yYW5nZSkgLS0+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bI0VBNTgwQ10gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkZFREQ1XVwiPlxuICAgICAgICAgIENPTkRJVElPTlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBGaXJzdCBmaWVsZDogbGVmdCBvcGVyYW5kIChlLmcuIFVzZXJ0eXBlKSAtIGF1dG9jb21wbGV0ZSB3aXRoIElGX0NPTkRJVElPTiBuYXR1cmFsIHRleHQgYWN0aW9ucyAtLT5cbiAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJjb25kaXRpb25MZWZ0QXV0b2NvbXBsZXRlT3B0aW9uc1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvbkxlZnREaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2NvbmRpdGlvbkxlZnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAob3B0aW9uU2VsZWN0KT1cIm9uQ29uZGl0aW9uTGVmdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDb25kaXRpb25cIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgIDwhLS0gU2Vjb25kIFJvdzogVGVtcGxhdGUgVmFyaWFibGVzIFNlY3Rpb24gKHNob3duIHdoZW4gdGVtcGxhdGUgaXMgc2VsZWN0ZWQsIGlubGluZSBiZWZvcmUgRWRpdCBJbiBkZXB0aCkgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlICYmIHRlbXBsYXRlVmFyaWFibGVzICYmIHRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtZmxleC13cmFwIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIHRlbXBsYXRlVmFyaWFibGVzXCI+XG4gICAgICAgICAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gTm9uLWJvb2xlYW4gdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnXCI+XG4gICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gZm9yIHNlbGVjdCB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFxuICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlLCBmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPCEtLSBUZXh0IElucHV0IGZvciBvdGhlciB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAndHlwZScgJiYgdmFyaWFibGUubmFtZSAhPT0gJ3Njcm9sbFRvJyAmJiAhdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciAnICsgdmFyaWFibGUubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIElGIC8gRUxTRSBpbmRpY2F0b3JzIC0tPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjRENGQ0U3XSBjcWEtdGV4dC1bIzAwODIzNl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNCOUY4Q0ZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNi42NjYzNCAyTDIuOTk5NjcgNS42NjY2N0wxLjMzMzAxIDRcIiBzdHJva2U9XCIjMDA4MjM2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICAgIElGXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBBZGQgRUxTRSBJRiBidXR0b24gLSBkaXNhYmxlZCB3aGVuIEVMU0UgYWxyZWFkeSBleGlzdHMgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib25BZGRFbHNlKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNjBdPVwiaGFzRWxzZUJyYW5jaFwiPlxuICAgICAgICAgIEFkZCBFTFNFIElGXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIEFkZCBFbHNlIGJ1dHRvbiAtIGRpc2FibGVkIHdoZW4gRUxTRSBhbHJlYWR5IGV4aXN0cyAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZEVsc2VCcmFuY2goKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0Vsc2VCcmFuY2hcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLXBvaW50ZXJdPVwiIWhhc0Vsc2VCcmFuY2hcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cImhhc0Vsc2VCcmFuY2hcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS02MF09XCJoYXNFbHNlQnJhbmNoXCI+XG4gICAgICAgICAgQWRkIEVMU0VcbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPlxuICAgICAgICA8L2E+ICAgICAgXG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQ2FuY2VsIC8gQXBwbHkgYnV0dG9ucyAtIHNob3duIG9uIElGIHJvdyB3aGVuIG5vIEVMU0UgSUYgYnJhbmNoZXMgYXJlIHByZXNlbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZWxzZUlmQnJhbmNoZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCIgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIFxuICA8L2Rpdj5cblxuICA8IS0tIFN0ZXAgcm93OiBhbHdheXMgdmlzaWJsZSAobm8gdGVtcGxhdGUgZWRpdCBoZXJlOyB0ZW1wbGF0ZSBlZGl0IG9ubHkgaW4gYnJhbmNoIHJvdyBiZWxvdykuIEhhcyBlZGl0L2RlbGV0ZS4gLS0+XG4gIDxkaXYgW2NsYXNzXT1cIidzdGVwLXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMiBjcWEtcHgtNCAnICsgKGlzSW5zaWRlTG9vcCAmJiBpc0luc2lkZVN0ZXBHcm91cCA/ICdjcWEtcGwtMjAgY3FhLXByLTQnIDogKGlzSW5zaWRlTG9vcCB8fCBpc0luc2lkZVN0ZXBHcm91cCkgPyAnY3FhLXBsLTEwIGNxYS1wci00JyA6ICcnKVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUI7XCI+XG4gICAgPCEtLSBDaGVja2JveC9EcmFnIEhhbmRsZSBjb2x1bW4gLSBzYW1lIHN0cnVjdHVyZSBhcyBub3JtYWwtc3RlcCBmb3IgYWxpZ25tZW50IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXIgJiYgIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gaGlkZSBmb3Igc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCJlZGl0YWJsZSAmJiAhaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1jb25kaXRpb25cIiAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRleHQtd2hpdGUgY3FhLXRvcC0xLzIgY3FhLWxlZnQtMS8yIGNxYS0tdHJhbnNsYXRlLXgtMS8yIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTBdPVwiIXNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTEwMF09XCJzZWxlY3RlZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTIgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwIDMuMTI1TDQuNSA4LjYyNUwyIDYuMTI1XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF1cIj57eyBzdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIEljb24gLS0+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiIGNsYXNzPVwiY3FhLXAtMFwiPlxuICAgICAgPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgMTBMOCA2TDQgMTBcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBJRi9FTFNFIEljb24gLS0+XG4gICAgPGRpdj48c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk00IDJWMTBcIiBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xMiA2QzEzLjEwNDYgNiAxNCA1LjEwNDU3IDE0IDRDMTQgMi44OTU0MyAxMy4xMDQ2IDIgMTIgMkMxMC44OTU0IDIgMTAgMi44OTU0MyAxMCA0QzEwIDUuMTA0NTcgMTAuODk1NCA2IDEyIDZaXCJcbiAgICAgICAgICBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk00IDE0QzUuMTA0NTcgMTQgNiAxMy4xMDQ2IDYgMTJDNiAxMC44OTU0IDUuMTA0NTcgMTAgNCAxMEMyLjg5NTQzIDEwIDIgMTAuODk1NCAyIDEyQzIgMTMuMTA0NiAyLjg5NTQzIDE0IDQgMTRaXCJcbiAgICAgICAgICBzdHJva2U9XCIjN0IzMzA2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgNkMxMiA3LjU5MTMgMTEuMzY3OSA5LjExNzQyIDEwLjI0MjYgMTAuMjQyNkM5LjExNzQyIDExLjM2NzkgNy41OTEzIDEyIDYgMTJcIiBzdHJva2U9XCIjN0IzMzA2XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPjwvZGl2PlxuXG4gICAgPCEtLSBJRi9FTFNFIExhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM3QjMzMDZdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1ub25lXCI+XG4gICAgICBDT05ESVRJT05cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIFN0ZXAgcm93OiByZWFkLW9ubHkgKGNvbmRpdGlvbiwgc3VtbWFyeSwgYWN0aW9ucykgd2hlbiBub3QgZWRpdGluZyBzdGVwIHJvdyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdENvbnRleHQgIT09ICdzdGVwUm93J1wiPlxuICAgICAgPCEtLSBGaXJzdCBjb25kaXRpb24gdGV4dCBhcyBwbGFpbiB0ZXh0IChubyBIVE1MKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJnZXRDb25kaXRpb25QbGFpblRleHQoKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLTIgY3FhLWZsZXgtMSBjcWEtZmxleC13cmFwIGNxYS1weC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRydW5jYXRlXCI+e3sgZ2V0Q29uZGl0aW9uUGxhaW5UZXh0KCkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1tbC1hdXRvIGNxYS1mbGV4LXdyYXAgY3FhLXB4LTFcIj5cbiAgICAgICAgPCEtLSBCcmFuY2ggdHlwZSBiYWRnZXM6IElGLCBFTFNFIElGICh3aXRoIGNvdW50KSwgRUxTRSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2YgZ2V0QnJhbmNoVHlwZUJhZGdlcygpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCInY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gJyArIGJhZGdlLmJhZGdlQ2xhc3NcIj5cbiAgICAgICAgICAgIHt7IGJhZGdlLmxhYmVsIH19XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmFkZ2UuY291bnRcIj4re3sgYmFkZ2UuY291bnQgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICAgIHt7IGdldFN0ZXBzU3VtbWFyeSgpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSAqbmdJZj1cImNvbmZpZy5kZXNjcmlwdGlvbiAmJiBjb25maWcuZGVzY3JpcHRpb24udHJpbSgpICE9PSAnJ1wiICN2aWV3RGV0YWlsc1RyaWdnZXIgaHJlZj1cIiNcIiAoY2xpY2spPVwib25WaWV3RGV0YWlscygkZXZlbnQpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW5vLXVuZGVybGluZVwiPlZpZXcgRGV0YWlsczxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPjwvYT5cbiAgICAgICAgPCEtLSBDb3B5IGJ1dHRvbiBoaWRkZW4gZm9yIG5vdyAtLT5cbiAgICAgICAgPCEtLSBDcmVhdGVkIERhdGUgKGZyb20gQVBJKSAtIGxhc3Qgc28gYWxpZ25lZCBhY3Jvc3MgYWxsIHN0ZXBzLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5jcmVhdGVkRGF0ZVwiIGNsYXNzPVwic3RlcC1kYXRlIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1tbC1hdXRvIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAge3sgY29uZmlnLmNyZWF0ZWREYXRlIHwgZGF0ZTonZCBNTU0geXl5eScgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN0ZXAgcm93OiBlZGl0IG1vZGUgKENPTkRJVElPTiwgYXV0b2NvbXBsZXRlLCBJRiwgQWRkIEVMU0UgSUYsIEFkZCBFTFNFLCBFZGl0IEluIGRlcHRoLCBDYW5jZWwsIEFwcGx5KSB3aGVuIGVkaXRDb250ZXh0ID09PSAnc3RlcFJvdycgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRDb250ZXh0ID09PSAnc3RlcFJvdydcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1mbGV4LXdyYXAgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LVsjRUE1ODBDXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctWyNGRkVERDVdXCI+Q09ORElUSU9OPC9zcGFuPlxuICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtvcHRpb25zXT1cImNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uTGVmdERpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnY29uZGl0aW9uTGVmdCcsICRldmVudClcIlxuICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25MZWZ0U2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IENvbmRpdGlvblwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1hdXRvY29tcGxldGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNEQ0ZDRTddIGNxYS10ZXh0LVsjMDA4MjM2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0I5RjhDRl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPklGPC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlKClcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1jdXJzb3ItcG9pbnRlclwiPkFkZCBFTFNFIElGPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkFkZEVsc2VCcmFuY2goKVwiIFtkaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiIFtjbGFzcy5jcWEtY3Vyc29yLXBvaW50ZXJdPVwiIWhhc0Vsc2VCcmFuY2hcIiBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1vcGFjaXR5LTYwXT1cImhhc0Vsc2VCcmFuY2hcIj5BZGQgRUxTRTwvYnV0dG9uPlxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5FZGl0IEluIGRlcHRoPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFTFNFIElGIFNlY3Rpb25zIGluIEVkaXQgTW9kZSAtIHNob3duIGJlbG93IHN0ZXAgcm93IHdoZW4gZWRpdGluZyBhbmQgaGFzIEVMU0UgSUYgYnJhbmNoZXMgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5jaCBvZiBlbHNlSWZCcmFuY2hlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiPlxuICAgICAgPCEtLSBGaXJzdCBSb3c6IFJlbW92ZSBFTFNFIElGIGJ1dHRvbiwgYXV0b2NvbXBsZXRlLCBFZGl0IEluIGRlcHRoLCBDYW5jZWwvQXBwbHkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgICAgIDwhLS0gUmVtb3ZlIEVMU0UgSUYgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlRWxzZShicmFuY2guaWQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjOTlBMUFGXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1bI0U1RTdFQl0gY3FhLXRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICBSZW1vdmUgRUxTRSBJRlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBFTFNFIElGIGF1dG9jb21wbGV0ZSBmaWVsZDogc2FtZSBhcyBJRiBjb25kaXRpb24gLS0+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiYnJhbmNoLmZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImJyYW5jaC5mb3JtLmdldCgnY29uZGl0aW9uTGVmdCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiYnJhbmNoLmZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkVsc2VDb25kaXRpb25MZWZ0U2VsZWN0KCRldmVudCwgYnJhbmNoLmlkKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjb21wYWN0XT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gU2Vjb25kIFJvdzogRUxTRSBJRiBUZW1wbGF0ZSBWYXJpYWJsZXMgU2VjdGlvbiAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCwgaW5saW5lIGJlZm9yZSBFZGl0IEluIGRlcHRoKSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnJhbmNoLnNlbGVjdGVkVGVtcGxhdGUgJiYgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBOb24tYm9vbGVhbiB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbicgJiYgdmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGUsIGJyYW5jaC5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ3R5cGUnICYmIHZhcmlhYmxlLm5hbWUgIT09ICdzY3JvbGxUbycgJiYgIXZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidmFyaWFibGUubGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEVkaXQgSW4gZGVwdGggbGluayAtLT5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKHVuZGVmaW5lZCwgZ2V0QnJhbmNoQnlJZChicmFuY2guaWQpLCBnZXRCcmFuY2hJbmRleEJ5SWQoYnJhbmNoLmlkKSk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgICAgICBFZGl0IEluIGRlcHRoXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IGJ1dHRvbnMgLSBzaG93biBpbiBsYXN0IEVMU0UgSUYgcm93IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA9PT0gZWxzZUlmQnJhbmNoZXMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBCcmFuY2hlcyAoc2hvd24gd2hlbiBleHBhbmRlZCBvciB3aGVuIGVkaXRpbmcgc28gZWRpdCBVSSBhcHBlYXJzIGluIGZpcnN0IGJyYW5jaCByb3cpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWQgfHwgaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8IS0tIEJyYW5jaGVzIChJRiBUUlVFLCBFTFNFIElGLCBFTFNFKSAtLT5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgYnJhbmNoZXM7IGxldCBicmFuY2hJbmRleCA9IGluZGV4XCIgY2xhc3M9XCJjb25kaXRpb24tYnJhbmNoLXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbYXR0ci5kYXRhLWJyYW5jaC1pZF09XCJicmFuY2g/LmlkXCI+XG4gICAgICA8IS0tIEVkaXQgbW9kZSAoSUYgVFJVRSBicmFuY2gpOiBzaG93cyBDT05ESVRJT04sIGF1dG9jb21wbGV0ZSwgSUYsIEFkZCBFTFNFIElGLCBBZGQgRUxTRSwgRWRpdCBJbiBkZXB0aCwgRWRpdC9EZWxldGUsIENhbmNlbC9BcHBseSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlZGl0Q29udGV4dCA9PT0gJ2JyYW5jaFJvdycgJiYgYnJhbmNoSW5kZXggPT09IDAgJiYgZWRpdGluZ0JyYW5jaEluZGV4ID09PSAwXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW2NsYXNzXT1cIidjcWEtcHgtMSBjcWEtcHktMi41IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwICcgKyBnZXRCcmFuY2hUZXh0Q29sb3IoYnJhbmNoKSArICcgJyArIGdldEJyYW5jaENvbG9yQ2xhc3MoYnJhbmNoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3JvdyBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdIGNxYS1mbGV4LXNocmluay0wXCI+e3sgZ2V0QnJhbmNoRGlzcGxheU51bWJlcihicmFuY2hJbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyNFQTU4MENdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy1bI0ZGRURENV1cIj5DT05ESVRJT048L3NwYW4+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvbkxlZnREaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnY29uZGl0aW9uTGVmdCcsICRldmVudClcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkNvbmRpdGlvbkxlZnRTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjRENGQ0U3XSBjcWEtdGV4dC1bIzAwODIzNl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNCOUY4Q0ZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5JRjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWN1cnNvci1wb2ludGVyXCI+QWRkIEVMU0UgSUY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlQnJhbmNoKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiIFtjbGFzcy5jcWEtY3Vyc29yLXBvaW50ZXJdPVwiIWhhc0Vsc2VCcmFuY2hcIiBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1vcGFjaXR5LTYwXT1cImhhc0Vsc2VCcmFuY2hcIj5BZGQgRUxTRTwvYnV0dG9uPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgodW5kZWZpbmVkLCBicmFuY2gsIDApOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+RWRpdCBJbiBkZXB0aDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPjwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEVkaXQgbW9kZSAoRUxTRSBJRiBicmFuY2gpOiBzaG93cyBDT05ESVRJT04sIGF1dG9jb21wbGV0ZSwgQWRkIEVMU0UgSUYgLyBBZGQgRUxTRSwgRWRpdCBJbiBkZXB0aCwgQ2FuY2VsL0FwcGx5IC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImVkaXRDb250ZXh0ID09PSAnYnJhbmNoUm93JyAmJiBicmFuY2hJbmRleCA9PT0gZWRpdGluZ0JyYW5jaEluZGV4ICYmIGJyYW5jaC50eXBlID09PSAnZWxzZS1pZidcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICBbY2xhc3NdPVwiJ2NxYS1weC0xIGNxYS1weS0yLjUgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1mbGV4LXdyYXAgJyArIGdldEJyYW5jaFRleHRDb2xvcihicmFuY2gpICsgJyAnICsgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2gpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93IGNxYS1mbGV4LXdyYXAgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj57eyBnZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj57eyBnZXRCcmFuY2hMYWJlbChicmFuY2gpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bI0VBNTgwQ10gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkZFREQ1XVwiPkNPTkRJVElPTjwvc3Bhbj5cbiAgICAgICAgICA8IS0tIEVMU0UgSUYgY29uZGl0aW9uIGF1dG9jb21wbGV0ZTogc2FtZSBvcHRpb25zIGFuZCB2YWx1ZSBtb2RlbCBhcyBJRiwgYnV0IGluaXRpYWxpemVkIGZyb20gdGhpcyBicmFuY2gncyBjb25kaXRpb24gLS0+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvbkxlZnREaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnY29uZGl0aW9uTGVmdCcsICRldmVudClcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkNvbmRpdGlvbkxlZnRTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWN1cnNvci1wb2ludGVyXCI+QWRkIEVMU0UgSUY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlQnJhbmNoKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiIFtjbGFzcy5jcWEtY3Vyc29yLXBvaW50ZXJdPVwiIWhhc0Vsc2VCcmFuY2hcIiBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1vcGFjaXR5LTYwXT1cImhhc0Vsc2VCcmFuY2hcIj5BZGQgRUxTRTwvYnV0dG9uPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgodW5kZWZpbmVkLCBicmFuY2gsIGJyYW5jaEluZGV4KTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPkVkaXQgSW4gZGVwdGg8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBCcmFuY2ggSGVhZGVyIChyZWFkLW9ubHkpOiBkaXNwbGF5IHdoZW4gbm90IGVkaXRpbmcgdGhpcyBicmFuY2ggcm93IC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImVkaXRDb250ZXh0ICE9PSAnYnJhbmNoUm93JyB8fCBicmFuY2hJbmRleCAhPT0gZWRpdGluZ0JyYW5jaEluZGV4XCJcbiAgICAgICAgW2NsYXNzXT1cIidjcWEtcHgtNCBjcWEtcHktMiBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1qdXN0aWZ5LWJldHdlZW4gJyArIGdldEJyYW5jaFRleHRDb2xvcihicmFuY2gpICsgJyAnICsgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2gpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtZmxleC1ncm93IGNxYS1mbGV4LXdyYXAgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj57eyBnZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj57eyBnZXRCcmFuY2hMYWJlbChicmFuY2gpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QnJhbmNoQ29uZGl0aW9uRGlzcGxheShicmFuY2gpXCIgW2lubmVySFRNTF09XCJnZXRCcmFuY2hDb25kaXRpb25EaXNwbGF5KGJyYW5jaClcIiAoY2xpY2spPVwib25Db25kaXRpb25BY3Rpb25DbGljaygkZXZlbnQsIGJyYW5jaClcIiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1hY3Rpb24tZm9ybWF0XCI+PC9zcGFuPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRCcmFuY2hFdmVudERldGFpbHNGb3JEaXNwbGF5KGJyYW5jaCkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheShicmFuY2gpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkNvbmRpdGlvbkFjdGlvbkNsaWNrKCRldmVudCwgYnJhbmNoKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF1cIj57eyBpdGVtLmtleSB9fTo8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRWRpdCBvbiBmaXJzdCBicmFuY2ggKElGIFRSVUUpIGFuZCBFTFNFIElGOyBEZWxldGUgb24gZmlyc3QgPSB3aG9sZSBzdGVwLCBvbiBFTFNFIElGL0VMU0UgPSB0aGF0IGJyYW5jaCBvbmx5IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGFibGUgJiYgIWlzSW5zaWRlU3RlcEdyb3VwICYmICFpc1Jlb3JkZXJcIiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYnJhbmNoSW5kZXggPT09IDAgfHwgYnJhbmNoLnR5cGUgPT09ICdlbHNlLWlmJ1wiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FZGl0RnJvbUJyYW5jaFJvdyhicmFuY2hJbmRleCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRWRpdFwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTcgMTEuNjY2NkgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk05LjU1MjA4IDIuMTEyOEM5Ljc4NDMgMS44ODA1OCAxMC4wOTkzIDEuNzUwMTIgMTAuNDI3NyAxLjc1MDEyQzEwLjc1NjEgMS43NTAxMiAxMS4wNzEgMS44ODA1OCAxMS4zMDMzIDIuMTEyOEMxMS41MzU1IDIuMzQ1MDIgMTEuNjY1OSAyLjY1OTk4IDExLjY2NTkgMi45ODgzOEMxMS42NjU5IDMuMzE2NzkgMTEuNTM1NSAzLjYzMTc1IDExLjMwMzMgMy44NjM5N0w0LjI5NzQyIDEwLjg3MDRDNC4xNTg2NCAxMS4wMDkyIDMuOTg3MSAxMS4xMTA3IDMuNzk4NjcgMTEuMTY1NkwyLjEyMzMzIDExLjY1NDRDMi4wNzMxNCAxMS42NjkgMi4wMTk5MyAxMS42Njk5IDEuOTY5MjggMTEuNjU2OUMxLjkxODYzIDExLjY0MzkgMS44NzI0IDExLjYxNzYgMS44MzU0MyAxMS41ODA2QzEuNzk4NDYgMTEuNTQzNyAxLjc3MjEgMTEuNDk3NCAxLjc1OTEzIDExLjQ0NjhDMS43NDYxNSAxMS4zOTYxIDEuNzQ3MDMgMTEuMzQyOSAxLjc2MTY3IDExLjI5MjdMMi4yNTA1IDkuNjE3MzhDMi4zMDU0NiA5LjQyOTE2IDIuNDA2OTggOS4yNTc4MyAyLjU0NTY3IDkuMTE5MjJMOS41NTIwOCAyLjExMjhaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYnJhbmNoSW5kZXggPT09IDAgPyBvbkRlbGV0ZSgpIDogb25EZWxldGVCcmFuY2goYnJhbmNoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJ7eyBicmFuY2hJbmRleCA9PT0gMCA/ICdEZWxldGUgc3RlcCcgOiAnRGVsZXRlIGJyYW5jaCcgfX1cIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyNmZjY0NjddIGhvdmVyOmNxYS10ZXh0LVsjQzYzNTM1XVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xLjc1IDMuNUgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk0xMS4wODI3IDMuNVYxMS42NjY3QzExLjA4MjcgMTIuMjUgMTAuNDk5MyAxMi44MzMzIDkuOTE2MDIgMTIuODMzM0g0LjA4MjY4QzMuNDk5MzUgMTIuODMzMyAyLjkxNjAyIDEyLjI1IDIuOTE2MDIgMTEuNjY2N1YzLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC42NjYwMiAzLjQ5OTk2VjIuMzMzMjlDNC42NjYwMiAxLjc0OTk2IDUuMjQ5MzUgMS4xNjY2MyA1LjgzMjY4IDEuMTY2NjNIOC4xNjYwMkM4Ljc0OTM1IDEuMTY2NjMgOS4zMzI2OCAxLjc0OTk2IDkuMzMyNjggMi4zMzMyOVYzLjQ5OTk2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTUuODMzOTggNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTguMTY2MDIgNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QnJhbmNoQ3JlYXRlZERhdGUoYnJhbmNoKVwiIGNsYXNzPVwic3RlcC1kYXRlIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1tbC1hdXRvXCI+e3sgZ2V0QnJhbmNoQ3JlYXRlZERhdGUoYnJhbmNoKSB8IGRhdGU6J2QgTU1NIHl5eXknIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU1RBUlQgbWFya2VyIHBlciBicmFuY2g6IFNUQVJUIElGLCBTVEFSVCBFTFNFIElGLCBvciBTVEFSVCBFTFNFIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00XCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyM3QjMzMDZdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjN0IzMzA2XSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRTdGFydEJyYW5jaExhYmVsKGJyYW5jaCkgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjN0IzMzA2XSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJyYW5jaCBDb250ZW50IChOZXN0ZWQgU3RlcHMg4oCTIHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2YgYnJhbmNoLm5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgICBbaW5kZXhdPVwiaVwiXG4gICAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICAgIFticmFuY2hdPVwiYnJhbmNoXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lzSW5zaWRlU3RlcEdyb3VwXT1cImlzSW5zaWRlU3RlcEdyb3VwXCJcbiAgICAgICAgICBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZWRpdGFibGVdPVwiZWRpdGFibGVcIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXAsICRldmVudC5zdGVwSW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcEZvckJyYW5jaCk9XCJvbkFkZFN0ZXAoJGV2ZW50LmJyYW5jaClcIlxuICAgICAgICAgIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wKCRldmVudCwgYnJhbmNoKVwiXG4gICAgICAgICAgKGRlbGV0ZVN0ZXBXaXRoQnJhbmNoKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQuYnJhbmNoLCAkZXZlbnQuc3RlcEluZGV4KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRPcGVuRXh0ZXJuYWwoJGV2ZW50KVwiXG4gICAgICAgICAgKGVkaXQpPVwib25OZXN0ZWRFZGl0KCRldmVudClcIlxuICAgICAgICAgIChsaW5rKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIlxuICAgICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCkpOyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQpOyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoc3RlcFVwZGF0ZSk9XCJzdGVwVXBkYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImJyYW5jaC5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgPyA1MiA6IG51bGxcIlxuICAgICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQsIGJyYW5jaClcIj5cbiAgICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgYnJhbmNoLm5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgICBbaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaXNJbnNpZGVTdGVwR3JvdXBdPVwiaXNJbnNpZGVTdGVwR3JvdXBcIlxuICAgICAgICAgICAgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgW2VkaXRhYmxlXT1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25CcmFuY2hTdGVwQ2hhbmdlKCRldmVudC5icmFuY2gsICRldmVudC5zdGVwLCAkZXZlbnQuc3RlcEluZGV4KVwiXG4gICAgICAgICAgICAoYWRkU3RlcEZvckJyYW5jaCk9XCJvbkFkZFN0ZXAoJGV2ZW50LmJyYW5jaClcIlxuICAgICAgICAgICAgKGFkZFN0ZXBGb3JMb29wKT1cIm9uQWRkU3RlcEZvckxvb3AoJGV2ZW50LCBicmFuY2gpXCJcbiAgICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZE9wZW5FeHRlcm5hbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsaW5rKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiXG4gICAgICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50KTsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc3RlcFVwZGF0ZSk9XCJzdGVwVXBkYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFbXB0eSBicmFuY2ggKElGIC8gRUxTRSBJRiAvIEVMU0UpOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIG5vIHN0ZXBzLCBzYW1lIGFzIGxvb3Agc3RlcC5cbiAgICAgICAgICAgV2hlbiByZW5kZXJlZCBpbnNpZGUgYSBzdGVwIGdyb3VwIG9yIHdoZW4gcmVvcmRlcmluZywgaGlkZSB0aGlzIEFkZCBidXR0b24gZW50aXJlbHkuIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImJyYW5jaC5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgJiYgZWRpdGFibGUgJiYgIWlzSW5zaWRlU3RlcEdyb3VwICYmICFpc1Jlb3JkZXJcIiBjbGFzcz1cImNvbmRpdGlvbi1icmFuY2gtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRTdGVwKGJyYW5jaCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2F0dHIudGl0bGVdPVwiJ0FkZCBzdGVwIHRvICcgKyBnZXRCcmFuY2hMYWJlbChicmFuY2gpXCJcbiAgICAgICAgICBjbGFzcz1cImNvbmRpdGlvbi1icmFuY2gtZW1wdHktYWRkXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVORCBtYXJrZXIgcGVyIGJyYW5jaDogRU5EIElGLCBFTkQgRUxTRSBJRiwgb3IgRU5EIEVMU0UgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTEgY3FhLXB4LTRcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzdCMzMwNl0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM3QjMzMDZdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPnt7IGdldEVuZEJyYW5jaExhYmVsKGJyYW5jaCkgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjN0IzMzA2XSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gRU5EIENPTkRJVElPTjogZmluYWwgbWFya2VyIGFmdGVyIGFsbCBicmFuY2hlcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTEgY3FhLXB4LTRcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyM3QjMzMDZdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzdCMzMwNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+RU5EIENPTkRJVElPTjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjN0IzMzA2XSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9jb25kaXRpb24tc3RlcC9jb25kaXRpb24tc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2NvbmRpdGlvbi1zdGVwL2NvbmRpdGlvbi1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXdDLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sNkJBQTZCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5QnJDLENBQUM7QUFVRixNQUFNLE9BQU8sOEJBQThCO0lBOEh6QyxZQUNVLEVBQWUsRUFDZixHQUFzQjtRQUR0QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF6SHZCLGFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsNENBQTRDO1FBQ25DLHVCQUFrQixHQUFVLEVBQUUsQ0FBQztRQUN4QyxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsNERBQTREO1FBQ25ELDhCQUF5QixHQUFVLEVBQUUsQ0FBQztRQUMvQyxpRkFBaUY7UUFDeEUsa0NBQTZCLEdBQTZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM1RSx3REFBd0Q7UUFDL0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHdEQUF3RDtRQUMvQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDOUMsNEdBQTRHO1FBQ25HLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRXpDLHVIQUF1SDtRQUN2SCxnQkFBVyxHQUFtQyxJQUFJLENBQUM7UUFFbkQsc0dBQXNHO1FBQ3RHLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQU8vQiw2Q0FBNkM7UUFDN0MsbUJBQWMsR0FPVCxFQUFFLENBQUM7UUFVUixpQ0FBaUM7UUFDekIsaUJBQVksR0FBb0YsRUFBRSxDQUFDO1FBRTNHLHlDQUF5QztRQUN6QyxxQkFBZ0IsR0FBUSxJQUFJLENBQUM7UUFDN0IsMENBQTBDO1FBQzFDLHNCQUFpQixHQUFVLEVBQUUsQ0FBQztRQU1wQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFvRCxDQUFDO1FBQ3RGLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM3QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBNEUsQ0FBQztRQUNoSCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFDcEUsc0ZBQXNGO1FBQzVFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNDLENBQUM7UUFDeEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFrRCxDQUFDO1FBQ2hGLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DLG1IQUFtSDtRQUN6RyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWdELENBQUM7UUFDckYsK0dBQStHO1FBQ3JHLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQStFLENBQUM7UUFDL0csY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUErQyxDQUFDO1FBQ3ZFLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN2QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTRILENBQUM7UUFDM0osa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNkQsQ0FBQztRQUN4RyxxREFBcUQ7UUFDM0MseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1RCxrREFBa0Q7UUFDeEMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMxRCw2RkFBNkY7UUFDbkYsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQzlELDJHQUEyRztRQUNqRyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFtRCxDQUFDO1FBQzVGLHdEQUF3RDtRQUM5Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBMEUsQ0FBQztRQUNqSCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDeEQsNEZBQTRGO1FBQ2xGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWdDLENBQUM7SUF5QnZFLENBQUM7SUEzRkoseUVBQXlFO0lBQ3pFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQWlFRCxTQUFTLENBQUMsS0FBbUIsRUFBRSxNQUF1QjtRQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELG9JQUFvSTtJQUNwSSxzQkFBc0IsQ0FBQyxLQUFpQixFQUFFLE1BQXdCO1FBQ2hFLElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUFFLE9BQU87UUFDbkMsTUFBTSxJQUFJLEdBQXVCLE1BQU0sRUFBRSxFQUFFLElBQUksSUFBSTtZQUNqRCxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQXdCO1lBQ2pFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHlIQUF5SDtJQUN6SCxtQkFBbUIsQ0FBQyxPQUF3RDtRQUMxRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQU9ELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNqRixJQUFJLENBQUMsUUFBUSxHQUFJLElBQUksQ0FBQyxNQUFjLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztTQUN4RDtRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQVk7UUFDdEIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFJLElBQUksQ0FBQyxNQUFjLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztZQUN2RCx5RkFBeUY7WUFDekYsbUdBQW1HO1lBQ25HLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2FBQ3hDO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUN0QztZQUNELGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDeEQsMkRBQTJEO1lBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDeEM7WUFDRCwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDeEMsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3ZDLDBGQUEwRjtZQUMxRixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQzthQUM3QztTQUNGO0lBQ0gsQ0FBQztJQUVELHVHQUF1RztJQUMvRixvQ0FBb0M7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQWEsQ0FBQztRQUN4QyxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkgsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FDeEQsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUNoRixDQUFDO1lBQ0YsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDcEcsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDckUseURBQXlEO29CQUN6RCxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksS0FBSyxXQUFXLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDM0Q7aUJBQ0Y7Z0JBQ0Qsb0VBQW9FO2dCQUNwRSxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQztnQkFDL0QsNENBQTRDO2dCQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO2dCQUNyQyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztpQkFDbkM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsMkVBQTJFO1FBQzNFLElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFDeEMsSUFBSSxZQUFZLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25ILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FDaEYsQ0FBQztZQUNGLElBQUksY0FBYyxFQUFFO2dCQUNsQiwrQ0FBK0M7Z0JBQy9DLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckcsb0VBQW9FO2dCQUNwRSxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQztnQkFDL0QsNENBQTRDO2dCQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO2dCQUNyQyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztpQkFDbkM7YUFDRjtTQUNGO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN2QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1NBQzNCO1FBRUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzVCLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixDQUFDO1lBQ25DLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO1lBQzdCLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUN4QixDQUFDLENBQUM7UUFFSCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBYztRQVF0Qyx5RkFBeUY7UUFDekYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDeEUsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sYUFBYSxHQUFHLFlBQVksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ2pELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDekIsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO1lBQzdCLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUN4QixDQUFDLENBQUM7UUFFSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWhELE9BQU87WUFDTCxFQUFFLEVBQUUsV0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzVDLElBQUk7WUFDSixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLGlCQUFpQixFQUFFLEVBQUU7WUFDckIscUJBQXFCO1lBQ3JCLFFBQVEsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUU7U0FDdEYsQ0FBQztJQUNKLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsTUFBTSxPQUFPLEdBQW1CO1lBQzlCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNsRCxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDbEUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQzFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDdEYsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1NBQy9FLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUc7WUFDMUIsR0FBRyxFQUFFLG1CQUFtQjtZQUN4QixXQUFXLEVBQUUsVUFBVTtZQUN2QixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxpR0FBaUc7SUFDekYsK0JBQStCO1FBQ3JDLDJGQUEyRjtRQUMzRixNQUFNLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNwRixPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHlCQUF5QixHQUFHO1lBQy9CLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLFdBQVcsRUFBRSxrQkFBa0I7WUFDL0IsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLGVBQWU7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBSSxnQ0FBZ0M7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDOUIsMEVBQTBFO1lBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXO2dCQUNsQix3RkFBd0Y7Z0JBQ3hGLDBGQUEwRjtnQkFDMUYsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTTthQUNVLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUkseUJBQXlCO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVyRyx5R0FBeUc7UUFDekcsTUFBTSxxQkFBcUIsR0FDekIsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVE7WUFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLHFCQUFxQixFQUFFO1lBQ3pCLElBQUksVUFBVTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELElBQUksWUFBWSxFQUFFLG1CQUFtQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUUsTUFBTSxFQUFFO1lBQ3ZGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FDaEYsQ0FBQztZQUNGLElBQUksY0FBYyxFQUFFO2dCQUNsQixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3BHLElBQUksV0FBVyxFQUFFO29CQUNmLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssY0FBYyxJQUFJLFVBQVU7d0JBQUUsT0FBTyxjQUFjLENBQUM7b0JBQ3BGLE9BQU8sU0FBUyxDQUFDO2lCQUNsQjthQUNGO1NBQ0Y7UUFDRCxJQUFJLFVBQVU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBa0Q7UUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1RCwrRkFBK0Y7UUFDL0YsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBRXpDLGdHQUFnRztRQUNoRyxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUM1QyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FDeEQsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDWCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3RSxPQUFPLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFLLEdBQUcsQ0FBQyxRQUFnQixDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUMzRyxDQUFDLENBQ0YsQ0FBQztZQUNGLGtGQUFrRjtZQUNsRixZQUFZLEdBQUcsY0FBYyxFQUFFLFFBQVEsSUFBSSxjQUFjLENBQUM7U0FDM0Q7UUFFRCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQzFDLHdDQUF3QztZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1lBRXJDLHFEQUFxRDtZQUNyRCwyRUFBMkU7WUFDM0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXJGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLElBQUksRUFBRSxDQUFDO1lBQ3pDLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsQyxrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5REFBeUQsRUFBRTtnQkFDckUsWUFBWTtnQkFDWixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVM7Z0JBQ3JDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDekIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQ2hDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEQ7WUFDRCxrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtRQUNELCtFQUErRTtRQUMvRSx3R0FBd0c7UUFDeEcsbUdBQW1HO1FBQ25HLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoRixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sMEJBQTBCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0VBQWdFO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztRQUVoRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4Qyx3RUFBd0U7WUFDeEUsSUFBSSxZQUFpQixDQUFDO1lBQ3RCLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlDLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVM7b0JBQ3hDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUNoRixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsb0NBQW9DO1lBQ3BDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO2dCQUNuRSxZQUFZLEdBQUcsWUFBWSxLQUFLLE1BQU0sSUFBSSxZQUFZLEtBQUssR0FBRyxDQUFDO2FBQ2hFO1lBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQseUJBQXlCLENBQUMsTUFBa0QsRUFBRSxRQUFnQjtRQUM1RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUQsK0ZBQStGO1FBQy9GLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUV6QyxnR0FBZ0c7UUFDaEcsSUFBSSxZQUFZLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDNUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FDeEQsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUMxRyxDQUFDO1lBQ0Ysa0ZBQWtGO1lBQ2xGLFlBQVksR0FBRyxjQUFjLEVBQUUsUUFBUSxJQUFJLGNBQWMsQ0FBQztTQUMzRDtRQUVELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDMUMsd0NBQXdDO1lBQ3hDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7WUFDdkMscURBQXFEO1lBQ3JELE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUUsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0wsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUMvQixNQUFNLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUU7Z0JBQ2pDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNsRDtZQUNELGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsdUZBQXVGO1FBQ3ZGLGlGQUFpRjtRQUNqRix3SUFBd0k7UUFDeEksTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEYsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFlBQVksSUFBSSxTQUFTLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RKLENBQUM7SUFFTyw4QkFBOEIsQ0FBQyxNQU90QztRQUNDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUU7WUFDakMsTUFBTSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvRCxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgscUZBQXFGO1FBQ3JGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLHlCQUF5QixJQUFJLEVBQUUsQ0FBQztRQUVwRSxzQ0FBc0M7UUFDdEMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMxQyx3RUFBd0U7WUFDeEUsSUFBSSxZQUFpQixDQUFDO1lBQ3RCLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlDLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVM7b0JBQ3hDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUNoRixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsb0NBQW9DO1lBQ3BDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO2dCQUNuRSxZQUFZLEdBQUcsWUFBWSxLQUFLLE1BQU0sSUFBSSxZQUFZLEtBQUssR0FBRyxDQUFDO2FBQ2hFO1lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNQLGlGQUFpRjtRQUNqRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZUFBZTtRQUNiLDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFnQjtRQUMzQiw4Q0FBOEM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCxzREFBc0Q7SUFDOUMsYUFBYSxDQUFDLElBQVk7UUFDaEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsZ0VBQWdFO1FBQ2hFLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDckIsT0FBTyxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEO3dFQUNvRTtJQUM1RCxjQUFjLENBQUMsQ0FBUztRQUM5QixJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUNoRDtRQUNELDJFQUEyRTtRQUMzRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRyxLQUFLLE1BQU0sRUFBRSxJQUFJLFNBQVMsRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLE9BQU87b0JBQ0wsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDbEMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFO2lCQUM3QyxDQUFDO2FBQ0g7U0FDRjtRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCw4Q0FBOEM7SUFDdEMsc0JBQXNCO1FBQzVCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUUvRCwrREFBK0Q7UUFDL0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixvRUFBb0U7WUFDcEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUV6RSxJQUFJLFdBQVcsRUFBRTtnQkFDZixnREFBZ0Q7Z0JBQ2hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FDakQsQ0FBQztnQkFDRixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFO29CQUNoRCxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDM0M7YUFDRjtpQkFBTTtnQkFDTCwyREFBMkQ7Z0JBQzNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FDOUYsQ0FBQztnQkFDRixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFO29CQUNoRCxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDM0M7YUFDRjtTQUNGO1FBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQscUJBQXFCLENBQUMsV0FBbUIsRUFBRSxLQUFhO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLGVBQWU7UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDL0MsT0FBTyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsUUFBUSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUYsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixtQkFBbUI7UUFDakIsTUFBTSxNQUFNLEdBQTZGLEVBQUUsQ0FBQztRQUM1RyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLHdGQUF3RixFQUFFLENBQUMsQ0FBQztRQUMvSSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDaEQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsVUFBVSxFQUFFLHdGQUF3RjthQUNyRyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsK0VBQStFLEVBQUUsQ0FBQyxDQUFDO1NBQzNJO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxxQkFBcUIsQ0FBQyxZQUFvQixFQUFFO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDckUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUMsb0VBQW9FO1FBQ3BFLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxPQUFPLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELCtEQUErRDtJQUMvRCx5QkFBeUI7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzthQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssYUFBYSxDQUFDO2FBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLEdBQUc7WUFDSCxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELGlJQUFpSTtJQUNqSSwrQkFBK0IsQ0FBQyxNQUF1QjtRQUNyRCxNQUFNLEtBQUssR0FBSSxNQUFjLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUM7YUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsR0FBRztZQUNILEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDMUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQXVCLEVBQUUsSUFBd0IsRUFBRSxTQUFpQjtRQUNyRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCwrR0FBK0c7SUFDL0csb0JBQW9CLENBQUMsT0FBcUM7UUFDeEQsSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQWdFLEVBQUUsTUFBdUIsRUFBRSxJQUF3QixFQUFFLEtBQWE7UUFDdkoseUNBQXlDO1FBQ3pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRTtZQUN0RSxvREFBb0Q7WUFDbkQsSUFBWSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ3hDLHFFQUFxRTtZQUNyRSw0REFBNEQ7WUFDNUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsMEZBQTBGO2dCQUMxRixzR0FBc0c7Z0JBQ3RHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFvQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQzthQUMxRztTQUNGO2FBQU07WUFDTCx1Q0FBdUM7WUFDdEMsSUFBWSxDQUFDLFFBQVEsR0FBRyxLQUFnQixDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUF1QjtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixnQkFBZ0IsQ0FBQyxLQUF5QyxFQUFFLE1BQXVCO1FBQ2pGLDZGQUE2RjtRQUM3Riw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUF1QixFQUFFLFNBQWlCO1FBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELHdHQUF3RztJQUN4RyxZQUFZLENBQUMsS0FBa0Q7UUFDN0QsSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFZLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsdUdBQXVHO0lBQ3ZHLGlCQUFpQixDQUFDLEtBQVUsRUFBRSxJQUF3QjtRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFTLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUF1QjtRQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxVQUErQjtRQUN4RCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDeEIsVUFBVSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDMUI7UUFDRCxNQUFNLFNBQVMsR0FBb0I7WUFDakMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQ3RELEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUM1RCxRQUFRLEVBQUUsU0FBUyxDQUFDLFlBQVk7WUFDaEMsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUNGLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxVQUErQixFQUFFLE9BQW9GO1FBQ2pKLHdFQUF3RTtRQUN4RSxNQUFNLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFFLE9BQXVDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxPQUEyQixDQUFDO1FBQzlKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQ1YsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTztZQUMzRCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUcsT0FBdUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFHLE9BQWUsQ0FBQyxVQUFVLElBQUksYUFBYSxFQUFFO1lBQ3ZILENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUEwQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQXdCO1FBQ25DLE9BQU8sV0FBVyxJQUFJLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXdCO1FBQ2pDLE9BQU8sVUFBVSxJQUFJLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQXdCO1FBQ3RDLE9BQU8sV0FBVyxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFRCxXQUFXLENBQUMsSUFBd0I7UUFDbEMsT0FBTyxXQUFXLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBdUI7UUFDcEMsT0FBTyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVELHVHQUF1RztJQUN2Ryx5QkFBeUIsQ0FBQyxNQUF1QjtRQUMvQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7U0FDN0I7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsbUJBQW1CLENBQUMsTUFBdUI7UUFDekMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDeEcsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxpQkFBaUIsQ0FBQyxNQUF1QjtRQUN2QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUNsRyxDQUFDO0lBRUQsdUhBQXVIO0lBQ3ZILHNCQUFzQixDQUFDLFdBQW1CO1FBQ3hDLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDeEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsYUFBYSxDQUFDLFFBQTBCO1FBQ3RDLElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsMENBQTBDO0lBQzFDLGtCQUFrQixDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsT0FBTyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUF1QjtRQUN6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3hCLE9BQU8sb0JBQW9CLENBQUM7U0FDN0I7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BDLE9BQU8sd0NBQXdDLENBQUM7U0FDakQ7YUFBTTtZQUNMLE9BQU8sa0NBQWtDLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBdUI7UUFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUN4QixPQUFPLG9CQUFvQixDQUFDO1NBQzdCO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNwQyxPQUFPLHFCQUFxQixDQUFDO1NBQzlCO2FBQU07WUFDTCxPQUFPLGtCQUFrQixDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixvQkFBb0IsQ0FBQyxNQUF1QjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7SUFDeEQsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELGNBQWM7UUFDWixtRUFBbUU7SUFDckUsQ0FBQztJQUVELG9HQUFvRztJQUM1RixZQUFZLENBQUMsTUFBK0I7UUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSztZQUN6RCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUs7WUFDakUsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSztTQUM1RCxDQUFDO1FBRUYsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQWEsQ0FBQztRQUN4QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO1FBQzVELE1BQU0sV0FBVyxHQUNmLENBQUMsYUFBYTtZQUNkLFlBQVksQ0FBQyxtQkFBbUI7WUFDaEMsSUFBSSxDQUFDLHlCQUF5QjtZQUM5QixJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUU1QyxJQUFJLFdBQVcsRUFBRTtZQUNmLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FDaEYsQ0FBQztZQUNGLElBQUksY0FBYyxFQUFFO2dCQUNsQixxRkFBcUY7Z0JBQ3JGLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzthQUN0RztTQUNGO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLDhFQUE4RTtZQUM5RSxNQUFNLFVBQVUsR0FDZCxhQUFhLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELGtCQUFrQixHQUFHLElBQUksQ0FBQztTQUMzQjtRQUVELCtGQUErRjtRQUMvRixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sVUFBVSxHQUNkLGFBQWEsSUFBSSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkYsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCx1RkFBdUY7WUFDdkYsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDcEQ7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLG1CQUFtQixDQUFDLGNBQXNCLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxXQUFXO1lBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsTUFBTTtRQUNKLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZGLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakYsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUMzRixNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxNQUtoQztRQUNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDL0UsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZFLElBQUksbUJBQXVDLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFDN0MsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hHLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pFLE1BQU0sY0FBYyxHQUFRLFdBQVc7Z0JBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FBQztnQkFDakYsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQ2pDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLGFBQWEsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FDN0csQ0FBQztZQUNOLElBQUksY0FBYyxFQUFFO2dCQUNsQixtQkFBbUIsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUM7YUFDL0c7U0FDRjtRQUNELE1BQU0scUJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFzRCxFQUFFLENBQUM7UUFDM0UsSUFBSSxNQUFNLENBQUMscUJBQXFCLElBQUksTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25HLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUNyRSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFO29CQUN6RCxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUM3QyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDckU7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9GLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDOUQsR0FBRyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDakUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztZQUMvRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUNyRCxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUM7UUFDL0QsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFFdkQscUVBQXFFO1FBQ3JFLElBQUksbUJBQXVDLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsR0FBVyxhQUFhLENBQUMsQ0FBQywyQkFBMkI7UUFFekUsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hHLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBRXpFLElBQUksY0FBbUIsQ0FBQztZQUN4QixJQUFJLFdBQVcsRUFBRTtnQkFDZixpQ0FBaUM7Z0JBQ2pDLGNBQWMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUNsRCxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLENBQ2pELENBQUM7YUFDSDtpQkFBTTtnQkFDTCxzQ0FBc0M7Z0JBQ3RDLGNBQWMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUNsRCxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQ3pILENBQUM7YUFDSDtZQUVELElBQUksY0FBYyxFQUFFO2dCQUNsQixtQkFBbUIsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxxRUFBcUU7Z0JBQ3JFLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQzthQUMvRztTQUNGO1FBRUQscURBQXFEO1FBQ3JELE1BQU0scUJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBQ3RDLDhEQUE4RDtRQUM5RCxNQUFNLFlBQVksR0FBc0QsRUFBRSxDQUFDO1FBRTNFLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtvQkFDekQseURBQXlEO29CQUN6RCxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUM3QywrRUFBK0U7b0JBQy9FLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO3dCQUN2QixZQUFZLEVBQUUsS0FBSztxQkFDcEIsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELHlCQUF5QjtRQUN6QixzSEFBc0g7UUFDdEgseUVBQXlFO1FBQ3pFLElBQUksWUFBb0IsQ0FBQztRQUN6QixJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtZQUNyQyxtSUFBbUk7WUFDbkksWUFBWSxHQUFHLGdCQUFnQixDQUFDO1NBQ2pDO2FBQU07WUFDTCxxQ0FBcUM7WUFDckMsWUFBWSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoRztRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUM7UUFDNUQsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCO1lBQ3pHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO1FBRWxGLCtHQUErRztRQUMvRyx5RkFBeUY7UUFDekYsc0VBQXNFO1FBQ3RFLHVGQUF1RjtRQUN2RixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyw2Q0FBNkMsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNwSCxJQUFJLHFCQUFxQixJQUFJLGFBQWEsRUFBRTtZQUMxQyx5REFBeUQ7WUFDeEQsYUFBcUIsQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUM7U0FDckQ7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsbUJBQW1CLENBQUM7U0FDdEM7UUFFRCxzR0FBc0c7UUFDdEcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpGLGdDQUFnQztRQUNoQyxNQUFNLGlCQUFpQixHQVFuQjtZQUNGLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFlBQVk7WUFDeEQsR0FBRyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxFQUFFLG1CQUFtQixFQUFTLENBQUM7WUFDeEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQVMsQ0FBQztZQUN0RixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQVMsQ0FBQztZQUN2RCxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFTLENBQUM7U0FDbEUsQ0FBQztRQUVGLElBQUksYUFBdUMsQ0FBQztRQUM1QyxJQUFJLHFCQUFxQixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN0RSwySEFBMkg7WUFDM0gsYUFBYSxHQUFHO2dCQUNkLEdBQUcsaUJBQWlCO2dCQUNwQixFQUFFLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLFNBQVMsRUFBRSxZQUFZO2dCQUN2QixjQUFjLEVBQUUsSUFBSTtnQkFDcEIsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2FBQ25DLENBQUM7U0FDVjthQUFNO1lBQ0wscUZBQXFGO1lBQ3JGLGFBQWEsR0FBRztnQkFDZCxHQUFHLGlCQUFpQjtnQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQ25CLENBQUM7U0FDVjtRQUVELCtCQUErQjtRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUMsMkdBQTJHO1FBQzNHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDZDQUE2QyxDQUNuRCxJQUFZLEVBQ1osU0FBcUQ7UUFFckQsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQVcsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sR0FBRyxHQUFJLElBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLE9BQU8sbUJBQW1CLEdBQUcscUJBQXFCLEdBQUcscUJBQXFCLE9BQU8sU0FBUyxDQUFDO2FBQzVGO1lBQ0QsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLG1CQUFtQixHQUFHLHFCQUFxQixHQUFHLHVCQUF1QixPQUFPLFNBQVMsQ0FBQzthQUM5RjtZQUNELE9BQU8sbUJBQW1CLEdBQUcscUJBQXFCLEdBQUcsdUJBQXVCLE9BQU8sU0FBUyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsQ0FBQyxnQkFBc0IsRUFBRSxNQUF3QixFQUFFLFdBQW9CLEVBQUUsWUFBc0IsRUFBRSxZQUFrQjtRQUM5SCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBd0IsQ0FBQztRQUM3QixJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM5RSxxSEFBcUg7WUFDckgsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBb0MsQ0FBQztZQUNuRixJQUFJLEdBQUcsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDL0QsQ0FBQyxDQUFDLGVBQWU7Z0JBQ2pCLENBQUMsQ0FBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUF5QixDQUFDO1lBQzNHLDZFQUE2RTtZQUM3RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsS0FBSyxHQUFHLE9BQU8sVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2STthQUFNLElBQUksWUFBWSxFQUFFO1lBQ3ZCLGtGQUFrRjtZQUNsRixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQTRCLENBQUM7WUFDekMsS0FBSyxHQUFHLFNBQVMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsMkJBQTJCO1lBQzNCLEtBQUssR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtnQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNaLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUE0QixDQUFDO1NBQzFDO1FBQ0QsTUFBTSxPQUFPLEdBQTZIO1lBQ3hJLElBQUk7WUFDSixLQUFLLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNqRixDQUFDO1FBQ0YsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7U0FDN0M7UUFDRCxJQUFJLFlBQVksSUFBSSxZQUFZLEVBQUU7WUFDaEMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDNUIsb0RBQW9EO1lBQ3BELElBQUksWUFBWSxDQUFDLHFCQUFxQixJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDdkUsT0FBTyxDQUFDLG9CQUFvQixHQUFHO29CQUM3QixxQkFBcUIsRUFBRSxZQUFZLENBQUMscUJBQXFCO29CQUN6RCxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsZ0JBQWdCO2lCQUNoRCxDQUFDO2FBQ0g7U0FDRjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNO1FBQ0osbUVBQW1FO0lBQ3JFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQWdCO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWtCO1FBQzlCLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDckUsT0FBTztTQUNSO1FBRUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsS0FBSztnQkFDTCxLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2FBQ3JDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCwwQkFBMEIsQ0FBQyxRQUFhLEVBQUUsbUJBQXFDLEtBQUs7UUFDbEYsTUFBTSxPQUFPLEdBQW1CLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0UsRUFBRSxFQUFFLEdBQUc7WUFDUCxLQUFLLEVBQUUsR0FBRztZQUNWLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLEdBQUc7U0FDWCxDQUFDLENBQUMsQ0FBQztRQUVKLHlHQUF5RztRQUN6RyxJQUFJLElBQWUsQ0FBQztRQUNwQixJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUksR0FBRyxNQUFNLEVBQUUscUJBQXFCLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztTQUM3SDtRQUVELE9BQU87WUFDTCxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbEIsV0FBVyxFQUFFLFVBQVUsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUN2QyxRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQztZQUNILENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7MkhBenlDVSw4QkFBOEI7K0dBQTlCLDhCQUE4QixxbURDNUMzQyxtZzRDQStoQk07MkZEbmZPLDhCQUE4QjtrQkFUMUMsU0FBUzsrQkFDRSw4QkFBOEIsUUFFbEMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQ3RCO3dCQUNOLHVCQUF1Qjt3QkFDdkIsNkJBQTZCO3FCQUM5QjtrSUFHUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBeUM4QyxrQkFBa0I7c0JBQXJFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUV4QyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBDb25kaXRpb25TdGVwQ29uZmlnLCBDb25kaXRpb25CcmFuY2gsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgTG9vcFN0ZXBDb25maWcsIFN0ZXBHcm91cENvbmZpZywgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi4vLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyBWaWV3RGV0YWlsc1BheWxvYWQgfSBmcm9tICcuLi9zdGVwLWRldGFpbHMtbW9kYWwvc3RlcC1kZXRhaWxzLW1vZGFsLWRhdGEnO1xuXG5jb25zdCBDT05ESVRJT05fQlJBTkNIX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgZHJvcCB6b25lOiBlbnN1cmUgbWluIGhlaWdodCBmb3IgZHJhZy1kcm9wIHRvIHdvcmsgKElGL0VMU0UgSUYvRUxTRSBicmFuY2hlcykgKi9cbiAgLm5lc3RlZC1zdGVwLWRyb3AtbGlzdDpoYXMoLnN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQ6b25seS1jaGlsZCkge1xuICAgIG1pbi1oZWlnaHQ6IDUycHg7XG4gIH1cbiAgLyogRW1wdHkgSUYgLyBFTFNFIElGIC8gRUxTRTogYWx3YXlzIHNob3cgcGx1cyBpY29uIHdoZW4gbm8gc3RlcHMgKHZpc2libGUgd2l0aG91dCBob3ZlcikgKi9cbiAgLmNvbmRpdGlvbi1icmFuY2gtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGVhc2U7XG4gIH1cbiAgLyogU2hvdyBlZGl0L2RlbGV0ZSBpY29ucyB3aGVuIGhvdmVyaW5nIG92ZXIgYnJhbmNoIHJvdyBoZWFkZXIgKElGIFRSVUUsIEVMU0UgSUYsIEVMU0UpICovXG4gIC5jb25kaXRpb24tYnJhbmNoLXJvdzpob3ZlciAuc3RlcC1hY3Rpb25zIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIC5jb25kaXRpb24tYnJhbmNoLWVtcHR5LWFkZCB7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAjM0Y0M0VFO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTtcbiAgfVxuICAuY29uZGl0aW9uLWJyYW5jaC1lbXB0eS1hZGQ6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuOTtcbiAgfVxuYDtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtY29uZGl0aW9uLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29uZGl0aW9uLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1xuICAgIFNURVBfUk9XX0FDVElPTlNfU1RZTEVTLFxuICAgIENPTkRJVElPTl9CUkFOQ0hfRU1QVFlfU1RZTEVTLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZUNvbmRpdGlvblN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmRpdGlvblN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICAvKiogQXJyYXkgaW5kZXggZnJvbSBwYXJlbnQgcmVuZGVyZXIgLSB1c2UgdGhpcyBmb3IgZWRpdEluRGVwdGggaW5zdGVhZCBvZiBzdGVwTnVtYmVyIChzdGVwTnVtYmVyIFwiMTAuM1wiIHBhcnNlcyB0byAxMCkgKi9cbiAgQElucHV0KCkgaW5kZXg/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbmRpdGlvbiE6IHN0cmluZztcbiAgQElucHV0KCkgYnJhbmNoZXM6IENvbmRpdGlvbkJyYW5jaFtdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyBmb3Igd2hpbGUgbG9vcCBjb25kaXRpb24gKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIChzaW1pbGFyIHRvIHN0ZXAtYnVpbGRlci1jb25kaXRpb24pICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hlbiBub24tbnVsbCwgZWRpdCBtb2RlIGlzIG9wZW46ICdzdGVwUm93JyA9IGVkaXQgVUkgaW4gc3RlcCByb3cgb25seSwgJ2JyYW5jaFJvdycgPSBlZGl0IFVJIGluIGJyYW5jaCByb3cgb25seSAqL1xuICBlZGl0Q29udGV4dDogJ3N0ZXBSb3cnIHwgJ2JyYW5jaFJvdycgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hpY2ggYnJhbmNoIGluZGV4IGlzIGJlaW5nIGVkaXRlZCB3aGVuIGVkaXRDb250ZXh0ID09PSAnYnJhbmNoUm93JyAoMCA9IElGIFRSVUUsIDErID0gRUxTRSBJRikgKi9cbiAgZWRpdGluZ0JyYW5jaEluZGV4OiBudW1iZXIgPSAwO1xuXG4gIC8qKiBUcnVlIHdoZW4gZWRpdENvbnRleHQgaXMgc2V0IChlaXRoZXIgc3RlcCByb3cgb3IgYnJhbmNoIHJvdyBlZGl0KS4gKi9cbiAgZ2V0IGlzRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0Q29udGV4dCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBBcnJheSBvZiBFTFNFIElGIGJyYW5jaGVzIGluIGVkaXQgbW9kZSAqL1xuICBlbHNlSWZCcmFuY2hlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU6IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W107XG4gICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBGb3JtR3JvdXA7XG4gICAgc25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdD86IHN0cmluZzsgY29uZGl0aW9uT3BlcmF0b3I/OiBzdHJpbmc7IGNvbmRpdGlvblJpZ2h0Pzogc3RyaW5nIH07XG4gIH0+ID0gW107XG5cbiAgLyoqIEZvcm0gZm9yIGVkaXQgbW9kZTsgYm91bmQgdG8gY3FhLWR5bmFtaWMtc2VsZWN0IGFuZCBjcWEtY3VzdG9tLWlucHV0ICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBPcGVyYXRvciBkcm9wZG93biBjb25maWcgKElTLCBJUyBOT1QsIENPTlRBSU5TLCBldGMuKSAqL1xuICBvcGVyYXRvclNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgLyoqIENvbmRpdGlvbiBsZWZ0IG9wZXJhbmQgZHJvcGRvd24gY29uZmlnIChuYXR1cmFsIHRleHQgYWN0aW9ucyB3aXRoIElGX0NPTkRJVElPTikgKi9cbiAgY29uZGl0aW9uTGVmdFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU25hcHNob3QgZm9yIENhbmNlbCByZXZlcnQgKi9cbiAgcHJpdmF0ZSBlZGl0U25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdD86IHN0cmluZzsgY29uZGl0aW9uT3BlcmF0b3I/OiBzdHJpbmc7IGNvbmRpdGlvblJpZ2h0Pzogc3RyaW5nIH0gPSB7fTtcbiAgXG4gIC8qKiBTZWxlY3RlZCB0ZW1wbGF0ZSBmb3IgSUYgY29uZGl0aW9uICovXG4gIHNlbGVjdGVkVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIC8qKiBUZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIElGIGNvbmRpdGlvbiAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgLyoqIEZvcm0gZ3JvdXAgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0hOiBGb3JtR3JvdXA7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogQ29uZGl0aW9uU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59PigpO1xuICBAT3V0cHV0KCkgY29uZGl0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBicmFuY2hTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoOyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IHN0ZXBJbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx7IGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBuZXN0ZWQgbG9vcC1zdGVwIGVtaXRzIGFkZFN0ZXBGb3JMb29wIChlbXB0eSBzdGF0ZSBwbHVzIGJ1dHRvbikuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwRm9yTG9vcCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBJbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgXCJBZGQgRWxzZVwiIHNvIHRoZSBwYXJlbnQgY2FuIGNhbGwgUE9TVCB0ZXN0X3N0ZXBzIHdpdGggY29uZGl0aW9uVHlwZSBDT05ESVRJT05fRUxTRSAqL1xuICBAT3V0cHV0KCkgYWRkRWxzZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb25kaXRpb25TdGVwQ29uZmlnOiBDb25kaXRpb25TdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBQYXlsb2FkIGNhbiBiZSBicmFuY2ggb25seSAobGVnYWN5KSBvciB7IGJyYW5jaCwgc3RlcE51bWJlciB9IGZvciBkZWxldGUgbW9kYWwgbGFiZWwgZS5nLiBcIlN0ZXAgNSBFTFNFXCIuICovXG4gIEBPdXRwdXQoKSBkZWxldGVCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkJyYW5jaCB8IHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBOdW1iZXI/OiBudW1iZXIgfCBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4PzogbnVtYmVyOyB0ZW1wbGF0ZU92ZXJyaWRlPzogYW55OyBpc0NyZWF0ZU1vZGU/OiBib29sZWFuOyBjcmVhdGVNb2RlQnJhbmNoRGF0YT86IGFueSB9PigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIGEgbmVzdGVkIHN0ZXAgaXMgdXBkYXRlZCAoZS5nLiwgQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gbG9vcC1zdGVwIGVkaXQgbW9kZSkgKi9cbiAgQE91dHB1dCgpIHN0ZXBVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgLyoqIFJlLWVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIChlLmcuIG5vcm1hbC1zdGVwKSBlbWl0cyBjbGlja0FjdGlvbiAoZS5nLiBlbGVtZW50L2xhYmVsIGNsaWNrIGZvciBwb3B1cCkgKi9cbiAgQE91dHB1dCgpIGNsaWNrQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEJldHdlZW5DbGljayBmcm9tIG5lc3RlZCByZW5kZXJlcnMgKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHtzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIsIHBvc2l0aW9uOiAnQUJPVkUnIHwgJ0JFTE9XJ30+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gbmVzdGVkIHN0ZXAgZ3JvdXAgZW1pdHMgb3BlbkV4dGVybmFsIChyZWRpcmVjdCB0byBzdGVwIGdyb3VwIGluIG5ldyB0YWIpICovXG4gIEBPdXRwdXQoKSBvcGVuRXh0ZXJuYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG5cbiAgb25EbmREcm9wKGV2ZW50OiBEbmREcm9wRXZlbnQsIGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogYnJhbmNoLm5lc3RlZFN0ZXBzIH0pO1xuICB9XG5cbiAgLyoqIEVtaXQgY2xpY2tBY3Rpb24gd2hlbiB1c2VyIGNsaWNrcyBvbiBjb25kaXRpb24vYnJhbmNoIGFjdGlvbiBiYWRnZXMgKGVsZW1lbnQsIHRlc3RfZGF0YSwgZXRjLikgc28gcGFyZW50IGNhbiBvcGVuIGVkaXQgbW9kYWxzICovXG4gIG9uQ29uZGl0aW9uQWN0aW9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGJyYW5jaD86IENvbmRpdGlvbkJyYW5jaCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlU3RlcEdyb3VwKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnID0gYnJhbmNoPy5pZCAhPSBudWxsXG4gICAgICA/IHsgLi4udGhpcy5jb25maWcsIGlkOiBTdHJpbmcoYnJhbmNoLmlkKSB9IGFzIFRlc3RDYXNlU3RlcENvbmZpZ1xuICAgICAgOiB0aGlzLmNvbmZpZztcbiAgICB0aGlzLmNsaWNrQWN0aW9uLmVtaXQoeyBldmVudCwgc3RlcCB9KTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIGNsaWNrQWN0aW9uIGZyb20gbmVzdGVkIHN0ZXBzIG9ubHkgd2hlbiBub3QgaW5zaWRlIGEgc3RlcC1ncm91cCAoRWxlbWVudC9UZXN0IERhdGEgbW9kYWxzIGRpc2FibGVkIHRoZXJlKS4gKi9cbiAgb25OZXN0ZWRDbGlja0FjdGlvbihwYXlsb2FkOiB7IGV2ZW50OiBNb3VzZUV2ZW50OyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0luc2lkZVN0ZXBHcm91cCkge1xuICAgICAgdGhpcy5jbGlja0FjdGlvbi5lbWl0KHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLmJyYW5jaGVzID0gdGhpcy5jb25maWcuYnJhbmNoZXMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZE9wZXJhdG9yU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBjb25kaXRpb24gYW5kIGJyYW5jaGVzIHdoZW4gY29uZmlnIGNoYW5nZXMgKGltcG9ydGFudCBmb3IgaW1tZWRpYXRlIFVJIHVwZGF0ZXMpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIFVJIHJlZmxlY3RzIGNoYW5nZXMgaW1tZWRpYXRlbHksIGV2ZW4gaWYgY29uZmlnIG9iamVjdCByZWZlcmVuY2UgZG9lc24ndCBjaGFuZ2VcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5icmFuY2hlcykge1xuICAgICAgICB0aGlzLmJyYW5jaGVzID0gdGhpcy5jb25maWcuYnJhbmNoZXM7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gZW5zdXJlIFVJIHVwZGF0ZXNcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmRpdGlvbiddICYmIHRoaXMuY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENvbmRpdGlvbiBpbnB1dCBjaGFuZ2VkLCB1cGRhdGUgZnJvbSBjb25maWcgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2JyYW5jaGVzJ10gJiYgdGhpcy5icmFuY2hlcykge1xuICAgICAgLy8gQnJhbmNoZXMgY2hhbmdlZCwgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyduYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uTGVmdFNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gUmVidWlsZCBmb3JtIHdoZW4gb3B0aW9ucyBhcmUgbG9hZGVkIHRvIHBvcHVsYXRlIGluaXRpYWwgdmFsdWUgZnJvbSBuYXR1cmFsVGV4dEFjdGlvbklkXG4gICAgICBpZiAodGhpcy5lZGl0Rm9ybSAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkRWRpdEZvcm1XaXRoTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUmVidWlsZCBlZGl0IGZvcm0gd2hlbiBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFyZSBsb2FkZWQgdG8gcG9wdWxhdGUgZnJvbSBuYXR1cmFsVGV4dEFjdGlvbklkICovXG4gIHByaXZhdGUgcmVidWlsZEVkaXRGb3JtV2l0aE5hdHVyYWxUZXh0QWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgICAgIGlmIChuYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGN1cnJlbnQgdmFsdWUgaXMgZW1wdHkgb3IgZG9lc24ndCBtYXRjaFxuICAgICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAhPT0gbmF0dXJhbFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnNldFZhbHVlKG5hdHVyYWxUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRoZSBmdWxsIHRlbXBsYXRlIG9iamVjdCAoTmF0dXJhbFRleHRBY3Rpb25zKSBmcm9tIHRoZSBvcHRpb25cbiAgICAgICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlIGFuZCBnZXQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKTtcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgLy8gSWYgY29uZmlnIGhhcyBuYXR1cmFsVGV4dEFjdGlvbklkLCBmaW5kIHRoZSBtYXRjaGluZyBuYXR1cmFsIHRleHQgYWN0aW9uXG4gICAgbGV0IGNvbmRpdGlvbkxlZnRWYWx1ZSA9ICcnO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIC8vIFVzZSBuYXR1cmFsVGV4dCBleGFjdGx5IGFzIHJlY2VpdmVkIGZyb20gQVBJXG4gICAgICAgIGNvbmRpdGlvbkxlZnRWYWx1ZSA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgICAgIC8vIEdldCB0aGUgZnVsbCB0ZW1wbGF0ZSBvYmplY3QgKE5hdHVyYWxUZXh0QWN0aW9ucykgZnJvbSB0aGUgb3B0aW9uXG4gICAgICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCB0ZW1wbGF0ZSBhbmQgZ2V0IHZhcmlhYmxlc1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSk7XG4gICAgICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIG5hdHVyYWxUZXh0QWN0aW9uSWQgbWF0Y2ggZm91bmQsIHBhcnNlIGZyb20gY29uZGl0aW9uIHN0cmluZ1xuICAgIGlmICghY29uZGl0aW9uTGVmdFZhbHVlKSB7XG4gICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMucGFyc2VDb25kaXRpb24odGhpcy5jb25kaXRpb24pO1xuICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbGVmdDtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgeyBvcGVyYXRvciwgcmlnaHQgfSA9IHRoaXMucGFyc2VDb25kaXRpb24odGhpcy5jb25kaXRpb24pO1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbmRpdGlvbkxlZnQ6IFtjb25kaXRpb25MZWZ0VmFsdWVdLFxuICAgICAgY29uZGl0aW9uT3BlcmF0b3I6IFtvcGVyYXRvcl0sXG4gICAgICBjb25kaXRpb25SaWdodDogW3JpZ2h0XSxcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHRlbXBsYXRlIHZhcmlhYmxlcyBmb3JtIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWxzZUlmQnJhbmNoKGluZGV4PzogbnVtYmVyKToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU6IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W107XG4gICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtOiBGb3JtR3JvdXA7XG4gICAgc25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdD86IHN0cmluZzsgY29uZGl0aW9uT3BlcmF0b3I/OiBzdHJpbmc7IGNvbmRpdGlvblJpZ2h0Pzogc3RyaW5nIH07XG4gIH0ge1xuICAgIC8vIEluaXRpYWxpemUgRUxTRSBJRiBmb3JtIHdpdGggZW1wdHkgdmFsdWVzIG9yIGZyb20gZXhpc3RpbmcgRUxTRSBJRiBicmFuY2ggaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgZWxzZUlmQnJhbmNoZXMgPSB0aGlzLmJyYW5jaGVzPy5maWx0ZXIoYiA9PiBiLnR5cGUgPT09ICdlbHNlLWlmJykgfHwgW107XG4gICAgY29uc3QgYnJhbmNoSW5kZXggPSBpbmRleCAhPT0gdW5kZWZpbmVkID8gaW5kZXggOiBlbHNlSWZCcmFuY2hlcy5sZW5ndGg7XG4gICAgY29uc3QgZWxzZUlmQnJhbmNoID0gZWxzZUlmQnJhbmNoZXNbYnJhbmNoSW5kZXhdO1xuICAgIGNvbnN0IGVsc2VDb25kaXRpb24gPSBlbHNlSWZCcmFuY2g/LmFjdGlvbiB8fCAnJztcbiAgICBjb25zdCB7IGxlZnQsIG9wZXJhdG9yLCByaWdodCB9ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihlbHNlQ29uZGl0aW9uKTtcbiAgICBcbiAgICBjb25zdCBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb25kaXRpb25MZWZ0OiBbbGVmdF0sXG4gICAgICBjb25kaXRpb25PcGVyYXRvcjogW29wZXJhdG9yXSxcbiAgICAgIGNvbmRpdGlvblJpZ2h0OiBbcmlnaHRdLFxuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBpZDogYGVsc2UtaWYtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCl9YCxcbiAgICAgIGZvcm0sXG4gICAgICBzZWxlY3RlZFRlbXBsYXRlOiBudWxsLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IFtdLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtLFxuICAgICAgc25hcHNob3Q6IHsgY29uZGl0aW9uTGVmdDogbGVmdCwgY29uZGl0aW9uT3BlcmF0b3I6IG9wZXJhdG9yLCBjb25kaXRpb25SaWdodDogcmlnaHQgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkT3BlcmF0b3JTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7IGlkOiAnaXMnLCB2YWx1ZTogJ2lzJywgbmFtZTogJ0lTJywgbGFiZWw6ICdJUycgfSxcbiAgICAgIHsgaWQ6ICdpcyBub3QnLCB2YWx1ZTogJ2lzIG5vdCcsIG5hbWU6ICdJUyBOT1QnLCBsYWJlbDogJ0lTIE5PVCcgfSxcbiAgICAgIHsgaWQ6ICdjb250YWlucycsIHZhbHVlOiAnY29udGFpbnMnLCBuYW1lOiAnQ09OVEFJTlMnLCBsYWJlbDogJ0NPTlRBSU5TJyB9LFxuICAgICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VRVUFMUycsIGxhYmVsOiAnRVFVQUxTJyB9LFxuICAgICAgeyBpZDogJ3N0YXJ0cyB3aXRoJywgdmFsdWU6ICdzdGFydHMgd2l0aCcsIG5hbWU6ICdTVEFSVFMgV0lUSCcsIGxhYmVsOiAnU1RBUlRTIFdJVEgnIH0sXG4gICAgICB7IGlkOiAnZW5kcyB3aXRoJywgdmFsdWU6ICdlbmRzIHdpdGgnLCBuYW1lOiAnRU5EUyBXSVRIJywgbGFiZWw6ICdFTkRTIFdJVEgnIH0sXG4gICAgXTtcbiAgICB0aGlzLm9wZXJhdG9yU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uT3BlcmF0b3InLFxuICAgICAgcGxhY2Vob2xkZXI6ICdPcGVyYXRvcicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgY29uZGl0aW9uIGxlZnQgc2VsZWN0IGNvbmZpZyB3aXRoIGZpbHRlcmVkIG5hdHVyYWwgdGV4dCBhY3Rpb25zIChJRl9DT05ESVRJT04gb25seSkgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIC8vIEZpbHRlciBuYXR1cmFsIHRleHQgYWN0aW9ucyB0byBvbmx5IGluY2x1ZGUgdGhvc2Ugd2l0aCBzdGVwQWN0aW9uVHlwZSA9PT0gXCJJRl9DT05ESVRJT05cIlxuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmZpbHRlcigob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24uc3RlcEFjdGlvblR5cGUgPT09ICdJRl9DT05ESVRJT04nO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uTGVmdCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBDb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlcmVkT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBjb25kaXRpb24gbGVmdCBhdXRvY29tcGxldGUgKElGX0NPTkRJVElPTiBuYXR1cmFsIHRleHQgYWN0aW9ucykgKi9cbiAgZ2V0IGNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zKCk6IENxYUF1dG9jb21wbGV0ZU9wdGlvbltdIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5jb25kaXRpb25MZWZ0U2VsZWN0Q29uZmlnPy5vcHRpb25zID8/IFtdO1xuICAgIHJldHVybiBvcHRzLm1hcCgob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIC8vIFVzZSBuYXR1cmFsVGV4dCBleGFjdGx5IGFzIHJlY2VpdmVkIGZyb20gQVBJLCBmYWxsYmFjayB0byBuYW1lL3ZhbHVlL2lkXG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG9wdGlvbi5uYXR1cmFsVGV4dCA/PyBvcHRpb24ubmFtZSA/PyBvcHRpb24udmFsdWUgPz8gU3RyaW5nKG9wdGlvbi5pZCA/PyAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbmF0dXJhbFRleHQsXG4gICAgICAgIGxhYmVsOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgdGVtcGxhdGUgb2JqZWN0IChOYXR1cmFsVGV4dEFjdGlvbnMpIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMgcHJvY2Vzc2luZ1xuICAgICAgICAvLyBVc2Ugb3B0aW9uLnRlbXBsYXRlIGlmIGF2YWlsYWJsZSAoZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMpLCBvdGhlcndpc2UgdXNlIG9wdGlvbiBpdHNlbGZcbiAgICAgICAgdGVtcGxhdGU6IG9wdGlvbi50ZW1wbGF0ZSB8fCBvcHRpb24sXG4gICAgICB9IGFzIENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHZhbHVlIGZvciBJRi9FTFNFIElGIGNvbmRpdGlvbiBhdXRvY29tcGxldGUuXG4gICAqIC0gRm9yIElGIChzdGVwIHJvdyAvIElGIGJyYW5jaCBlZGl0KSwgc2hvdyBuYXR1cmFsVGV4dCBmcm9tIG9wdGlvbiBtYXRjaGluZyBuYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gZm9ybSBpcyBlbXB0eS5cbiAgICogLSBGb3IgRUxTRSBJRiBicmFuY2ggZWRpdCwgYWx3YXlzIHVzZSB0aGUgZm9ybSB2YWx1ZSAoc28gY2xlYXJpbmcgbGVhdmVzIHRoZSBmaWVsZCBlbXB0eSBpbnN0ZWFkIG9mIHJldmVydGluZyB0byBJRikuXG4gICAqL1xuICBnZXQgY29uZGl0aW9uTGVmdERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgaXNGb3JtSHRtbCA9IGZvcm1WYWx1ZSAmJiAoU3RyaW5nKGZvcm1WYWx1ZSkuaW5jbHVkZXMoJzwnKSB8fCBTdHJpbmcoZm9ybVZhbHVlKS5pbmNsdWRlcygnPicpKTtcblxuICAgIC8vIFdoZW4gZWRpdGluZyBhbiBFTFNFIElGIGJyYW5jaCwgZG9uJ3QgZmFsbCBiYWNrIHRvIElGJ3MgbmF0dXJhbFRleHQ7IGp1c3Qgc2hvdyB0aGUgY3VycmVudCBmb3JtIHZhbHVlLlxuICAgIGNvbnN0IGlzRWRpdGluZ0Vsc2VJZkJyYW5jaCA9XG4gICAgICB0aGlzLmVkaXRDb250ZXh0ID09PSAnYnJhbmNoUm93JyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZWRpdGluZ0JyYW5jaEluZGV4ID09PSAnbnVtYmVyJyAmJlxuICAgICAgdGhpcy5lZGl0aW5nQnJhbmNoSW5kZXggPiAwO1xuICAgIGlmIChpc0VkaXRpbmdFbHNlSWZCcmFuY2gpIHtcbiAgICAgIGlmIChpc0Zvcm1IdG1sKSByZXR1cm4gJyc7XG4gICAgICByZXR1cm4gZm9ybVZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgICAgIGlmIChuYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0U3RyID0gU3RyaW5nKG5hdHVyYWxUZXh0KTtcbiAgICAgICAgICBpZiAoIWZvcm1WYWx1ZSB8fCBmb3JtVmFsdWUgPT09IG5hdHVyYWxUZXh0U3RyIHx8IGlzRm9ybUh0bWwpIHJldHVybiBuYXR1cmFsVGV4dFN0cjtcbiAgICAgICAgICByZXR1cm4gZm9ybVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Zvcm1IdG1sKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uTGVmdFNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIFxuICAgIC8vIEdldCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbiAtIG9wdGlvbi50ZW1wbGF0ZSBzaG91bGQgY29udGFpbiB0aGUgZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMgb2JqZWN0XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBJZiB0ZW1wbGF0ZSBub3QgaW4gb3B0aW9uLCB0cnkgdG8gZmluZCBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYnkgbWF0Y2hpbmcgbmF0dXJhbFRleHRcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3Qgb3B0VmFsID0gKG9wdGlvbi52YWx1ZSA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBuID0gKG9wdC5uYXR1cmFsVGV4dCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWUgPz8gJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgIHJldHVybiBuID09PSBvcHRWYWwgfHwgKG9wdC50ZW1wbGF0ZSAmJiAob3B0LnRlbXBsYXRlIGFzIGFueSkubmF0dXJhbFRleHQ/LnRvU3RyaW5nKCkudHJpbSgpID09PSBvcHRWYWwpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gVXNlIHRlbXBsYXRlIHByb3BlcnR5IGZyb20gb3B0aW9uIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0aGUgb3B0aW9uIGl0c2VsZlxuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBmdWxsIHRlbXBsYXRlIGZvciByZWZlcmVuY2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIFxuICAgICAgLy8gR2V0IHRlbXBsYXRlIHZhcmlhYmxlcyB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIFBhc3MgdGhlIGZ1bGwgTmF0dXJhbFRleHRBY3Rpb25zIG9iamVjdCB3aGljaCBoYXMgdGhlIHZhcmlhYmxlcyBwcm9wZXJ0eVxuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpO1xuICAgICAgY29uc29sZS5sb2coJ1RlbXBsYXRlIHZhcmlhYmxlcyBsb2FkZWQ6JywgdmFyaWFibGVzLCAnZnJvbSB0ZW1wbGF0ZTonLCBmdWxsVGVtcGxhdGUpO1xuICAgICAgXG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdmFyaWFibGVzIHx8IFtdO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnTm8gbWF0Y2hpbmcgdGVtcGxhdGUgZm91bmQgb3IgdGVtcGxhdGUgaGFzIG5vIHZhcmlhYmxlcycsIHtcbiAgICAgICAgZnVsbFRlbXBsYXRlLFxuICAgICAgICBoYXNWYXJpYWJsZXM6IGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzLFxuICAgICAgICBvcHRpb25WYWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICBvcHRpb25UZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvLyBBdXRvLW9wZW4gRWRpdCBJbiBkZXB0aCB3aGVuIHVzZXIgc2VsZWN0cyBhIGNvbmRpdGlvbiBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgLy8gUGFzcyB0aGUgc2VsZWN0ZWQgdGVtcGxhdGUgc28gdGhlIG1vZGFsIHNob3dzIHRoZSBuZXdseSBzZWxlY3RlZCB0ZW1wbGF0ZSwgbm90IHRoZSBvbGQgc3RlcCB0ZW1wbGF0ZS5cbiAgICAvLyBQcmVmZXIgc2VsZWN0ZWRUZW1wbGF0ZSAodmFsaWRhdGVkKSwgdGhlbiBmdWxsVGVtcGxhdGUsIHRoZW4gb3B0aW9uLnRlbXBsYXRlIChmcm9tIGF1dG9jb21wbGV0ZSlcbiAgICBjb25zdCB0ZW1wbGF0ZVRvUGFzcyA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSB8fCBmdWxsVGVtcGxhdGUgfHwgb3B0aW9uLnRlbXBsYXRlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVkaXRJbkRlcHRoKHRlbXBsYXRlVG9QYXNzKSwgMTAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGNvbnRyb2xzXG4gICAgT2JqZWN0LmtleXModGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnJlbW92ZUNvbnRyb2woa2V5KTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBHZXQgZXhpc3RpbmcgdGVtcGxhdGUgdmFyaWFibGVzIGRhdGEgZnJvbSBjb25maWcgaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgY29uZmlnV2l0aERhdGEgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gY29uZmlnV2l0aERhdGEudGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIFxuICAgIC8vIEFkZCBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIFRyeSB0byBnZXQgdmFsdWUgZnJvbSBleGlzdGluZyBkYXRhIGZpcnN0LCB0aGVuIGZyb20gdmFyaWFibGUgZGVmYXVsdFxuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnQgYm9vbGVhbiBzdHJpbmcgdG8gYm9vbGVhblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICcxJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZS5uYW1lLCBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkVsc2VDb25kaXRpb25MZWZ0U2VsZWN0KG9wdGlvbjogQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9LCBicmFuY2hJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYnJhbmNoID0gdGhpcy5lbHNlSWZCcmFuY2hlcy5maW5kKGIgPT4gYi5pZCA9PT0gYnJhbmNoSWQpO1xuICAgIGlmICghYnJhbmNoKSByZXR1cm47XG4gICAgXG4gICAgYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIFxuICAgIC8vIEdldCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbiAtIG9wdGlvbi50ZW1wbGF0ZSBzaG91bGQgY29udGFpbiB0aGUgZnVsbCBOYXR1cmFsVGV4dEFjdGlvbnMgb2JqZWN0XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBJZiB0ZW1wbGF0ZSBub3QgaW4gb3B0aW9uLCB0cnkgdG8gZmluZCBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYnkgbWF0Y2hpbmcgbmF0dXJhbFRleHRcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgKG9wdDogYW55KSA9PiBvcHQubmF0dXJhbFRleHQgPT09IG9wdGlvbi52YWx1ZSB8fCBvcHQubmFtZSA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXG4gICAgICApO1xuICAgICAgLy8gVXNlIHRlbXBsYXRlIHByb3BlcnR5IGZyb20gb3B0aW9uIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0aGUgb3B0aW9uIGl0c2VsZlxuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBmdWxsIHRlbXBsYXRlIGZvciByZWZlcmVuY2VcbiAgICAgIGJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgLy8gR2V0IHRlbXBsYXRlIHZhcmlhYmxlcyB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKTtcbiAgICAgIC8vIEJ1aWxkIGZvcm0gZm9yIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgdGhpcy5idWlsZEVsc2VUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oYnJhbmNoKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgICAgaWYgKCFicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8vIEF1dG8tb3BlbiBFZGl0IEluIGRlcHRoIHdoZW4gdXNlciBzZWxlY3RzIGEgY29uZGl0aW9uIGZyb20gdGhlIEVMU0UgSUYgYXV0b2NvbXBsZXRlLlxuICAgIC8vIEZvciBleGlzdGluZyBicmFuY2g6IHBhc3MgYnJhbmNoIGFuZCBicmFuY2hJbmRleCBzbyBtb2RhbCBzaG93cyBcIkVkaXQgU3RlcCBOXCIuXG4gICAgLy8gRm9yIG5ldyBicmFuY2ggKGlkIHN0YXJ0cyB3aXRoIFwiZWxzZS1pZi1cIiA9IHRlbXAgVUkgaWQpOiBwYXNzIGlzQ3JlYXRlTW9kZSBzbyBtb2RhbCBzaG93cyBcIkNyZWF0ZSBTdGVwXCIgYW5kIGNhbGxzIGNyZWF0ZSBBUEkgb24gc2F2ZS5cbiAgICBjb25zdCBjb25maWdCcmFuY2ggPSB0aGlzLmdldEJyYW5jaEJ5SWQoYnJhbmNoSWQpO1xuICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gdGhpcy5nZXRCcmFuY2hJbmRleEJ5SWQoYnJhbmNoSWQpO1xuICAgIGNvbnN0IGlzTmV3QnJhbmNoID0gdHlwZW9mIGJyYW5jaElkID09PSAnc3RyaW5nJyAmJiBicmFuY2hJZC5zdGFydHNXaXRoKCdlbHNlLWlmLScpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVkaXRJbkRlcHRoKGZ1bGxUZW1wbGF0ZSwgY29uZmlnQnJhbmNoID8/IHVuZGVmaW5lZCwgYnJhbmNoSW5kZXggPj0gMCA/IGJyYW5jaEluZGV4IDogdW5kZWZpbmVkLCBpc05ld0JyYW5jaCwgYnJhbmNoKSwgMTAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBidWlsZEVsc2VUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oYnJhbmNoOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgICBzbmFwc2hvdDogeyBjb25kaXRpb25MZWZ0Pzogc3RyaW5nOyBjb25kaXRpb25PcGVyYXRvcj86IHN0cmluZzsgY29uZGl0aW9uUmlnaHQ/OiBzdHJpbmcgfTtcbiAgfSk6IHZvaWQge1xuICAgIGlmICghYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGNvbnRyb2xzXG4gICAgT2JqZWN0LmtleXMoYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gR2V0IGV4aXN0aW5nIHRlbXBsYXRlIHZhcmlhYmxlcyBkYXRhIGZyb20gY29uZmlnIGlmIGF2YWlsYWJsZSAoZm9yIEVMU0UgSUYgYnJhbmNoKVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLmVsc2VUZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge307XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gY29udHJvbHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IHZhbHVlIGZyb20gZXhpc3RpbmcgZGF0YSBmaXJzdCwgdGhlbiBmcm9tIHZhcmlhYmxlIGRlZmF1bHRcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmIChleGlzdGluZ0RhdGEuaGFzT3duUHJvcGVydHkodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZXhpc3RpbmdEYXRhW3ZhcmlhYmxlLm5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDb252ZXJ0IGJvb2xlYW4gc3RyaW5nIHRvIGJvb2xlYW5cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgfHwgZGVmYXVsdFZhbHVlID09PSAnMSc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZS5uYW1lLCBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkFkZEVsc2UoKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IEVMU0UgSUYgYnJhbmNoIChVSSByb3cgb25seTsgQVBJcyBhcmUgY2FsbGVkIHdoZW4gdXNlciBjbGlja3MgQXBwbHkpXG4gICAgY29uc3QgbmV3QnJhbmNoID0gdGhpcy5idWlsZEVsc2VJZkJyYW5jaCgpO1xuICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICB9XG5cbiAgb25BZGRFbHNlQnJhbmNoKCk6IHZvaWQge1xuICAgIC8vIEVtaXQgc28gcGFyZW50IGNhbiBjYWxsIFBPU1QgdGVzdF9zdGVwcyB3aXRoIGNvbmRpdGlvblR5cGUgQ09ORElUSU9OX0VMU0VcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuYWRkRWxzZS5lbWl0KHsgY29uZGl0aW9uU3RlcENvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVFbHNlKGJyYW5jaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgdGhlIEVMU0UgSUYgYnJhbmNoIHdpdGggdGhlIGdpdmVuIElEXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmRJbmRleChiID0+IGIuaWQgPT09IGJyYW5jaElkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmVsc2VJZkJyYW5jaGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0cmlwIEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nIHRvIGdldCBwbGFpbiB0ZXh0ICovXG4gIHByaXZhdGUgc3RyaXBIdG1sVGFncyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbCB8fCB0eXBlb2YgaHRtbCAhPT0gJ3N0cmluZycpIHJldHVybiBodG1sO1xuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXYgZWxlbWVudCB0byBwYXJzZSBIVE1MIGFuZCBleHRyYWN0IHRleHRcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gZGl2LnRleHRDb250ZW50IHx8IGRpdi5pbm5lclRleHQgfHwgaHRtbC5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgfVxuXG4gIC8qKiBQYXJzZSBjb25kaXRpb24gc3RyaW5nIGludG8gbGVmdCwgb3BlcmF0b3IsIHJpZ2h0IChlLmcuIFwiVXNlcnR5cGUgaXMgUHJlbWl1bVwiKVxuICAgKiBTdHJpcHMgSFRNTCB0YWdzIGJlZm9yZSBwYXJzaW5nIHRvIGhhbmRsZSBmb3JtYXR0ZWQgY29uZGl0aW9ucyAqL1xuICBwcml2YXRlIHBhcnNlQ29uZGl0aW9uKGM6IHN0cmluZyk6IHsgbGVmdDogc3RyaW5nOyBvcGVyYXRvcjogc3RyaW5nOyByaWdodDogc3RyaW5nIH0ge1xuICAgIGlmICghYyB8fCB0eXBlb2YgYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGxlZnQ6ICcnLCBvcGVyYXRvcjogJ2lzJywgcmlnaHQ6ICcnIH07XG4gICAgfVxuICAgIC8vIFN0cmlwIEhUTUwgdGFncyBiZWZvcmUgcGFyc2luZyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBmb3JtYXR0ZWQgY29uZGl0aW9uc1xuICAgIGNvbnN0IHBsYWluVGV4dCA9IHRoaXMuc3RyaXBIdG1sVGFncyhjKS50cmltKCk7XG4gICAgY29uc3Qgb3BlcmF0b3JzID0gWycgaXMgbm90ICcsICcgaXMgJywgJyBjb250YWlucyAnLCAnIGVxdWFscyAnLCAnIHN0YXJ0cyB3aXRoICcsICcgZW5kcyB3aXRoICddO1xuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BlcmF0b3JzKSB7XG4gICAgICBjb25zdCBpID0gcGxhaW5UZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcCk7XG4gICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZWZ0OiBwbGFpblRleHQuc2xpY2UoMCwgaSkudHJpbSgpLFxuICAgICAgICAgIG9wZXJhdG9yOiBvcC50cmltKCksXG4gICAgICAgICAgcmlnaHQ6IHBsYWluVGV4dC5zbGljZShpICsgb3AubGVuZ3RoKS50cmltKCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQ6IHBsYWluVGV4dCwgb3BlcmF0b3I6ICdpcycsIHJpZ2h0OiAnJyB9O1xuICB9XG5cbiAgLyoqIEJ1aWxkIGNvbmRpdGlvbiBzdHJpbmcgZnJvbSBmb3JtIHZhbHVlcyAqL1xuICBwcml2YXRlIGJ1aWxkQ29uZGl0aW9uRnJvbUZvcm0oKTogc3RyaW5nIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IG9wID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnZhbHVlID8/ICdpcyc7XG4gICAgY29uc3QgcmlnaHQgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uUmlnaHQnKT8udmFsdWUgPz8gJyc7XG4gICAgXG4gICAgLy8gSWYgbGVmdCBpcyBhbiBJRCAobnVtYmVyKSwgZmluZCB0aGUgbmF0dXJhbFRleHQgZnJvbSBvcHRpb25zXG4gICAgaWYgKGxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcobGVmdCk7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbnVtYmVyIChJRCkgb3IgaWYgd2UgbmVlZCB0byBmaW5kIHRoZSBuYXR1cmFsVGV4dFxuICAgICAgY29uc3QgaXNOdW1lcmljSWQgPSAhaXNOYU4oTnVtYmVyKGxlZnRWYWx1ZSkpICYmIGxlZnRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgXG4gICAgICBpZiAoaXNOdW1lcmljSWQpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgb3B0aW9uIGJ5IElEIGFuZCB1c2UgaXRzIG5hdHVyYWxUZXh0XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aW9uID0gdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gbGVmdFZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbiAmJiBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCkge1xuICAgICAgICAgIGxlZnQgPSBTdHJpbmcoc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgYSBuYXR1cmFsVGV4dCBvciBuZWVkcyB0byBiZSBmb3VuZFxuICAgICAgICBjb25zdCBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLm5hdHVyYWxUZXh0ID09PSBsZWZ0IHx8IG9wdGlvbi5uYW1lID09PSBsZWZ0IHx8IG9wdGlvbi52YWx1ZSA9PT0gbGVmdFxuICAgICAgICApO1xuICAgICAgICBpZiAoc2VsZWN0ZWRBY3Rpb24gJiYgc2VsZWN0ZWRBY3Rpb24ubmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBsZWZ0ID0gU3RyaW5nKHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gW2xlZnQsIG9wLCByaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQ291bnQgc3RlcHMgYXMgY29uZGl0aW9ucyAoYmFkZ2VzKTogSUYgPSAxICsgbnVtYmVyIG9mIEVMU0UgSUYgKyAxIGlmIEVMU0UgKi9cbiAgZ2V0U3RlcHNTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgYnJhbmNoQ291bnQgPSB0aGlzLmJyYW5jaGVzPy5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gYnJhbmNoQ291bnQgPiAwID8gYCR7YnJhbmNoQ291bnR9IHN0ZXAke2JyYW5jaENvdW50ICE9PSAxID8gJ3MnIDogJyd9YCA6ICcwIHN0ZXBzJztcbiAgfVxuXG4gIC8qKiBCcmFuY2ggdHlwZSBiYWRnZXMgZm9yIHN0ZXAgcm93OiBJRiwgRUxTRSBJRiAod2l0aCBjb3VudCBpZiBtdWx0aXBsZSksIEVMU0UgKi9cbiAgZ2V0QnJhbmNoVHlwZUJhZGdlcygpOiB7IGxhYmVsOiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyB0eXBlOiAnaWYnIHwgJ2Vsc2UtaWYnIHwgJ2Vsc2UnOyBiYWRnZUNsYXNzOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBiYWRnZXM6IHsgbGFiZWw6IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IHR5cGU6ICdpZicgfCAnZWxzZS1pZicgfCAnZWxzZSc7IGJhZGdlQ2xhc3M6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCBlbHNlSWZDb3VudCA9IHRoaXMuYnJhbmNoZXM/LmZpbHRlcihiID0+IGIudHlwZSA9PT0gJ2Vsc2UtaWYnKS5sZW5ndGggPz8gMDtcbiAgICBjb25zdCBoYXNFbHNlID0gdGhpcy5oYXNFbHNlQnJhbmNoO1xuXG4gICAgYmFkZ2VzLnB1c2goeyBsYWJlbDogJ0lGJywgdHlwZTogJ2lmJywgYmFkZ2VDbGFzczogJ2NxYS1iZy1bIzBEQkQ3RDFBXSBjcWEtdGV4dC1bIzBENTQyQl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyMwREJEN0RdJyB9KTtcbiAgICBpZiAoZWxzZUlmQ291bnQgPiAwKSB7XG4gICAgICBiYWRnZXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiAnRUxTRSBJRicsXG4gICAgICAgIGNvdW50OiBlbHNlSWZDb3VudCA+IDEgPyBlbHNlSWZDb3VudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogJ2Vsc2UtaWYnLFxuICAgICAgICBiYWRnZUNsYXNzOiAnY3FhLWJnLXllbGxvdy01MCBjcWEtdGV4dC15ZWxsb3ctNzAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXllbGxvdy0yMDAnXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGhhc0Vsc2UpIHtcbiAgICAgIGJhZGdlcy5wdXNoKHsgbGFiZWw6ICdFTFNFJywgdHlwZTogJ2Vsc2UnLCBiYWRnZUNsYXNzOiAnY3FhLWJnLXJlZC01MCBjcWEtdGV4dC1yZWQtNzAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXJlZC0yMDAnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmFkZ2VzO1xuICB9XG5cbiAgLyoqIENvbmRpdGlvbiB0ZXh0IGFzIHBsYWluIHRleHQgKHN0cmlwcyBIVE1MKSwgdHJ1bmNhdGVkIHdpdGggXCIuLi5cIiBpZiBsb25nICovXG4gIGdldENvbmRpdGlvblBsYWluVGV4dChtYXhMZW5ndGg6IG51bWJlciA9IDYwKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uIHx8IHR5cGVvZiB0aGlzLmNvbmRpdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICBjb25zdCBwbGFpbiA9IHRoaXMuY29uZGl0aW9uLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpLnRyaW0oKTtcbiAgICBpZiAocGxhaW4ubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIHBsYWluO1xuICAgIGxldCB0cnVuY2F0ZWQgPSBwbGFpbi5zbGljZSgwLCBtYXhMZW5ndGgpO1xuICAgIC8vIFRyaW0gdHJhaWxpbmcgcHVuY3R1YXRpb24gdG8gYXZvaWQgXCIuLi4uXCIgd2hlbiB0ZXh0IGVuZHMgd2l0aCBcIi5cIlxuICAgIHRydW5jYXRlZCA9IHRydW5jYXRlZC5yZXBsYWNlKC9bLiw7OiE/XSskLywgJycpO1xuICAgIHJldHVybiB0cnVuY2F0ZWQgKyAnLi4uJztcbiAgfVxuXG4gIC8qKiBFdmVudCBrZXktdmFsdWUgcGFpcnMgZm9yIGRpc3BsYXksIGV4Y2x1ZGluZyBjdXN0b21FdmVudCAqL1xuICBnZXRFdmVudERldGFpbHNGb3JEaXNwbGF5KCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBldmVudCA9IHRoaXMuY29uZmlnPy5ldmVudDtcbiAgICBpZiAoIWV2ZW50IHx8IHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcpIHJldHVybiBbXTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXZlbnQpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5ICE9PSAnY3VzdG9tRXZlbnQnKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKSA6ICcnXG4gICAgICB9KSk7XG4gIH1cblxuICAvKiogRXZlbnQga2V5LXZhbHVlIHBhaXJzIGZvciBhIGJyYW5jaCAoZS5nLiBzZWxlY3RvciwgZWxlbWVudCkgLSBmb3IgSUYgdXNlcyBjb25maWcuZXZlbnQsIGZvciBFTFNFIElGL0VMU0UgdXNlcyBicmFuY2guZXZlbnQgKi9cbiAgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheShicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBldmVudCA9IChicmFuY2ggYXMgYW55KS5ldmVudCA/PyAoYnJhbmNoLnR5cGUgPT09ICdpZicgPyB0aGlzLmNvbmZpZz8uZXZlbnQgOiB1bmRlZmluZWQpO1xuICAgIGlmICghZXZlbnQgfHwgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhldmVudClcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09ICdjdXN0b21FdmVudCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpIDogJydcbiAgICAgIH0pKTtcbiAgfVxuXG4gIG9uVG9nZ2xlRXhwYW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOnRoaXMuY29uZmlnLCBleHBhbmRlZDp0aGlzLmV4cGFuZGVkfSk7XG4gIH1cblxuICBvbkNvbmRpdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2g6IENvbmRpdGlvbkJyYW5jaCwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBzdGVwSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYnJhbmNoU3RlcENoYW5nZS5lbWl0KHsgYnJhbmNoLCBzdGVwLCBzdGVwSW5kZXggfSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBvcGVuRXh0ZXJuYWwgZnJvbSBuZXN0ZWQgc3RlcCBncm91cCBzbyByZWRpcmVjdCB3b3JrcyBmb3Igc3RlcCBncm91cHMgaW5zaWRlIGNvbmRpdGlvbiBicmFuY2hlcy4gKi9cbiAgb25OZXN0ZWRPcGVuRXh0ZXJuYWwocGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB7XG4gICAgICB0aGlzLm9wZW5FeHRlcm5hbC5lbWl0KHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgYnJhbmNoOiBDb25kaXRpb25CcmFuY2gsIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIHN0ZXAtZ3JvdXA6IHtjb25maWcsIGV4cGFuZGVkfVxuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50LmV4cGFuZGVkO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50J3MgY29uZmlnIGlzIGEgc3RlcC1ncm91cCAobm90IHRoZSBjdXJyZW50IHN0ZXApXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbmVzdGVkIHN0ZXAtZ3JvdXAgZXZlbnRzIGJ1YmJsZSB1cCBjb3JyZWN0bHlcbiAgICAgIGlmICh0aGlzLmlzU3RlcEdyb3VwKGV2ZW50LmNvbmZpZykpIHtcbiAgICAgICAgLy8gUmUtZW1pdCB0aGUgdG9nZ2xlRXhwYW5kZWQgZXZlbnQgd2l0aCB0aGUgb2JqZWN0IGZvcm1hdCwgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIC8vIENhc3QgdG8gc2F0aXNmeSBUeXBlU2NyaXB0IC0gdGhlIHJlbmRlcmVyIGFjY2VwdHMgVGVzdENhc2VTdGVwQ29uZmlnIHdoaWNoIGluY2x1ZGVzIFN0ZXBHcm91cENvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIGFueSBhcyBDb25kaXRpb25TdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbkFkZFN0ZXAoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGJyYW5jaCB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYWRkU3RlcEZvckxvb3AgZXZlbnQgZnJvbSBuZXN0ZWQgbG9vcC1zdGVwIChlbXB0eSBzdGF0ZSBwbHVzIGJ1dHRvbikuICovXG4gIG9uQWRkU3RlcEZvckxvb3AoZXZlbnQ6IHsgbG9vcFN0ZXBDb25maWc6IExvb3BTdGVwQ29uZmlnIH0sIGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogdm9pZCB7XG4gICAgLy8gUmUtZW1pdCBhZGRTdGVwRm9yTG9vcCBzbyBpdCBidWJibGVzIHVwIHRvIHRoZSBwb3J0YWwsIHdoaWNoIHdpbGwgaGFuZGxlIGNyZWF0aW5nIHRoZSBzdGVwXG4gICAgLy8gd2l0aCB0aGUgY29ycmVjdCBwYXJlbnRJZCAobG9vcCBzdGVwIGlkKSBhbmQgYnJhbmNoIGNvbnRleHRcbiAgICB0aGlzLmFkZFN0ZXBGb3JMb29wLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25EZWxldGVTdGVwKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoLCBzdGVwSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KHsgYnJhbmNoLCBzdGVwSW5kZXggfSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBlZGl0IGZyb20gbmVzdGVkIHN0ZXAgaW4gYSBicmFuY2ggc28gdGhlIHBvcnRhbCBjYW4gb3BlbiBlZGl0IG1vZGFsIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZEVkaXQoZXZlbnQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LnN0ZXAgIT0gbnVsbCkgdGhpcy5lZGl0LmVtaXQoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGR1cGxpY2F0ZSBmcm9tIG5lc3RlZCBzdGVwIGluIGEgYnJhbmNoIHNvIHRoZSBwb3J0YWwgY2FuIGR1cGxpY2F0ZSAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWREdXBsaWNhdGUoZXZlbnQ6IGFueSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgoZXZlbnQgJiYgZXZlbnQuc3RlcCAhPSBudWxsKSA/IGV2ZW50IDogeyBzdGVwIH0gYXMgYW55KTtcbiAgfVxuXG4gIG9uQWRkQnJhbmNoKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQnJhbmNoLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogdm9pZCB7XG4gICAgY29uc3QgYnJhbmNoSW5kZXggPSB0aGlzLmJyYW5jaGVzPy5pbmRleE9mKGJyYW5jaCkgPz8gMDtcbiAgICBjb25zdCBkaXNwbGF5TnVtYmVyID0gdGhpcy5nZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4KTtcbiAgICB0aGlzLmRlbGV0ZUJyYW5jaC5lbWl0KHsgYnJhbmNoLCBzdGVwTnVtYmVyOiBkaXNwbGF5TnVtYmVyIH0pO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJyxcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIHBheWxvYWQ6IENvbmRpdGlvbkJyYW5jaCB8IHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBOdW1iZXI/OiBudW1iZXIgfCBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIFJlLWVtaXQgZGVsZXRlQnJhbmNoIHNvIHN0ZXAtbGlzdCBjYW4gb3BlbiBkZWxldGUgbW9kYWwgYW5kIGNhbGwgQVBJLlxuICAgIGNvbnN0IGJyYW5jaCA9IHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmICdicmFuY2gnIGluIHBheWxvYWQgPyAocGF5bG9hZCBhcyB7IGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoIH0pLmJyYW5jaCA6IChwYXlsb2FkIGFzIENvbmRpdGlvbkJyYW5jaCk7XG4gICAgY29uc3QgYnJhbmNoSW5kZXggPSB0aGlzLmJyYW5jaGVzPy5pbmRleE9mKGJyYW5jaCkgPz8gMDtcbiAgICBjb25zdCBkaXNwbGF5TnVtYmVyID0gdGhpcy5nZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4KTtcbiAgICBjb25zdCB0b0VtaXQ6IHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2g7IHN0ZXBOdW1iZXI/OiBudW1iZXIgfCBzdHJpbmcgfSA9XG4gICAgICBwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJiAnYnJhbmNoJyBpbiBwYXlsb2FkXG4gICAgICAgID8geyBicmFuY2g6IChwYXlsb2FkIGFzIHsgYnJhbmNoOiBDb25kaXRpb25CcmFuY2ggfSkuYnJhbmNoLCBzdGVwTnVtYmVyOiAocGF5bG9hZCBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gZGlzcGxheU51bWJlciB9XG4gICAgICAgIDogeyBicmFuY2g6IHBheWxvYWQgYXMgQ29uZGl0aW9uQnJhbmNoLCBzdGVwTnVtYmVyOiBkaXNwbGF5TnVtYmVyIH07XG4gICAgdGhpcy5kZWxldGVCcmFuY2guZW1pdCh0b0VtaXQpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBnZXRCcmFuY2hMYWJlbChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJyYW5jaC5sYWJlbCB8fCAoYnJhbmNoLnR5cGUgPT09ICdpZicgPyAnSUYgVFJVRScgOiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnID8gJ0VMU0UgSUYnIDogJ0VMU0UnKTtcbiAgfVxuXG4gIC8qKiBDb25kaXRpb24gdGV4dCBmb3IgYnJhbmNoIGhlYWRlciBkaXNwbGF5OiBJRiB1c2VzIG1haW4gY29uZGl0aW9uLCBFTFNFIElGL0VMU0UgdXNlIGJyYW5jaC5hY3Rpb24gKi9cbiAgZ2V0QnJhbmNoQ29uZGl0aW9uRGlzcGxheShicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgaWYgKGJyYW5jaC50eXBlID09PSAnaWYnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25kaXRpb24gPz8gJyc7XG4gICAgfVxuICAgIHJldHVybiBicmFuY2guYWN0aW9uID8/ICcnO1xuICB9XG5cbiAgLyoqIFN0YXJ0IG1hcmtlciBsYWJlbCBmb3IgZWFjaCBicmFuY2g6IFNUQVJUIElGLCBTVEFSVCBFTFNFIElGLCBvciBTVEFSVCBFTFNFICovXG4gIGdldFN0YXJ0QnJhbmNoTGFiZWwoYnJhbmNoOiBDb25kaXRpb25CcmFuY2gpOiBzdHJpbmcge1xuICAgIHJldHVybiBicmFuY2gudHlwZSA9PT0gJ2lmJyA/ICdTVEFSVCBJRicgOiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnID8gJ1NUQVJUIEVMU0UgSUYnIDogJ1NUQVJUIEVMU0UnO1xuICB9XG5cbiAgLyoqIEVuZCBtYXJrZXIgbGFiZWwgZm9yIGVhY2ggYnJhbmNoOiBFTkQgSUYsIEVORCBFTFNFIElGLCBvciBFTkQgRUxTRSAqL1xuICBnZXRFbmRCcmFuY2hMYWJlbChicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJyYW5jaC50eXBlID09PSAnaWYnID8gJ0VORCBJRicgOiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnID8gJ0VORCBFTFNFIElGJyA6ICdFTkQgRUxTRSc7XG4gIH1cblxuICAvKiogQnJhbmNoIGRpc3BsYXkgbnVtYmVyOiBmdWxsIGhpZXJhcmNoaWNhbCBudW1iZXIuIElGID0gc3RlcE51bWJlciAoZS5nLiAyLjEuNTApLCBFTFNFIElGID0gMi4xLjUxLCBFTFNFID0gMi4xLjUyLiAqL1xuICBnZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGlmIChicmFuY2hJbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RlcE51bWJlcjtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcodGhpcy5zdGVwTnVtYmVyKS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGxhc3ROdW0gPSBwYXJzZUludChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSwgMTApIHx8IDA7XG4gICAgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPSBTdHJpbmcobGFzdE51bSArIGJyYW5jaEluZGV4KTtcbiAgICByZXR1cm4gcGFydHMuam9pbignLicpO1xuICB9XG5cbiAgLyoqIEZpbmQgYnJhbmNoIGluIGJyYW5jaGVzIGJ5IGlkIChmb3IgZWxzZUlmQnJhbmNoZXMgd2hpY2ggdXNlIHNhbWUgaWQpLiAqL1xuICBnZXRCcmFuY2hCeUlkKGJyYW5jaElkPzogc3RyaW5nIHwgbnVtYmVyKTogQ29uZGl0aW9uQnJhbmNoIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoYnJhbmNoSWQgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5icmFuY2hlcz8uZmluZChiID0+IGIuaWQgIT0gbnVsbCAmJiBTdHJpbmcoYi5pZCkgPT09IFN0cmluZyhicmFuY2hJZCkpO1xuICB9XG5cbiAgLyoqIEdldCBicmFuY2ggaW5kZXggaW4gYnJhbmNoZXMgYnkgaWQuICovXG4gIGdldEJyYW5jaEluZGV4QnlJZChicmFuY2hJZD86IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgYnJhbmNoID0gdGhpcy5nZXRCcmFuY2hCeUlkKGJyYW5jaElkKTtcbiAgICByZXR1cm4gYnJhbmNoICE9IG51bGwgPyAodGhpcy5icmFuY2hlcz8uaW5kZXhPZihicmFuY2gpID8/IC0xKSA6IC0xO1xuICB9XG5cbiAgZ2V0QnJhbmNoQ29sb3JDbGFzcyhicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IHN0cmluZyB7XG4gICAgaWYgKGJyYW5jaC50eXBlID09PSAnaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS1iZy1bIzBEQkQ3RDFBXSc7XG4gICAgfSBlbHNlIGlmIChicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnKSB7XG4gICAgICByZXR1cm4gJ2NxYS1iZy15ZWxsb3ctNTAgY3FhLWJvcmRlci15ZWxsb3ctMjAwJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjcWEtYmctcmVkLTUwIGNxYS1ib3JkZXItcmVkLTIwMCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnJhbmNoVGV4dENvbG9yKGJyYW5jaDogQ29uZGl0aW9uQnJhbmNoKTogc3RyaW5nIHtcbiAgICBpZiAoYnJhbmNoLnR5cGUgPT09ICdpZicpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtWyMwRDU0MkJdJztcbiAgICB9IGVsc2UgaWYgKGJyYW5jaC50eXBlID09PSAnZWxzZS1pZicpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQteWVsbG93LTcwMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtcmVkLTcwMCc7XG4gICAgfVxuICB9XG5cbiAgLyoqIENyZWF0ZWQgZGF0ZSBmb3IgYnJhbmNoIGhlYWRlciBkaXNwbGF5OiBicmFuY2gtc3BlY2lmaWMgb3IgZmFsbGJhY2sgdG8gY29uZmlnLiAqL1xuICBnZXRCcmFuY2hDcmVhdGVkRGF0ZShicmFuY2g6IENvbmRpdGlvbkJyYW5jaCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGJyYW5jaC5jcmVhdGVkRGF0ZSA/PyB0aGlzLmNvbmZpZz8uY3JlYXRlZERhdGU7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGNvbmRpdGlvbiBhbHJlYWR5IGhhcyBhbiBFTFNFIGJyYW5jaCAoZGlzYWJsZXMgQWRkIEVMU0UgSUYgLyBBZGQgRUxTRSkuICovXG4gIGdldCBoYXNFbHNlQnJhbmNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJyYW5jaGVzPy5zb21lKGIgPT4gYi50eXBlID09PSAnZWxzZScpID8/IGZhbHNlO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gY29uZGl0aW9uIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgLyoqIFNoYXJlZCBpbml0IGZvciBlZGl0IG1vZGU7IHRoZW4gY2FsbCBvbkVkaXRGcm9tU3RlcFJvdyBvciBvbkVkaXRGcm9tQnJhbmNoUm93IHRvIHNldCBjb250ZXh0LiAqL1xuICBwcml2YXRlIGluaXRFZGl0Rm9ybShicmFuY2g/OiBDb25kaXRpb25CcmFuY2ggfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICBjb25kaXRpb25MZWZ0OiB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUsXG4gICAgICBjb25kaXRpb25PcGVyYXRvcjogdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy52YWx1ZSxcbiAgICAgIGNvbmRpdGlvblJpZ2h0OiB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnZhbHVlLFxuICAgIH07XG5cbiAgICBsZXQgY29uZGl0aW9uTGVmdFZhbHVlID0gJyc7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGVkaXRpbmdFbHNlSWYgPSAhIWJyYW5jaCAmJiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnO1xuICAgIGNvbnN0IGhhc1RlbXBsYXRlID1cbiAgICAgICFlZGl0aW5nRWxzZUlmICYmXG4gICAgICBjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZCAmJlxuICAgICAgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmXG4gICAgICB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMubGVuZ3RoID4gMDtcblxuICAgIGlmIChoYXNUZW1wbGF0ZSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdBY3Rpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0FjdGlvbikge1xuICAgICAgICAvLyBGb3IgdGVtcGxhdGUtYmFzZWQgY29uZGl0aW9ucywgdXNlIHRoZSBmdWxsIG5hdHVyYWxUZXh0IChpdCdzIGEgY29tcGxldGUgc2VudGVuY2UpXG4gICAgICAgIGNvbmRpdGlvbkxlZnRWYWx1ZSA9IG1hdGNoaW5nQWN0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nQWN0aW9uLm5hbWUgPz8gbWF0Y2hpbmdBY3Rpb24udmFsdWUgPz8gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb25MZWZ0VmFsdWUpIHtcbiAgICAgIC8vIE5vIHRlbXBsYXRlIG9yIGVkaXRpbmcgRUxTRSBJRjogcGFyc2UgZnJvbSB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9uIHN0cmluZ1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9XG4gICAgICAgIGVkaXRpbmdFbHNlSWYgJiYgYnJhbmNoPy5hY3Rpb24gPyBTdHJpbmcoYnJhbmNoLmFjdGlvbikgOiAodGhpcy5jb25kaXRpb24gPz8gJycpO1xuICAgICAgY29uc3QgeyBsZWZ0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKHNvdXJjZVRleHQpO1xuICAgICAgY29uZGl0aW9uTGVmdFZhbHVlID0gbGVmdDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHBhcnNlIG9wZXJhdG9yIGFuZCByaWdodCBpZiB3ZSBkb24ndCBoYXZlIGEgdGVtcGxhdGUgKHRlbXBsYXRlcyBhcmUgY29tcGxldGUgc2VudGVuY2VzKVxuICAgIGlmICghaGFzVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVRleHQgPVxuICAgICAgICBlZGl0aW5nRWxzZUlmICYmIGJyYW5jaD8uYWN0aW9uID8gU3RyaW5nKGJyYW5jaC5hY3Rpb24pIDogKHRoaXMuY29uZGl0aW9uID8/ICcnKTtcbiAgICAgIGNvbnN0IHsgb3BlcmF0b3IsIHJpZ2h0IH0gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKHNvdXJjZVRleHQpO1xuICAgICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy5zZXRWYWx1ZShvcGVyYXRvcik7XG4gICAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnNldFZhbHVlKHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIHRlbXBsYXRlcywgY2xlYXIgb3BlcmF0b3IgYW5kIHJpZ2h0ICh0ZW1wbGF0ZSBuYXR1cmFsVGV4dCBpcyB0aGUgZnVsbCBjb25kaXRpb24pXG4gICAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKCdpcycpO1xuICAgICAgdGhpcy5lZGl0Rm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy5zZXRWYWx1ZSgnJyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZShjb25kaXRpb25MZWZ0VmFsdWUpO1xuICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMgPSBbXTtcbiAgfVxuXG4gIC8qKiBFZGl0IGZyb20gc3RlcCByb3c6IGVkaXQgVUkgYXBwZWFycyBpbiB0aGUgc3RlcCByb3cgb25seSAoZmlyc3QgYnJhbmNoIHN0YXlzIHJlYWQtb25seSkuICovXG4gIG9uRWRpdEZyb21TdGVwUm93KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdEVkaXRGb3JtKCk7XG4gICAgdGhpcy5lZGl0Q29udGV4dCA9ICdzdGVwUm93JztcbiAgfVxuXG4gIC8qKiBFZGl0IGZyb20gYnJhbmNoIHJvdzogZWRpdCBVSSBhcHBlYXJzIGluIHRoYXQgYnJhbmNoIHJvdyAoSUYgVFJVRSBvciBFTFNFIElGKS4gKi9cbiAgb25FZGl0RnJvbUJyYW5jaFJvdyhicmFuY2hJbmRleDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGNvbnN0IGJyYW5jaCA9IHRoaXMuYnJhbmNoZXMgJiYgdGhpcy5icmFuY2hlcy5sZW5ndGggPiBicmFuY2hJbmRleFxuICAgICAgPyB0aGlzLmJyYW5jaGVzW2JyYW5jaEluZGV4XVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbml0RWRpdEZvcm0oYnJhbmNoKTtcbiAgICB0aGlzLmVkaXRpbmdCcmFuY2hJbmRleCA9IGJyYW5jaEluZGV4O1xuICAgIHRoaXMuZWRpdENvbnRleHQgPSAnYnJhbmNoUm93JztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb25FZGl0RnJvbVN0ZXBSb3cgb3Igb25FZGl0RnJvbUJyYW5jaFJvdy4gS2VwdCBmb3IgY29tcGF0aWJpbGl0eS4gKi9cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdEVkaXRGb3JtKCk7XG4gICAgdGhpcy5lZGl0Q29udGV4dCA9ICdicmFuY2hSb3cnO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25MZWZ0ID8/ICcnKTtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbk9wZXJhdG9yJyk/LnNldFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbk9wZXJhdG9yID8/ICdpcycpO1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uUmlnaHQnKT8uc2V0VmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uUmlnaHQgPz8gJycpO1xuICAgIFxuICAgIC8vIFJlc2V0IGFsbCBFTFNFIElGIGJyYW5jaGVzIHRvIHRoZWlyIHNuYXBzaG90c1xuICAgIHRoaXMuZWxzZUlmQnJhbmNoZXMuZm9yRWFjaChicmFuY2ggPT4ge1xuICAgICAgYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZShicmFuY2guc25hcHNob3QuY29uZGl0aW9uTGVmdCA/PyAnJyk7XG4gICAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25PcGVyYXRvcicpPy5zZXRWYWx1ZShicmFuY2guc25hcHNob3QuY29uZGl0aW9uT3BlcmF0b3IgPz8gJ2lzJyk7XG4gICAgICBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25SaWdodCcpPy5zZXRWYWx1ZShicmFuY2guc25hcHNob3QuY29uZGl0aW9uUmlnaHQgPz8gJycpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIENsZWFyIGFsbCBFTFNFIElGIGJyYW5jaGVzXG4gICAgdGhpcy5lbHNlSWZCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5lZGl0Q29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5lZGl0aW5nQnJhbmNoSW5kZXggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHBheWxvYWQgZm9yIG9uZSBFTFNFIElGIGJyYW5jaCAoYWN0aW9uLCBuYXR1cmFsVGV4dEFjdGlvbklkLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEsIHRlc3REYXRhTGlzdClcbiAgICogc28gdGhlIHBhcmVudCBjYW4gY3JlYXRlIHRoZSBzdGVwIHZpYSBQT1NUIHRoZW4gUFVUIHdoZW4gQXBwbHkgaXMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRFbHNlSWZCcmFuY2hQYXlsb2FkKGJyYW5jaDoge1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdO1xuICAgIHRlbXBsYXRlVmFyaWFibGVzRm9ybTogRm9ybUdyb3VwO1xuICB9KTogeyBhY3Rpb246IHN0cmluZzsgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyB0ZXN0RGF0YUxpc3Q/OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+IH0ge1xuICAgIGNvbnN0IGNvbmRpdGlvbkxlZnQgPSBicmFuY2guZm9ybT8uZ2V0KCdjb25kaXRpb25MZWZ0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGNvbmRpdGlvbk9wZXJhdG9yID0gYnJhbmNoLmZvcm0/LmdldCgnY29uZGl0aW9uT3BlcmF0b3InKT8udmFsdWUgPz8gJ2lzJztcbiAgICBjb25zdCBjb25kaXRpb25SaWdodCA9IGJyYW5jaC5mb3JtPy5nZXQoJ2NvbmRpdGlvblJpZ2h0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGxldCBuYXR1cmFsVGV4dEFjdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hdHVyYWxUZXh0VmFsdWU6IHN0cmluZyA9IGNvbmRpdGlvbkxlZnQ7XG4gICAgaWYgKGNvbmRpdGlvbkxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcoY29uZGl0aW9uTGVmdCk7XG4gICAgICBjb25zdCBpc051bWVyaWNJZCA9ICFpc05hTihOdW1iZXIobGVmdFZhbHVlKSkgJiYgbGVmdFZhbHVlLnRyaW0oKSAhPT0gJyc7XG4gICAgICBjb25zdCBzZWxlY3RlZEFjdGlvbjogYW55ID0gaXNOdW1lcmljSWRcbiAgICAgICAgPyB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IFN0cmluZyhvcHQuaWQpID09PSBsZWZ0VmFsdWUpXG4gICAgICAgIDogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHQubmFtZSA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHQudmFsdWUgPT09IGNvbmRpdGlvbkxlZnRcbiAgICAgICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSBzZWxlY3RlZEFjdGlvbi5pZDtcbiAgICAgICAgbmF0dXJhbFRleHRWYWx1ZSA9IHNlbGVjdGVkQWN0aW9uLm5hdHVyYWxUZXh0IHx8IHNlbGVjdGVkQWN0aW9uLm5hbWUgfHwgc2VsZWN0ZWRBY3Rpb24udmFsdWUgfHwgY29uZGl0aW9uTGVmdDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnkgPSB7fTtcbiAgICBjb25zdCB0ZXN0RGF0YUxpc3Q6IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBpZiAoYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMgJiYgYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB0ZXN0RGF0YUxpc3QucHVzaCh7IHRlc3REYXRhOiBTdHJpbmcodmFsdWUpLCB0ZXN0RGF0YVR5cGU6ICdyYXcnIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgYWN0aW9uID0gW25hdHVyYWxUZXh0VmFsdWUsIGNvbmRpdGlvbk9wZXJhdG9yLCBjb25kaXRpb25SaWdodF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBhY3Rpb24gfHwgKGJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlPy5uYXR1cmFsVGV4dCA/PyAnJyksXG4gICAgICAuLi4obmF0dXJhbFRleHRBY3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLihPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSksXG4gICAgICAuLi4odGVzdERhdGFMaXN0Lmxlbmd0aCA+IDAgJiYgeyB0ZXN0RGF0YUxpc3QgfSksXG4gICAgfTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IGNvbmRpdGlvbkxlZnQgPSBmb3JtVmFsdWVzLmNvbmRpdGlvbkxlZnQgPz8gJyc7XG4gICAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBmb3JtVmFsdWVzLmNvbmRpdGlvbk9wZXJhdG9yID8/ICdpcyc7XG4gICAgY29uc3QgY29uZGl0aW9uUmlnaHQgPSBmb3JtVmFsdWVzLmNvbmRpdGlvblJpZ2h0ID8/ICcnO1xuXG4gICAgLy8gRmluZCB0aGUgc2VsZWN0ZWQgbmF0dXJhbCB0ZXh0IGFjdGlvbiBhbmQgZ2V0IG5hdHVyYWxUZXh0IChub3QgSUQpXG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmF0dXJhbFRleHRWYWx1ZTogc3RyaW5nID0gY29uZGl0aW9uTGVmdDsgLy8gRGVmYXVsdCB0byBjb25kaXRpb25MZWZ0XG4gICAgXG4gICAgaWYgKGNvbmRpdGlvbkxlZnQgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBTdHJpbmcoY29uZGl0aW9uTGVmdCk7XG4gICAgICBjb25zdCBpc051bWVyaWNJZCA9ICFpc05hTihOdW1iZXIobGVmdFZhbHVlKSkgJiYgbGVmdFZhbHVlLnRyaW0oKSAhPT0gJyc7XG4gICAgICBcbiAgICAgIGxldCBzZWxlY3RlZEFjdGlvbjogYW55O1xuICAgICAgaWYgKGlzTnVtZXJpY0lkKSB7XG4gICAgICAgIC8vIEZpbmQgYnkgSUQgYW5kIGdldCBuYXR1cmFsVGV4dFxuICAgICAgICBzZWxlY3RlZEFjdGlvbiA9IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IGxlZnRWYWx1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmluZCBieSBuYXR1cmFsVGV4dCwgbmFtZSwgb3IgdmFsdWVcbiAgICAgICAgc2VsZWN0ZWRBY3Rpb24gPSB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMuZmluZChcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5uYXR1cmFsVGV4dCA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHRpb24ubmFtZSA9PT0gY29uZGl0aW9uTGVmdCB8fCBvcHRpb24udmFsdWUgPT09IGNvbmRpdGlvbkxlZnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSBzZWxlY3RlZEFjdGlvbi5pZDtcbiAgICAgICAgLy8gVXNlIG5hdHVyYWxUZXh0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBuYW1lIG9yIHZhbHVlXG4gICAgICAgIG5hdHVyYWxUZXh0VmFsdWUgPSBzZWxlY3RlZEFjdGlvbi5uYXR1cmFsVGV4dCB8fCBzZWxlY3RlZEFjdGlvbi5uYW1lIHx8IHNlbGVjdGVkQWN0aW9uLnZhbHVlIHx8IGNvbmRpdGlvbkxlZnQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENvbGxlY3QgdGVtcGxhdGUgdmFyaWFibGVzIHZhbHVlcyBmb3IgZXZlbnQgb2JqZWN0XG4gICAgY29uc3QgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnkgPSB7fTtcbiAgICAvLyBCdWlsZCB0ZXN0RGF0YUxpc3QgYXJyYXkgaW4gdGhlIG9yZGVyIG9mIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgIGNvbnN0IHRlc3REYXRhTGlzdDogQXJyYXk8eyB0ZXN0RGF0YTogc3RyaW5nOyB0ZXN0RGF0YVR5cGU6IHN0cmluZyB9PiA9IFtdO1xuICAgIFxuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgLy8gQWRkIHRvIGV2ZW50IG9iamVjdCAoZS5nLiwgc291cmNlX3ZhbHVlLCB0YXJnZXRfdmFsdWUpXG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgLy8gQWRkIHRvIHRlc3REYXRhTGlzdCBhcnJheSAob3JkZXIgbWF0dGVycyAtIG1haW50YWluIHRlbXBsYXRlIHZhcmlhYmxlIG9yZGVyKVxuICAgICAgICAgIHRlc3REYXRhTGlzdC5wdXNoKHtcbiAgICAgICAgICAgIHRlc3REYXRhOiBTdHJpbmcodmFsdWUpLFxuICAgICAgICAgICAgdGVzdERhdGFUeXBlOiAncmF3J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgY29uZGl0aW9uIHN0cmluZ1xuICAgIC8vIElmIHdlIGhhdmUgYSBuYXR1cmFsVGV4dEFjdGlvbklkICh0ZW1wbGF0ZSksIHVzZSB0aGUgZnVsbCBuYXR1cmFsVGV4dFZhbHVlIGFzLWlzIChpdCdzIGFscmVhZHkgYSBjb21wbGV0ZSBzZW50ZW5jZSlcbiAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIGZyb20gcGFydHM6IGNvbmRpdGlvbkxlZnQgKyBvcGVyYXRvciArIGNvbmRpdGlvblJpZ2h0XG4gICAgbGV0IHJhd0NvbmRpdGlvbjogc3RyaW5nO1xuICAgIGlmIChuYXR1cmFsVGV4dEFjdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRlbXBsYXRlLWJhc2VkIGNvbmRpdGlvbjogbmF0dXJhbFRleHRWYWx1ZSBpcyB0aGUgZnVsbCB0ZW1wbGF0ZSAoZS5nLiwgXCJDaGVjayB0aGUgdGV4dCAje2xhYmVsfSBpcyBwcmVzZW50IG9uIHRoZSBjdXJyZW50IHBhZ2VcIilcbiAgICAgIHJhd0NvbmRpdGlvbiA9IG5hdHVyYWxUZXh0VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1hbnVhbCBjb25kaXRpb246IGJ1aWxkIGZyb20gcGFydHNcbiAgICAgIHJhd0NvbmRpdGlvbiA9IFtuYXR1cmFsVGV4dFZhbHVlLCBjb25kaXRpb25PcGVyYXRvciwgY29uZGl0aW9uUmlnaHRdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNFZGl0aW5nQnJhbmNoUm93ID0gdGhpcy5lZGl0Q29udGV4dCA9PT0gJ2JyYW5jaFJvdyc7XG4gICAgY29uc3QgYnJhbmNoRm9yRWRpdCA9IGlzRWRpdGluZ0JyYW5jaFJvdyAmJiB0aGlzLmJyYW5jaGVzICYmIHRoaXMuYnJhbmNoZXMubGVuZ3RoID4gdGhpcy5lZGl0aW5nQnJhbmNoSW5kZXhcbiAgICAgID8gdGhpcy5icmFuY2hlc1t0aGlzLmVkaXRpbmdCcmFuY2hJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBpc0VkaXRpbmdFbHNlSWZCcmFuY2ggPSAhIWJyYW5jaEZvckVkaXQgJiYgYnJhbmNoRm9yRWRpdC50eXBlID09PSAnZWxzZS1pZic7XG5cbiAgICAvLyBGb3IgZGlzcGxheSBpbiB0aGUgaGVhZGVyLCBzdWJzdGl0dXRlICN7dmFyaWFibGV9IHBsYWNlaG9sZGVycyB3aXRoIEhUTUwgYmFkZ2VzIHVzaW5nIHRlbXBsYXRlVmFyaWFibGVzRGF0YS5cbiAgICAvLyBUaGlzIG1pcnJvcnMgdGhlIHJlbmRlcmVyIGJlaGF2aW9yIHNvIHVzZXJzIG5ldmVyIHNlZSByYXcgI3tsYWJlbH0gdGV4dCB3aGlsZSBlZGl0aW5nLlxuICAgIC8vIC0gRm9yIElGIChzdGVwIHJvdyAvIElGIGJyYW5jaCBlZGl0KSwgdXBkYXRlIG1haW4gY29uZGl0aW9uIGhlYWRlci5cbiAgICAvLyAtIEZvciBFTFNFIElGIGVkaXQsIHVwZGF0ZSBvbmx5IHRoYXQgYnJhbmNoJ3MgYWN0aW9uIHRleHQ7IGtlZXAgSUYgaGVhZGVyIHVuY2hhbmdlZC5cbiAgICBjb25zdCBmb3JtYXR0ZWRGb3JEaXNwbGF5ID0gdGhpcy5zdWJzdGl0dXRlVGVtcGxhdGVWYXJpYWJsZXNUb0h0bWxGb3JDb25kaXRpb24ocmF3Q29uZGl0aW9uLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpO1xuICAgIGlmIChpc0VkaXRpbmdFbHNlSWZCcmFuY2ggJiYgYnJhbmNoRm9yRWRpdCkge1xuICAgICAgLy8gVXBkYXRlIEVMU0UgSUYgYnJhbmNoIGFjdGlvbiBmb3IgaW1tZWRpYXRlIFVJIGZlZWRiYWNrXG4gICAgICAoYnJhbmNoRm9yRWRpdCBhcyBhbnkpLmFjdGlvbiA9IGZvcm1hdHRlZEZvckRpc3BsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gZm9ybWF0dGVkRm9yRGlzcGxheTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBwYXlsb2FkIGZvciBlYWNoIG5ld2x5IGFkZGVkIEVMU0UgSUYgKHNvIHBhcmVudCBjYW4gY2FsbCBQT1NUIHRoZW4gUFVUIHdoZW4gQXBwbHkgaXMgY2xpY2tlZClcbiAgICBjb25zdCBuZXdFbHNlSWZCcmFuY2hlcyA9IHRoaXMuZWxzZUlmQnJhbmNoZXMubWFwKGIgPT4gdGhpcy5idWlsZEVsc2VJZkJyYW5jaFBheWxvYWQoYikpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZ0Jhc2U6IENvbmRpdGlvblN0ZXBDb25maWcgJiB7XG4gICAgICBpZD86IHN0cmluZztcbiAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXI7XG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7XG4gICAgICB0ZXN0RGF0YUxpc3Q/OiBBcnJheTx7IHRlc3REYXRhOiBzdHJpbmc7IHRlc3REYXRhVHlwZTogc3RyaW5nIH0+O1xuICAgICAgbmV3RWxzZUlmQnJhbmNoZXM/OiBBcnJheTx7IGFjdGlvbjogc3RyaW5nOyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IHRlc3REYXRhTGlzdD86IEFycmF5PHsgdGVzdERhdGE6IHN0cmluZzsgdGVzdERhdGFUeXBlOiBzdHJpbmcgfT4gfT47XG4gICAgICBpc0Vsc2VJZkJyYW5jaD86IGJvb2xlYW47XG4gICAgICBwYXJlbnRDb25kaXRpb25JZD86IHN0cmluZztcbiAgICB9ID0ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICBzdGVwVHlwZTogdGhpcy5jb25maWcuc3RlcFR5cGUgfHwgU3RlcFR5cGVzLkNPTkRJVElPTl9JRiwgLy8gRW5zdXJlIHN0ZXBUeXBlIGlzIHNldFxuICAgICAgLi4uKG5hdHVyYWxUZXh0QWN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiB7IG5hdHVyYWxUZXh0QWN0aW9uSWQgfSBhcyBhbnkpLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRlbXBsYXRlVmFyaWFibGVzRGF0YSkubGVuZ3RoID4gMCAmJiB7IHRlbXBsYXRlVmFyaWFibGVzRGF0YSB9IGFzIGFueSksXG4gICAgICAuLi4odGVzdERhdGFMaXN0Lmxlbmd0aCA+IDAgJiYgeyB0ZXN0RGF0YUxpc3QgfSBhcyBhbnkpLFxuICAgICAgLi4uKG5ld0Vsc2VJZkJyYW5jaGVzLmxlbmd0aCA+IDAgJiYgeyBuZXdFbHNlSWZCcmFuY2hlcyB9IGFzIGFueSksXG4gICAgfTtcblxuICAgIGxldCB1cGRhdGVkQ29uZmlnOiB0eXBlb2YgdXBkYXRlZENvbmZpZ0Jhc2U7XG4gICAgaWYgKGlzRWRpdGluZ0Vsc2VJZkJyYW5jaCAmJiBicmFuY2hGb3JFZGl0ICYmIGJyYW5jaEZvckVkaXQuaWQgIT0gbnVsbCkge1xuICAgICAgLy8gRWRpdGluZyBleGlzdGluZyBFTFNFIElGIGJyYW5jaDogdGFyZ2V0IHRoYXQgYnJhbmNoJ3Mgc3RlcCBJRCBhbmQgc2VuZCByYXcgY29uZGl0aW9uIHNvIGJhY2tlbmQgdXBkYXRlcyB0aGUgYnJhbmNoIG9ubHkuXG4gICAgICB1cGRhdGVkQ29uZmlnID0ge1xuICAgICAgICAuLi51cGRhdGVkQ29uZmlnQmFzZSxcbiAgICAgICAgaWQ6IFN0cmluZyhicmFuY2hGb3JFZGl0LmlkKSxcbiAgICAgICAgY29uZGl0aW9uOiByYXdDb25kaXRpb24sXG4gICAgICAgIGlzRWxzZUlmQnJhbmNoOiB0cnVlLFxuICAgICAgICBwYXJlbnRDb25kaXRpb25JZDogU3RyaW5nKHRoaXMuY29uZmlnLmlkKSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJRiBjb25kaXRpb24gZWRpdCAoc3RlcCByb3cgb3IgSUYgYnJhbmNoIHJvdyk6IHVzZSBmb3JtYXR0ZWQgY29uZGl0aW9uIGZvciBkaXNwbGF5XG4gICAgICB1cGRhdGVkQ29uZmlnID0ge1xuICAgICAgICAuLi51cGRhdGVkQ29uZmlnQmFzZSxcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbixcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnIChpbmNsdWRlcyBuZXdFbHNlSWZCcmFuY2hlcyBzbyBwYXJlbnQgY2FuIGNyZWF0ZSBzdGVwcyBvbiBBcHBseSlcbiAgICBjb25zb2xlLmxvZygnQ29uZGl0aW9uLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcblxuICAgIHRoaXMuZWRpdENvbnRleHQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2FsIGhlbHBlciB0byBzdWJzdGl0dXRlICN7dmFyaWFibGV9IHBsYWNlaG9sZGVycyBpbiB0aGUgY29uZGl0aW9uIHRleHQgd2l0aCBIVE1MIGJhZGdlIHNwYW5zLlxuICAgKiBNaXJyb3JzIHRoZSBwb3J0YWwgcmVuZGVyZXIncyBzdWJzdGl0dXRlVGVtcGxhdGVWYXJpYWJsZXNUb0h0bWwgc28gaW5saW5lIGVkaXQgbW9kZSBuZXZlciBzaG93cyByYXcgI3tsYWJlbH0uXG4gICAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbEZvckNvbmRpdGlvbihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQgfHwgdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdGV4dDtcbiAgICBjb25zdCBkYXRhID0gdmFyaWFibGVzICYmIHR5cGVvZiB2YXJpYWJsZXMgPT09ICdvYmplY3QnID8gdmFyaWFibGVzIDoge307XG4gICAgY29uc3QgZXNjYXBlID0gKHY6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYudGV4dENvbnRlbnQgPSB2O1xuICAgICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gICAgfTtcbiAgICBjb25zdCBlbGVtZW50VmFycyA9IFsnbGFiZWwnLCAnZGVzY3JpcHRpb24nLCAnZWxlbWVudCcsICdzZWxlY3RvcicsICdhaV90YXNrJywgJ3F1ZXJ5JywgJ2N1c3RvbV9jb2RlJ107XG4gICAgY29uc3QgYXR0cmlidXRlVmFycyA9IFsnYXR0cmlidXRlJ107XG5cbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXCNcXHsoW159XSspXFx9L2csIChfLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gKGRhdGEgYXMgYW55KVtrZXldO1xuICAgICAgY29uc3QgZGlzcGxheVZhbCA9IHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IGtleTtcbiAgICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGUoZGlzcGxheVZhbCk7XG4gICAgICBpZiAoZWxlbWVudFZhcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cImVsZW1lbnRcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlVmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiYXR0cmlidXRlXCI+JHtlc2NhcGVkfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBlZGl0SW5EZXB0aC4gV2hlbiBicmFuY2ggaXMgcHJvdmlkZWQgKEVMU0UgSUYvRUxTRSBicmFuY2ggcm93KSwgdXNlIGJyYW5jaCdzIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgKiBhbmQgYnJhbmNoIGRpc3BsYXkgbnVtYmVyIGZvciBjb3JyZWN0IFwiRWRpdCBTdGVwIE5cIiB0aXRsZS4gV2hlbiBpc0NyZWF0ZU1vZGUgKG5ldyBFTFNFIElGKSwgbW9kYWwgc2hvd3MgXCJDcmVhdGUgSW4gZGVwdGhcIiBhbmQgY2FsbHMgY3JlYXRlIEFQSSBvbiBzYXZlLlxuICAgKi9cbiAgb25FZGl0SW5EZXB0aCh0ZW1wbGF0ZU92ZXJyaWRlPzogYW55LCBicmFuY2g/OiBDb25kaXRpb25CcmFuY2gsIGJyYW5jaEluZGV4PzogbnVtYmVyLCBpc0NyZWF0ZU1vZGU/OiBib29sZWFuLCBlbHNlSWZCcmFuY2g/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgICBsZXQgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICAgIGxldCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmIChicmFuY2ggIT0gbnVsbCAmJiBicmFuY2hJbmRleCAhPSBudWxsICYmIGJyYW5jaEluZGV4ID49IDAgJiYgIWlzQ3JlYXRlTW9kZSkge1xuICAgICAgLy8gQnJhbmNoIHJvdyAoRUxTRSBJRi9FTFNFKSAtIGV4aXN0aW5nIGJyYW5jaDogdXNlIG5lc3RlZCBjb25kaXRpb24gc3RlcCBpZiBwcmVzZW50LCBlbHNlIG1haW4gY29uZmlnIHdpdGggYnJhbmNoIGlkXG4gICAgICBjb25zdCBuZXN0ZWRDb25kaXRpb24gPSBicmFuY2gubmVzdGVkU3RlcHM/LlswXSBhcyBDb25kaXRpb25TdGVwQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgc3RlcCA9IChuZXN0ZWRDb25kaXRpb24gJiYgdGhpcy5pc0NvbmRpdGlvblN0ZXAobmVzdGVkQ29uZGl0aW9uKSlcbiAgICAgICAgPyBuZXN0ZWRDb25kaXRpb25cbiAgICAgICAgOiAoeyAuLi50aGlzLmNvbmZpZywgaWQ6IGJyYW5jaC5pZCAhPSBudWxsID8gU3RyaW5nKGJyYW5jaC5pZCkgOiB0aGlzLmNvbmZpZy5pZCB9IGFzIFRlc3RDYXNlU3RlcENvbmZpZyk7XG4gICAgICAvLyBEaXNwbGF5IGluZGV4OiBnZXRCcmFuY2hEaXNwbGF5TnVtYmVyKDEpPTkzIC0+IGluZGV4IDkyIGZvciBcIkVkaXQgU3RlcCA5M1wiXG4gICAgICBjb25zdCBkaXNwbGF5TnVtID0gdGhpcy5nZXRCcmFuY2hEaXNwbGF5TnVtYmVyKGJyYW5jaEluZGV4KTtcbiAgICAgIGluZGV4ID0gdHlwZW9mIGRpc3BsYXlOdW0gPT09ICdudW1iZXInID8gZGlzcGxheU51bSAtIDEgOiAodHlwZW9mIGRpc3BsYXlOdW0gPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoU3RyaW5nKGRpc3BsYXlOdW0pLCAxMCkgLSAxIDogMCk7XG4gICAgfSBlbHNlIGlmIChpc0NyZWF0ZU1vZGUpIHtcbiAgICAgIC8vIENyZWF0ZSBtb2RlIChuZXcgRUxTRSBJRiBicmFuY2gpIC0gZG9uJ3Qgc2V0IGluZGV4IHNvIG1vZGFsIHNob3dzIFwiQ3JlYXRlIFN0ZXBcIlxuICAgICAgc3RlcCA9IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZztcbiAgICAgIGluZGV4ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNYWluIHN0ZXAgcm93LCBJRiBicmFuY2hcbiAgICAgIGluZGV4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInXG4gICAgICAgID8gdGhpcy5pbmRleFxuICAgICAgICA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnbnVtYmVyJyA/IHRoaXMuc3RlcE51bWJlciA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHRoaXMuc3RlcE51bWJlciwgMTApIDogMCkpO1xuICAgICAgc3RlcCA9IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZztcbiAgICB9XG4gICAgY29uc3QgcGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4PzogbnVtYmVyOyB0ZW1wbGF0ZU92ZXJyaWRlPzogYW55OyBpc0NyZWF0ZU1vZGU/OiBib29sZWFuOyBjcmVhdGVNb2RlQnJhbmNoRGF0YT86IGFueSB9ID0ge1xuICAgICAgc3RlcCxcbiAgICAgIGluZGV4OiBpbmRleCAhPT0gdW5kZWZpbmVkID8gKGlzTmFOKGluZGV4KSA/IDAgOiBNYXRoLm1heCgwLCBpbmRleCkpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIGlmIChpc0NyZWF0ZU1vZGUgJiYgZWxzZUlmQnJhbmNoKSB7XG4gICAgICBwYXlsb2FkLmlzQ3JlYXRlTW9kZSA9IHRydWU7XG4gICAgICAvLyBQYXNzIHRlbXBsYXRlIHZhcmlhYmxlcyBmb3JtIGRhdGEgZm9yIGNyZWF0ZSBtb2RlXG4gICAgICBpZiAoZWxzZUlmQnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiBlbHNlSWZCcmFuY2guc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgICBwYXlsb2FkLmNyZWF0ZU1vZGVCcmFuY2hEYXRhID0ge1xuICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzRm9ybTogZWxzZUlmQnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybSxcbiAgICAgICAgICBzZWxlY3RlZFRlbXBsYXRlOiBlbHNlSWZCcmFuY2guc2VsZWN0ZWRUZW1wbGF0ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gY29uZGl0aW9uIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGU6ICdJRiAvIEVMU0UgU3RlcCBEZXRhaWxzJyxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKiogR2V0IHNlbGVjdCBjb25maWcgZm9yIGEgdGVtcGxhdGUgdmFyaWFibGUgKi9cbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGU6IGFueSwgYnJhbmNoSWRPcklzRWxzZTogc3RyaW5nIHwgYm9vbGVhbiA9IGZhbHNlKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgLy8gSWYgYnJhbmNoSWRPcklzRWxzZSBpcyBhIHN0cmluZywgaXQncyBhIGJyYW5jaCBJRDsgb3RoZXJ3aXNlIGl0J3MgYSBib29sZWFuIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgbGV0IGZvcm06IEZvcm1Hcm91cDtcbiAgICBpZiAodHlwZW9mIGJyYW5jaElkT3JJc0Vsc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSB0aGlzLmVsc2VJZkJyYW5jaGVzLmZpbmQoYiA9PiBiLmlkID09PSBicmFuY2hJZE9ySXNFbHNlKTtcbiAgICAgIGZvcm0gPSBicmFuY2g/LnRlbXBsYXRlVmFyaWFibGVzRm9ybSB8fCB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybSA9IGJyYW5jaElkT3JJc0Vsc2UgPyAodGhpcy5lbHNlSWZCcmFuY2hlc1swXT8udGVtcGxhdGVWYXJpYWJsZXNGb3JtIHx8IHRoaXMuZmIuZ3JvdXAoe30pKSA6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZvcm0gJiYgZm9ybS5nZXQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICBmb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwiJ2NxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gJyArIChpc05lc3RlZCA/ICcgY3FhLXBsLVsyNHB4XScgOiAnJylcIj5cbiAgPCEtLSBJbmxpbmUgRWRpdCBNb2RlOiBzaG93biBpbiBmaXJzdCBicmFuY2ggcm93IGJlbG93IHdoZW4gdXNlciBjbGlja3MgRWRpdCBmcm9tIGJyYW5jaCByb3cgKHRvcCBibG9jayBoaWRkZW4pIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZmFsc2UgJiYgaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8IS0tIEZpcnN0IFJvdzogQ09ORElUSU9OIHRhZywgYXV0b2NvbXBsZXRlLCBJRi9FTFNFIGluZGljYXRvcnMsIEVkaXQgSW4gZGVwdGgsIENhbmNlbC9BcHBseSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LWdyb3dcIj5cbiAgICAgICAgPCEtLSBDT05ESVRJT04gVGFnIChvcmFuZ2UpIC0tPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyNFQTU4MENdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy1bI0ZGRURENV1cIj5cbiAgICAgICAgICBDT05ESVRJT05cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwhLS0gRmlyc3QgZmllbGQ6IGxlZnQgb3BlcmFuZCAoZS5nLiBVc2VydHlwZSkgLSBhdXRvY29tcGxldGUgd2l0aCBJRl9DT05ESVRJT04gbmF0dXJhbCB0ZXh0IGFjdGlvbnMgLS0+XG4gICAgICAgIDxjcWEtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgKm5nSWY9XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiY29uZGl0aW9uTGVmdEF1dG9jb21wbGV0ZU9wdGlvbnNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25MZWZ0RGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb25MZWZ0JywgJGV2ZW50KVwiXG4gICAgICAgICAgKG9wdGlvblNlbGVjdCk9XCJvbkNvbmRpdGlvbkxlZnRTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ29uZGl0aW9uXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cblxuICAgICAgICA8IS0tIFNlY29uZCBSb3c6IFRlbXBsYXRlIFZhcmlhYmxlcyBTZWN0aW9uIChzaG93biB3aGVuIHRlbXBsYXRlIGlzIHNlbGVjdGVkLCBpbmxpbmUgYmVmb3JlIEVkaXQgSW4gZGVwdGgpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUZW1wbGF0ZSAmJiB0ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiB0ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIE5vbi1ib29sZWFuIHZhcmlhYmxlcyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbicgJiYgdmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJ1wiPlxuICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciBzZWxlY3QgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSA9PT0gJ3R5cGUnIHx8IHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycgfHwgdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWdGb3JWYXJpYWJsZSh2YXJpYWJsZSwgZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gVGV4dCBJbnB1dCBmb3Igb3RoZXIgdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ3R5cGUnICYmIHZhcmlhYmxlLm5hbWUgIT09ICdzY3JvbGxUbycgJiYgIXZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgJyArIHZhcmlhYmxlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJRiAvIEVMU0UgaW5kaWNhdG9ycyAtLT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI0RDRkNFN10gY3FhLXRleHQtWyMwMDgyMzZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjQjlGOENGXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYuNjY2MzQgMkwyLjk5OTY3IDUuNjY2NjdMMS4zMzMwMSA0XCIgc3Ryb2tlPVwiIzAwODIzNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICBJRlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwhLS0gQWRkIEVMU0UgSUYgYnV0dG9uIC0gZGlzYWJsZWQgd2hlbiBFTFNFIGFscmVhZHkgZXhpc3RzIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRWxzZSgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgW2NsYXNzLmNxYS1jdXJzb3ItcG9pbnRlcl09XCIhaGFzRWxzZUJyYW5jaFwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwiaGFzRWxzZUJyYW5jaFwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTYwXT1cImhhc0Vsc2VCcmFuY2hcIj5cbiAgICAgICAgICBBZGQgRUxTRSBJRlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSBBZGQgRWxzZSBidXR0b24gLSBkaXNhYmxlZCB3aGVuIEVMU0UgYWxyZWFkeSBleGlzdHMgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib25BZGRFbHNlQnJhbmNoKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJoYXNFbHNlQnJhbmNoXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNjBdPVwiaGFzRWxzZUJyYW5jaFwiPlxuICAgICAgICAgIEFkZCBFTFNFXG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPlxuICAgICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgICAgPC9hPiAgICAgIFxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IGJ1dHRvbnMgLSBzaG93biBvbiBJRiByb3cgd2hlbiBubyBFTFNFIElGIGJyYW5jaGVzIGFyZSBwcmVzZW50IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImVsc2VJZkJyYW5jaGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICBcbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIHJvdzogYWx3YXlzIHZpc2libGUgKG5vIHRlbXBsYXRlIGVkaXQgaGVyZTsgdGVtcGxhdGUgZWRpdCBvbmx5IGluIGJyYW5jaCByb3cgYmVsb3cpLiBIYXMgZWRpdC9kZWxldGUuIC0tPlxuICA8ZGl2IFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgY3FhLXB4LTQgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnJylcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgIDwhLS0gQ2hlY2tib3gvRHJhZyBIYW5kbGUgY29sdW1uIC0gc2FtZSBzdHJ1Y3R1cmUgYXMgbm9ybWFsLXN0ZXAgZm9yIGFsaWdubWVudCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UgYW5kIG5vdCBpbnNpZGUgc3RlcCBncm91cCAtIGhpZGUgZm9yIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcykgLS0+XG4gICAgPGxhYmVsICpuZ0lmPVwiZWRpdGFibGUgJiYgIWlzUmVvcmRlciAmJiAhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stY29uZGl0aW9uXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gSUYvRUxTRSBJY29uIC0tPlxuICAgIDxkaXY+PHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNCAyVjEwXCIgc3Ryb2tlPVwiIzdCMzMwNlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTIgNkMxMy4xMDQ2IDYgMTQgNS4xMDQ1NyAxNCA0QzE0IDIuODk1NDMgMTMuMTA0NiAyIDEyIDJDMTAuODk1NCAyIDEwIDIuODk1NDMgMTAgNEMxMCA1LjEwNDU3IDEwLjg5NTQgNiAxMiA2WlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzdCMzMwNlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNNCAxNEM1LjEwNDU3IDE0IDYgMTMuMTA0NiA2IDEyQzYgMTAuODk1NCA1LjEwNDU3IDEwIDQgMTBDMi44OTU0MyAxMCAyIDEwLjg5NTQgMiAxMkMyIDEzLjEwNDYgMi44OTU0MyAxNCA0IDE0WlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzdCMzMwNlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDZDMTIgNy41OTEzIDExLjM2NzkgOS4xMTc0MiAxMC4yNDI2IDEwLjI0MjZDOS4xMTc0MiAxMS4zNjc5IDcuNTkxMyAxMiA2IDEyXCIgc3Ryb2tlPVwiIzdCMzMwNlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz48L2Rpdj5cblxuICAgIDwhLS0gSUYvRUxTRSBMYWJlbCAtLT5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjN0IzMzA2XSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctbm9uZVwiPlxuICAgICAgQ09ORElUSU9OXG4gICAgPC9zcGFuPlxuXG4gICAgPCEtLSBTdGVwIHJvdzogcmVhZC1vbmx5IChjb25kaXRpb24sIHN1bW1hcnksIGFjdGlvbnMpIHdoZW4gbm90IGVkaXRpbmcgc3RlcCByb3cgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRDb250ZXh0ICE9PSAnc3RlcFJvdydcIj5cbiAgICAgIDwhLS0gRmlyc3QgY29uZGl0aW9uIHRleHQgYXMgcGxhaW4gdGV4dCAobm8gSFRNTCkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Q29uZGl0aW9uUGxhaW5UZXh0KClcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1tbC0yIGNxYS1mbGV4LTEgY3FhLWZsZXgtd3JhcCBjcWEtcHgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10cnVuY2F0ZVwiPnt7IGdldENvbmRpdGlvblBsYWluVGV4dCgpIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWwtYXV0byBjcWEtZmxleC13cmFwIGNxYS1weC0xXCI+XG4gICAgICAgIDwhLS0gQnJhbmNoIHR5cGUgYmFkZ2VzOiBJRiwgRUxTRSBJRiAod2l0aCBjb3VudCksIEVMU0UgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGJhZGdlIG9mIGdldEJyYW5jaFR5cGVCYWRnZXMoKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtICcgKyBiYWRnZS5iYWRnZUNsYXNzXCI+XG4gICAgICAgICAgICB7eyBiYWRnZS5sYWJlbCB9fVxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhZGdlLmNvdW50XCI+K3t7IGJhZGdlLmNvdW50IH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmVcIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG4gICAgICAgIDwhLS0gQ29weSBidXR0b24gaGlkZGVuIGZvciBub3cgLS0+XG4gICAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBsYXN0IHNvIGFsaWduZWQgYWNyb3NzIGFsbCBzdGVwcywgZm9ybWF0OiAyNSBGZWIgMjAyNiAtLT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cInN0ZXAtZGF0ZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWwtYXV0byBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdGVwIHJvdzogZWRpdCBtb2RlIChDT05ESVRJT04sIGF1dG9jb21wbGV0ZSwgSUYsIEFkZCBFTFNFIElGLCBBZGQgRUxTRSwgRWRpdCBJbiBkZXB0aCwgQ2FuY2VsLCBBcHBseSkgd2hlbiBlZGl0Q29udGV4dCA9PT0gJ3N0ZXBSb3cnIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Q29udGV4dCA9PT0gJ3N0ZXBSb3cnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLTIgY3FhLWZsZXgtMSBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bI0VBNTgwQ10gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkZFREQ1XVwiPkNPTkRJVElPTjwvc3Bhbj5cbiAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJjb25kaXRpb25MZWZ0QXV0b2NvbXBsZXRlT3B0aW9uc1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvbkxlZnREaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2NvbmRpdGlvbkxlZnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAob3B0aW9uU2VsZWN0KT1cIm9uQ29uZGl0aW9uTGVmdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDb25kaXRpb25cIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjRENGQ0U3XSBjcWEtdGV4dC1bIzAwODIzNl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNCOUY4Q0ZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5JRjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkRWxzZSgpXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI2ZmZjllOV0gY3FhLXRleHQtWyNFNjUxMDBdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjZmVlY2JkXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtY3Vyc29yLXBvaW50ZXJcIj5BZGQgRUxTRSBJRjwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRFbHNlQnJhbmNoKClcIiBbZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIiBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFtjbGFzcy5jcWEtb3BhY2l0eS02MF09XCJoYXNFbHNlQnJhbmNoXCI+QWRkIEVMU0U8L2J1dHRvbj5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+RWRpdCBJbiBkZXB0aDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPjwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRUxTRSBJRiBTZWN0aW9ucyBpbiBFZGl0IE1vZGUgLSBzaG93biBiZWxvdyBzdGVwIHJvdyB3aGVuIGVkaXRpbmcgYW5kIGhhcyBFTFNFIElGIGJyYW5jaGVzIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgZWxzZUlmQnJhbmNoZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIj5cbiAgICAgIDwhLS0gRmlyc3QgUm93OiBSZW1vdmUgRUxTRSBJRiBidXR0b24sIGF1dG9jb21wbGV0ZSwgRWRpdCBJbiBkZXB0aCwgQ2FuY2VsL0FwcGx5IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LWdyb3dcIj5cbiAgICAgICAgICA8IS0tIFJlbW92ZSBFTFNFIElGIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUVsc2UoYnJhbmNoLmlkKVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjRjNGNEY2XSBjcWEtdGV4dC1bIzk5QTFBRl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctWyNFNUU3RUJdIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiPlxuICAgICAgICAgICAgUmVtb3ZlIEVMU0UgSUZcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gRUxTRSBJRiBhdXRvY29tcGxldGUgZmllbGQ6IHNhbWUgYXMgSUYgY29uZGl0aW9uIC0tPlxuICAgICAgICAgIDxjcWEtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAqbmdJZj1cImJyYW5jaC5mb3JtXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJicmFuY2guZm9ybS5nZXQoJ2NvbmRpdGlvbkxlZnQnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImJyYW5jaC5mb3JtLmdldCgnY29uZGl0aW9uTGVmdCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25FbHNlQ29uZGl0aW9uTGVmdFNlbGVjdCgkZXZlbnQsIGJyYW5jaC5pZClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY29tcGFjdF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFNlY29uZCBSb3c6IEVMU0UgSUYgVGVtcGxhdGUgVmFyaWFibGVzIFNlY3Rpb24gKHNob3duIHdoZW4gdGVtcGxhdGUgaXMgc2VsZWN0ZWQsIGlubGluZSBiZWZvcmUgRWRpdCBJbiBkZXB0aCkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJyYW5jaC5zZWxlY3RlZFRlbXBsYXRlICYmIGJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlcyAmJiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiBicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNcIj5cbiAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImJyYW5jaC50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYnJhbmNoLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gTm9uLWJvb2xlYW4gdmFyaWFibGVzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhcmlhYmxlLm5hbWUgIT09ICdjdXN0b21fY29kZSdcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSA9PT0gJ3R5cGUnIHx8IHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycgfHwgdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlLCBicmFuY2guaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICd0eXBlJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2Nyb2xsVG8nICYmICF2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJicmFuY2gudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhcmlhYmxlLmxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCh1bmRlZmluZWQsIGdldEJyYW5jaEJ5SWQoYnJhbmNoLmlkKSwgZ2V0QnJhbmNoSW5kZXhCeUlkKGJyYW5jaC5pZCkpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPlxuICAgICAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSBidXR0b25zIC0gc2hvd24gaW4gbGFzdCBFTFNFIElGIHJvdyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImkgPT09IGVsc2VJZkJyYW5jaGVzLmxlbmd0aCAtIDFcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCIgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IHdpdGggQnJhbmNoZXMgKHNob3duIHdoZW4gZXhwYW5kZWQgb3Igd2hlbiBlZGl0aW5nIHNvIGVkaXQgVUkgYXBwZWFycyBpbiBmaXJzdCBicmFuY2ggcm93KSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkIHx8IGlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPCEtLSBCcmFuY2hlcyAoSUYgVFJVRSwgRUxTRSBJRiwgRUxTRSkgLS0+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYnJhbmNoIG9mIGJyYW5jaGVzOyBsZXQgYnJhbmNoSW5kZXggPSBpbmRleFwiIGNsYXNzPVwiY29uZGl0aW9uLWJyYW5jaC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW2F0dHIuZGF0YS1icmFuY2gtaWRdPVwiYnJhbmNoPy5pZFwiPlxuICAgICAgPCEtLSBFZGl0IG1vZGUgKElGIFRSVUUgYnJhbmNoKTogc2hvd3MgQ09ORElUSU9OLCBhdXRvY29tcGxldGUsIElGLCBBZGQgRUxTRSBJRiwgQWRkIEVMU0UsIEVkaXQgSW4gZGVwdGgsIEVkaXQvRGVsZXRlLCBDYW5jZWwvQXBwbHkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiZWRpdENvbnRleHQgPT09ICdicmFuY2hSb3cnICYmIGJyYW5jaEluZGV4ID09PSAwICYmIGVkaXRpbmdCcmFuY2hJbmRleCA9PT0gMFwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtjbGFzc109XCInY3FhLXB4LTEgY3FhLXB5LTIuNSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtd3JhcCAnICsgZ2V0QnJhbmNoVGV4dENvbG9yKGJyYW5jaCkgKyAnICcgKyBnZXRCcmFuY2hDb2xvckNsYXNzKGJyYW5jaClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LWdyb3cgY3FhLWZsZXgtd3JhcCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLW1pbi13LVszMnB4XSBjcWEtZmxleC1zaHJpbmstMFwiPnt7IGdldEJyYW5jaERpc3BsYXlOdW1iZXIoYnJhbmNoSW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGdldEJyYW5jaExhYmVsKGJyYW5jaCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LVsjRUE1ODBDXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctWyNGRkVERDVdXCI+Q09ORElUSU9OPC9zcGFuPlxuICAgICAgICAgIDxjcWEtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25MZWZ0RGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2NvbmRpdGlvbkxlZnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25MZWZ0U2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1iZy1bI0RDRkNFN10gY3FhLXRleHQtWyMwMDgyMzZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjQjlGOENGXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+SUY8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkRWxzZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1jdXJzb3ItcG9pbnRlclwiPkFkZCBFTFNFIElGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkRWxzZUJyYW5jaCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIiBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFtjbGFzcy5jcWEtb3BhY2l0eS02MF09XCJoYXNFbHNlQnJhbmNoXCI+QWRkIEVMU0U8L2J1dHRvbj5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKHVuZGVmaW5lZCwgYnJhbmNoLCAwKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPkVkaXQgSW4gZGVwdGg8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIiAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBFZGl0IG1vZGUgKEVMU0UgSUYgYnJhbmNoKTogc2hvd3MgQ09ORElUSU9OLCBhdXRvY29tcGxldGUsIEFkZCBFTFNFIElGIC8gQWRkIEVMU0UsIEVkaXQgSW4gZGVwdGgsIENhbmNlbC9BcHBseSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlZGl0Q29udGV4dCA9PT0gJ2JyYW5jaFJvdycgJiYgYnJhbmNoSW5kZXggPT09IGVkaXRpbmdCcmFuY2hJbmRleCAmJiBicmFuY2gudHlwZSA9PT0gJ2Vsc2UtaWYnXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW2NsYXNzXT1cIidjcWEtcHgtMSBjcWEtcHktMi41IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwICcgKyBnZXRCcmFuY2hUZXh0Q29sb3IoYnJhbmNoKSArICcgJyArIGdldEJyYW5jaENvbG9yQ2xhc3MoYnJhbmNoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3JvdyBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdIGNxYS1mbGV4LXNocmluay0wXCI+e3sgZ2V0QnJhbmNoRGlzcGxheU51bWJlcihicmFuY2hJbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyNFQTU4MENdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy1bI0ZGRURENV1cIj5DT05ESVRJT048L3NwYW4+XG4gICAgICAgICAgPCEtLSBFTFNFIElGIGNvbmRpdGlvbiBhdXRvY29tcGxldGU6IHNhbWUgb3B0aW9ucyBhbmQgdmFsdWUgbW9kZWwgYXMgSUYsIGJ1dCBpbml0aWFsaXplZCBmcm9tIHRoaXMgYnJhbmNoJ3MgY29uZGl0aW9uIC0tPlxuICAgICAgICAgIDxjcWEtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbmRpdGlvbkxlZnRBdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25MZWZ0RGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2NvbmRpdGlvbkxlZnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25MZWZ0U2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkRWxzZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWJnLVsjZmZmOWU5XSBjcWEtdGV4dC1bI0U2NTEwMF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNmZWVjYmRdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1jdXJzb3ItcG9pbnRlclwiPkFkZCBFTFNFIElGPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkRWxzZUJyYW5jaCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaGFzRWxzZUJyYW5jaFwiIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtYmctWyNmZmY5ZTldIGNxYS10ZXh0LVsjRTY1MTAwXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2ZlZWNiZF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIiBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFoYXNFbHNlQnJhbmNoXCIgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwiaGFzRWxzZUJyYW5jaFwiIFtjbGFzcy5jcWEtb3BhY2l0eS02MF09XCJoYXNFbHNlQnJhbmNoXCI+QWRkIEVMU0U8L2J1dHRvbj5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKHVuZGVmaW5lZCwgYnJhbmNoLCBicmFuY2hJbmRleCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5FZGl0IEluIGRlcHRoPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCIgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQnJhbmNoIEhlYWRlciAocmVhZC1vbmx5KTogZGlzcGxheSB3aGVuIG5vdCBlZGl0aW5nIHRoaXMgYnJhbmNoIHJvdyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlZGl0Q29udGV4dCAhPT0gJ2JyYW5jaFJvdycgfHwgYnJhbmNoSW5kZXggIT09IGVkaXRpbmdCcmFuY2hJbmRleFwiXG4gICAgICAgIFtjbGFzc109XCInY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtanVzdGlmeS1iZXR3ZWVuICcgKyBnZXRCcmFuY2hUZXh0Q29sb3IoYnJhbmNoKSArICcgJyArIGdldEJyYW5jaENvbG9yQ2xhc3MoYnJhbmNoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtZ3JvdyBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdIGNxYS1mbGV4LXNocmluay0wXCI+e3sgZ2V0QnJhbmNoRGlzcGxheU51bWJlcihicmFuY2hJbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEJyYW5jaENvbmRpdGlvbkRpc3BsYXkoYnJhbmNoKVwiIFtpbm5lckhUTUxdPVwiZ2V0QnJhbmNoQ29uZGl0aW9uRGlzcGxheShicmFuY2gpXCIgKGNsaWNrKT1cIm9uQ29uZGl0aW9uQWN0aW9uQ2xpY2soJGV2ZW50LCBicmFuY2gpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiPjwvc3Bhbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheShicmFuY2gpLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEJyYW5jaEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoYnJhbmNoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Db25kaXRpb25BY3Rpb25DbGljaygkZXZlbnQsIGJyYW5jaClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGl0ZW0udmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEVkaXQgb24gZmlyc3QgYnJhbmNoIChJRiBUUlVFKSBhbmQgRUxTRSBJRjsgRGVsZXRlIG9uIGZpcnN0ID0gd2hvbGUgc3RlcCwgb24gRUxTRSBJRi9FTFNFID0gdGhhdCBicmFuY2ggb25seSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRhYmxlICYmICFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImJyYW5jaEluZGV4ID09PSAwIHx8IGJyYW5jaC50eXBlID09PSAnZWxzZS1pZidcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEZyb21CcmFuY2hSb3coYnJhbmNoSW5kZXgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImJyYW5jaEluZGV4ID09PSAwID8gb25EZWxldGUoKSA6IG9uRGVsZXRlQnJhbmNoKGJyYW5jaCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwie3sgYnJhbmNoSW5kZXggPT09IDAgPyAnRGVsZXRlIHN0ZXAnIDogJ0RlbGV0ZSBicmFuY2gnIH19XCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiAqbmdJZj1cImdldEJyYW5jaENyZWF0ZWREYXRlKGJyYW5jaClcIiBjbGFzcz1cInN0ZXAtZGF0ZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZmxleC1zaHJpbmstMCBjcWEtbWwtYXV0b1wiPnt7IGdldEJyYW5jaENyZWF0ZWREYXRlKGJyYW5jaCkgfCBkYXRlOidkIE1NTSB5eXl5JyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNUQVJUIG1hcmtlciBwZXIgYnJhbmNoOiBTVEFSVCBJRiwgU1RBUlQgRUxTRSBJRiwgb3IgU1RBUlQgRUxTRSAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNFwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjN0IzMzA2XSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzdCMzMwNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0U3RhcnRCcmFuY2hMYWJlbChicmFuY2gpIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzdCMzMwNl0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCcmFuY2ggQ29udGVudCAoTmVzdGVkIFN0ZXBzIOKAkyByZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgIFtpc0luc2lkZVN0ZXBHcm91cF09XCJpc0luc2lkZVN0ZXBHcm91cFwiXG4gICAgICAgICAgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgW2VkaXRhYmxlXT1cImVkaXRhYmxlXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25CcmFuY2hTdGVwQ2hhbmdlKCRldmVudC5icmFuY2gsICRldmVudC5zdGVwLCAkZXZlbnQuc3RlcEluZGV4KVwiXG4gICAgICAgICAgKGFkZFN0ZXBGb3JCcmFuY2gpPVwib25BZGRTdGVwKCRldmVudC5icmFuY2gpXCJcbiAgICAgICAgICAoYWRkU3RlcEZvckxvb3ApPVwib25BZGRTdGVwRm9yTG9vcCgkZXZlbnQsIGJyYW5jaClcIlxuICAgICAgICAgIChkZWxldGVTdGVwV2l0aEJyYW5jaCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LmJyYW5jaCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkT3BlbkV4dGVybmFsKCRldmVudClcIlxuICAgICAgICAgIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAobGluayk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZER1cGxpY2F0ZSgkZXZlbnQsIHN0ZXApXCJcbiAgICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApKTsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50KTsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHN0ZXBVcGRhdGUpPVwic3RlcFVwZGF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoY2xpY2tBY3Rpb24pPVwib25OZXN0ZWRDbGlja0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBuZXN0ZWQtc3RlcC1kcm9wLWxpc3RcIlxuICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJicmFuY2gubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwID8gNTIgOiBudWxsXCJcbiAgICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50LCBicmFuY2gpXCI+XG4gICAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIGJyYW5jaC5uZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXJcbiAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2JyYW5jaF09XCJicmFuY2hcIlxuICAgICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2lzSW5zaWRlU3RlcEdyb3VwXT1cImlzSW5zaWRlU3RlcEdyb3VwXCJcbiAgICAgICAgICAgIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICAgIFthZGRTdGVwQmV0d2VlbkFib3ZlXT1cImFkZFN0ZXBCZXR3ZWVuQWJvdmVcIlxuICAgICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtlZGl0YWJsZV09XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZSgkZXZlbnQuYnJhbmNoLCAkZXZlbnQuc3RlcCwgJGV2ZW50LnN0ZXBJbmRleClcIlxuICAgICAgICAgICAgKGFkZFN0ZXBGb3JCcmFuY2gpPVwib25BZGRTdGVwKCRldmVudC5icmFuY2gpXCJcbiAgICAgICAgICAgIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wKCRldmVudCwgYnJhbmNoKVwiXG4gICAgICAgICAgICAoZGVsZXRlU3RlcFdpdGhCcmFuY2gpPVwib25EZWxldGVTdGVwKCRldmVudC5icmFuY2gsICRldmVudC5zdGVwSW5kZXgpXCJcbiAgICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRPcGVuRXh0ZXJuYWwoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobGluayk9XCJvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIlxuICAgICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCkpOyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCk7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbkJyYW5jaFN0ZXBDaGFuZ2UoYnJhbmNoLCBzdGVwLCBpKVwiXG4gICAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uQnJhbmNoU3RlcENoYW5nZShicmFuY2gsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25CcmFuY2hTdGVwQ2hhbmdlKGJyYW5jaCwgc3RlcCwgaSlcIlxuICAgICAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHN0ZXBVcGRhdGUpPVwic3RlcFVwZGF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrQWN0aW9uKT1cIm9uTmVzdGVkQ2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1wdHkgYnJhbmNoIChJRiAvIEVMU0UgSUYgLyBFTFNFKTogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBubyBzdGVwcywgc2FtZSBhcyBsb29wIHN0ZXAuXG4gICAgICAgICAgIFdoZW4gcmVuZGVyZWQgaW5zaWRlIGEgc3RlcCBncm91cCBvciB3aGVuIHJlb3JkZXJpbmcsIGhpZGUgdGhpcyBBZGQgYnV0dG9uIGVudGlyZWx5LiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJicmFuY2gubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwICYmIGVkaXRhYmxlICYmICFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJjb25kaXRpb24tYnJhbmNoLWVtcHR5IGNxYS1taW4taC1bNTJweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBsLTQgY3FhLXByLTRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcChicmFuY2gpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFthdHRyLnRpdGxlXT1cIidBZGQgc3RlcCB0byAnICsgZ2V0QnJhbmNoTGFiZWwoYnJhbmNoKVwiXG4gICAgICAgICAgY2xhc3M9XCJjb25kaXRpb24tYnJhbmNoLWVtcHR5LWFkZFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIyXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDEySDE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOC41VjE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFTkQgbWFya2VyIHBlciBicmFuY2g6IEVORCBJRiwgRU5EIEVMU0UgSUYsIG9yIEVORCBFTFNFIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00XCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyM3QjMzMDZdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjN0IzMzA2XSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRFbmRCcmFuY2hMYWJlbChicmFuY2gpIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzdCMzMwNl0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEVORCBDT05ESVRJT046IGZpbmFsIG1hcmtlciBhZnRlciBhbGwgYnJhbmNoZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00XCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjN0IzMzA2XSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM3QjMzMDZdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPkVORCBDT05ESVRJT048L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzdCMzMwNl0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19