@cqa-lib/cqa-ui 1.1.389 → 1.1.391

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.
@@ -325,10 +325,10 @@ export class TestCaseStepGroupComponent {
325
325
  /** Max length for start/end step number in summary; beyond this use local indices (1 to count). */
326
326
  TestCaseStepGroupComponent.MAX_STEP_NUMBER_DISPLAY_LENGTH = 20;
327
327
  TestCaseStepGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseStepGroupComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
328
- TestCaseStepGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseStepGroupComponent, selector: "cqa-test-case-step-group", inputs: { config: "config", id: "id", stepNumber: "stepNumber", index: "index", groupName: "groupName", description: "description", reusable: "reusable", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", editable: "editable", selected: "selected", isDuplicating: "isDuplicating", loading: "loading", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", groupNameChange: "groupNameChange", descriptionChange: "descriptionChange", reusableChange: "reusableChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", openExternal: "openExternal", edit: "edit", editInDepth: "editInDepth", link: "link", duplicate: "duplicate", delete: "delete", viewDetails: "viewDetails", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", addStepBetweenClick: "addStepBetweenClick", addStepForLoop: "addStepForLoop", selectionChange: "selectionChange", deleteBranch: "deleteBranch" }, 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'\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Step Group Header -->\n <div [class]=\"'step-row cqa-flex cqa-gap-3 cqa-items-center cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4') + (config?.shouldSkip ? ' cqa-step-skipped' : '')\" [style.opacity]=\"config?.shouldSkip ? '0.6' : null\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - step groups inside step groups cannot be reordered) -->\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-step-group\" />\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\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Folder Icon -->\n <div>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 15C15.3978 15 15.7794 14.842 16.0607 14.5607C16.342 14.2794 16.5 13.8978 16.5 13.5V6C16.5 5.60217 16.342 5.22064 16.0607 4.93934C15.7794 4.65804 15.3978 4.5 15 4.5H9.075C8.82413 4.50246 8.57666 4.44196 8.35523 4.32403C8.13379 4.20611 7.94547 4.03453 7.8075 3.825L7.2 2.925C7.06342 2.7176 6.87748 2.54736 6.65887 2.42955C6.44027 2.31174 6.19583 2.25004 5.9475 2.25H3C2.60218 2.25 2.22064 2.40804 1.93934 2.68934C1.65804 2.97064 1.5 3.35218 1.5 3.75V13.5C1.5 13.8978 1.65804 14.2794 1.93934 14.5607C2.22064 14.842 2.60218 15 3 15H15Z\"\n fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Group Name and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-gap-[2px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Group Name Input -->\n <p class=\"cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[18px] cqa-font-bold\">{{groupName}}</p>\n <!-- Reusable Tag -->\n <span *ngIf=\"reusable\"\n class=\"cqa-px-2 cqa-py-[1.5px] cqa-rounded-lg cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#D8D9FC] cqa-border cqa-border-solid cqa-border-[#8A8CF4]\">\n Reusable\n </span>\n </div>\n\n <!-- Description -->\n <p class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">{{description}}</p>\n </div>\n\n <!-- Steps Summary and Action Icons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-self-center\">\n <span *ngIf=\"config?.shouldSkip\" 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] cqa-flex-shrink-0\">Skipped</span>\n <!-- Action Icons - placed first -->\n <div *ngIf=\"editable && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-1.5 cqa-pr-2\">\n\n <!-- Edit Icon -->\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onSkipToggle(); $event.stopPropagation()\" [attr.title]=\"config?.shouldSkip ? 'Unskip step' : 'Skip step'\" [class.cqa-text-[#1447E6]]=\"config?.shouldSkip\" 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\">\n <path d=\"M8.25 8.75C9.2165 8.75 10 7.9665 10 7C10 6.0335 9.2165 5.25 8.25 5.25C7.2835 5.25 6.5 6.0335 6.5 7C6.5 7.9665 7.2835 8.75 8.25 8.75Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.75033 2.91663H5.25033C2.99516 2.91663 1.16699 4.7448 1.16699 6.99996C1.16699 9.25512 2.99516 11.0833 5.25033 11.0833H8.75033C11.0055 11.0833 12.8337 9.25512 12.8337 6.99996C12.8337 4.7448 11.0055 2.91663 8.75033 2.91663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Link Icon -->\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_609_26588)\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_609_26588\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> -->\n\n <!-- Duplicate Icon -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n\n <!-- Delete Icon -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- External Link Icon -->\n <button type=\"button\" (click)=\"onOpenExternal(); $event.stopPropagation()\" title=\"Open in new tab\"\n class=\"cqa-p-0 cqa-text-[#99999E] hover:cqa-text-[#1447E6]\">\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 8.66667V12.6667C12 13.0203 11.8595 13.3594 11.6095 13.6095C11.3594 13.8595 11.0203 14 10.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V5.33333C2 4.97971 2.14048 4.64057 2.39052 4.39052C2.64057 4.14048 2.97971 4 3.33333 4H7.33333M10 2H14M14 2V6M14 2L6.66667 9.33333\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Steps Summary (show loader when loading on expand) -->\n <span *ngIf=\"loading || config?.loading\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 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 <span class=\"cqa-inline-block cqa-w-3 cqa-h-3 cqa-border-2 cqa-border-solid cqa-border-[#3F43EE] cqa-border-t-transparent cqa-rounded-full cqa-animate-spin\"></span>\n Loading...\n </span>\n <span *ngIf=\"!(loading || config?.loading) && hasSteps()\" 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 </span>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1 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\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 </div>\n\n <!-- Expanded Content with Nested Steps (indent so 14.1.1, 14.1.2 sit under 14.1) -->\n <div *ngIf=\"expanded\" [class]=\"'cqa-flex cqa-flex-col ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10' : 'cqa-pl-10')\">\n <!-- START GROUP Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-8 cqa-border-t cqa-border-[#D1C4E9] cqa-bg-[#D1C4E9]\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-font-bold cqa-text-white cqa-text-sm cqa-uppercase cqa-whitespace-nowrap\">START GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n </div>\n <!-- Loading Indicator -->\n <div *ngIf=\"loading\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-8 cqa-px-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-3\">\n <!-- Spinner -->\n <svg class=\"cqa-animate-spin cqa-h-6 cqa-w-6 cqa-text-[#3F43EE]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-[#6B7280] cqa-text-sm\">Loading steps...</span>\n </div>\n </div>\n \n <!-- Nested Steps Content (only show when not loading) -->\n <div *ngIf=\"!loading\" class=\"cqa-flex cqa-flex-col\">\n <!-- Steps inside step groups cannot be reordered - always use non-dnd list (no drag handle/dropzone) -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <!-- Steps inside step groups cannot be reordered - dnd list never shown -->\n <div *ngIf=\"false\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\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 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 [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END GROUP Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-8 cqa-border-t cqa-border-[#D1C4E9] cqa-bg-[#D1C4E9]\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-font-bold cqa-text-white cqa-text-sm cqa-uppercase cqa-whitespace-nowrap\">END GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n </div>\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"], components: [{ type: i1.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: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i4.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i2.DatePipe } });
328
+ TestCaseStepGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseStepGroupComponent, selector: "cqa-test-case-step-group", inputs: { config: "config", id: "id", stepNumber: "stepNumber", index: "index", groupName: "groupName", description: "description", reusable: "reusable", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", editable: "editable", selected: "selected", isDuplicating: "isDuplicating", loading: "loading", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", groupNameChange: "groupNameChange", descriptionChange: "descriptionChange", reusableChange: "reusableChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", openExternal: "openExternal", edit: "edit", editInDepth: "editInDepth", link: "link", duplicate: "duplicate", delete: "delete", viewDetails: "viewDetails", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", addStepBetweenClick: "addStepBetweenClick", addStepForLoop: "addStepForLoop", selectionChange: "selectionChange", deleteBranch: "deleteBranch" }, 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'\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Step Group Header -->\n <div [class]=\"'step-row cqa-flex cqa-gap-3 cqa-items-center cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4') + (config?.shouldSkip ? ' cqa-step-skipped' : '')\" [style.opacity]=\"config?.shouldSkip ? '0.6' : null\" style=\"min-height: 50px\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - step groups inside step groups cannot be reordered) -->\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-step-group\" />\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\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Folder Icon -->\n <div>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 15C15.3978 15 15.7794 14.842 16.0607 14.5607C16.342 14.2794 16.5 13.8978 16.5 13.5V6C16.5 5.60217 16.342 5.22064 16.0607 4.93934C15.7794 4.65804 15.3978 4.5 15 4.5H9.075C8.82413 4.50246 8.57666 4.44196 8.35523 4.32403C8.13379 4.20611 7.94547 4.03453 7.8075 3.825L7.2 2.925C7.06342 2.7176 6.87748 2.54736 6.65887 2.42955C6.44027 2.31174 6.19583 2.25004 5.9475 2.25H3C2.60218 2.25 2.22064 2.40804 1.93934 2.68934C1.65804 2.97064 1.5 3.35218 1.5 3.75V13.5C1.5 13.8978 1.65804 14.2794 1.93934 14.5607C2.22064 14.842 2.60218 15 3 15H15Z\"\n fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Group Name and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-gap-[2px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Group Name Input -->\n <p class=\"cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[18px] cqa-font-bold\">{{groupName}}</p>\n <!-- Reusable Tag -->\n <span *ngIf=\"reusable\"\n class=\"cqa-px-2 cqa-py-[1.5px] cqa-rounded-lg cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#D8D9FC] cqa-border cqa-border-solid cqa-border-[#8A8CF4]\">\n Reusable\n </span>\n </div>\n\n <!-- Description -->\n <p class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">{{description}}</p>\n </div>\n\n <!-- Steps Summary and Action Icons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-self-center\">\n <span *ngIf=\"config?.shouldSkip\" 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] cqa-flex-shrink-0\">Skipped</span>\n <!-- Action Icons - placed first -->\n <div *ngIf=\"editable && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-1.5 cqa-pr-2\">\n\n <!-- Edit Icon -->\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onSkipToggle(); $event.stopPropagation()\" [attr.title]=\"config?.shouldSkip ? 'Unskip step' : 'Skip step'\" [class.cqa-text-[#1447E6]]=\"config?.shouldSkip\" 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\">\n <path d=\"M8.25 8.75C9.2165 8.75 10 7.9665 10 7C10 6.0335 9.2165 5.25 8.25 5.25C7.2835 5.25 6.5 6.0335 6.5 7C6.5 7.9665 7.2835 8.75 8.25 8.75Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.75033 2.91663H5.25033C2.99516 2.91663 1.16699 4.7448 1.16699 6.99996C1.16699 9.25512 2.99516 11.0833 5.25033 11.0833H8.75033C11.0055 11.0833 12.8337 9.25512 12.8337 6.99996C12.8337 4.7448 11.0055 2.91663 8.75033 2.91663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Link Icon -->\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_609_26588)\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_609_26588\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> -->\n\n <!-- Duplicate Icon -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n\n <!-- Delete Icon -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- External Link Icon -->\n <button type=\"button\" (click)=\"onOpenExternal(); $event.stopPropagation()\" title=\"Open in new tab\"\n class=\"cqa-p-0 cqa-text-[#99999E] hover:cqa-text-[#1447E6]\">\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 8.66667V12.6667C12 13.0203 11.8595 13.3594 11.6095 13.6095C11.3594 13.8595 11.0203 14 10.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V5.33333C2 4.97971 2.14048 4.64057 2.39052 4.39052C2.64057 4.14048 2.97971 4 3.33333 4H7.33333M10 2H14M14 2V6M14 2L6.66667 9.33333\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Steps Summary (show loader when loading on expand) -->\n <span *ngIf=\"loading || config?.loading\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 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 <span class=\"cqa-inline-block cqa-w-3 cqa-h-3 cqa-border-2 cqa-border-solid cqa-border-[#3F43EE] cqa-border-t-transparent cqa-rounded-full cqa-animate-spin\"></span>\n Loading...\n </span>\n <span *ngIf=\"!(loading || config?.loading) && hasSteps()\" 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 </span>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1 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\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 </div>\n\n <!-- Expanded Content with Nested Steps (indent so 14.1.1, 14.1.2 sit under 14.1) -->\n <div *ngIf=\"expanded\" [class]=\"'cqa-flex cqa-flex-col ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10' : 'cqa-pl-10')\">\n <!-- START GROUP Marker (centered with decorative lines) - only when there are nested steps -->\n <div *ngIf=\"nestedSteps.length > 0\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#D1C4E9]\" style=\"border-top: 1px solid #D1C4E9;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">START GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <!-- Loading Indicator -->\n <div *ngIf=\"loading\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-8 cqa-px-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-3\">\n <!-- Spinner -->\n <svg class=\"cqa-animate-spin cqa-h-6 cqa-w-6 cqa-text-[#3F43EE]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-[#6B7280] cqa-text-sm\">Loading steps...</span>\n </div>\n </div>\n \n <!-- Nested Steps Content (only show when not loading) -->\n <div *ngIf=\"!loading\" class=\"cqa-flex cqa-flex-col\">\n <!-- Steps inside step groups cannot be reordered - always use non-dnd list (no drag handle/dropzone) -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <!-- Steps inside step groups cannot be reordered - dnd list never shown -->\n <div *ngIf=\"false\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\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 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 [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END GROUP Marker (centered with decorative lines) - only when there are nested steps -->\n <div *ngIf=\"nestedSteps.length > 0\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#D1C4E9]\" style=\"border-top: 1px solid #D1C4E9;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\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"], components: [{ type: i1.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: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i4.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i2.DatePipe } });
329
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseStepGroupComponent, decorators: [{
330
330
  type: Component,
331
- args: [{ selector: 'cqa-test-case-step-group', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div [class]=\"'cqa-flex cqa-flex-col'\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Step Group Header -->\n <div [class]=\"'step-row cqa-flex cqa-gap-3 cqa-items-center cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4') + (config?.shouldSkip ? ' cqa-step-skipped' : '')\" [style.opacity]=\"config?.shouldSkip ? '0.6' : null\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - step groups inside step groups cannot be reordered) -->\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-step-group\" />\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\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Folder Icon -->\n <div>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 15C15.3978 15 15.7794 14.842 16.0607 14.5607C16.342 14.2794 16.5 13.8978 16.5 13.5V6C16.5 5.60217 16.342 5.22064 16.0607 4.93934C15.7794 4.65804 15.3978 4.5 15 4.5H9.075C8.82413 4.50246 8.57666 4.44196 8.35523 4.32403C8.13379 4.20611 7.94547 4.03453 7.8075 3.825L7.2 2.925C7.06342 2.7176 6.87748 2.54736 6.65887 2.42955C6.44027 2.31174 6.19583 2.25004 5.9475 2.25H3C2.60218 2.25 2.22064 2.40804 1.93934 2.68934C1.65804 2.97064 1.5 3.35218 1.5 3.75V13.5C1.5 13.8978 1.65804 14.2794 1.93934 14.5607C2.22064 14.842 2.60218 15 3 15H15Z\"\n fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Group Name and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-gap-[2px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Group Name Input -->\n <p class=\"cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[18px] cqa-font-bold\">{{groupName}}</p>\n <!-- Reusable Tag -->\n <span *ngIf=\"reusable\"\n class=\"cqa-px-2 cqa-py-[1.5px] cqa-rounded-lg cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#D8D9FC] cqa-border cqa-border-solid cqa-border-[#8A8CF4]\">\n Reusable\n </span>\n </div>\n\n <!-- Description -->\n <p class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">{{description}}</p>\n </div>\n\n <!-- Steps Summary and Action Icons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-self-center\">\n <span *ngIf=\"config?.shouldSkip\" 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] cqa-flex-shrink-0\">Skipped</span>\n <!-- Action Icons - placed first -->\n <div *ngIf=\"editable && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-1.5 cqa-pr-2\">\n\n <!-- Edit Icon -->\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onSkipToggle(); $event.stopPropagation()\" [attr.title]=\"config?.shouldSkip ? 'Unskip step' : 'Skip step'\" [class.cqa-text-[#1447E6]]=\"config?.shouldSkip\" 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\">\n <path d=\"M8.25 8.75C9.2165 8.75 10 7.9665 10 7C10 6.0335 9.2165 5.25 8.25 5.25C7.2835 5.25 6.5 6.0335 6.5 7C6.5 7.9665 7.2835 8.75 8.25 8.75Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.75033 2.91663H5.25033C2.99516 2.91663 1.16699 4.7448 1.16699 6.99996C1.16699 9.25512 2.99516 11.0833 5.25033 11.0833H8.75033C11.0055 11.0833 12.8337 9.25512 12.8337 6.99996C12.8337 4.7448 11.0055 2.91663 8.75033 2.91663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Link Icon -->\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_609_26588)\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_609_26588\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> -->\n\n <!-- Duplicate Icon -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n\n <!-- Delete Icon -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- External Link Icon -->\n <button type=\"button\" (click)=\"onOpenExternal(); $event.stopPropagation()\" title=\"Open in new tab\"\n class=\"cqa-p-0 cqa-text-[#99999E] hover:cqa-text-[#1447E6]\">\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 8.66667V12.6667C12 13.0203 11.8595 13.3594 11.6095 13.6095C11.3594 13.8595 11.0203 14 10.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V5.33333C2 4.97971 2.14048 4.64057 2.39052 4.39052C2.64057 4.14048 2.97971 4 3.33333 4H7.33333M10 2H14M14 2V6M14 2L6.66667 9.33333\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Steps Summary (show loader when loading on expand) -->\n <span *ngIf=\"loading || config?.loading\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 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 <span class=\"cqa-inline-block cqa-w-3 cqa-h-3 cqa-border-2 cqa-border-solid cqa-border-[#3F43EE] cqa-border-t-transparent cqa-rounded-full cqa-animate-spin\"></span>\n Loading...\n </span>\n <span *ngIf=\"!(loading || config?.loading) && hasSteps()\" 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 </span>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1 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\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 </div>\n\n <!-- Expanded Content with Nested Steps (indent so 14.1.1, 14.1.2 sit under 14.1) -->\n <div *ngIf=\"expanded\" [class]=\"'cqa-flex cqa-flex-col ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10' : 'cqa-pl-10')\">\n <!-- START GROUP Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-8 cqa-border-t cqa-border-[#D1C4E9] cqa-bg-[#D1C4E9]\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-font-bold cqa-text-white cqa-text-sm cqa-uppercase cqa-whitespace-nowrap\">START GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n </div>\n <!-- Loading Indicator -->\n <div *ngIf=\"loading\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-8 cqa-px-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-3\">\n <!-- Spinner -->\n <svg class=\"cqa-animate-spin cqa-h-6 cqa-w-6 cqa-text-[#3F43EE]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-[#6B7280] cqa-text-sm\">Loading steps...</span>\n </div>\n </div>\n \n <!-- Nested Steps Content (only show when not loading) -->\n <div *ngIf=\"!loading\" class=\"cqa-flex cqa-flex-col\">\n <!-- Steps inside step groups cannot be reordered - always use non-dnd list (no drag handle/dropzone) -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <!-- Steps inside step groups cannot be reordered - dnd list never shown -->\n <div *ngIf=\"false\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\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 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 [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END GROUP Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 cqa-px-8 cqa-border-t cqa-border-[#D1C4E9] cqa-bg-[#D1C4E9]\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-font-bold cqa-text-white cqa-text-sm cqa-uppercase cqa-whitespace-nowrap\">END GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-60\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n </div>\n</div>" }]
331
+ args: [{ selector: 'cqa-test-case-step-group', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div [class]=\"'cqa-flex cqa-flex-col'\" style=\"border-bottom: 1px solid #E5E7EB;\">\n <!-- Step Group Header -->\n <div [class]=\"'step-row cqa-flex cqa-gap-3 cqa-items-center cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4') + (config?.shouldSkip ? ' cqa-step-skipped' : '')\" [style.opacity]=\"config?.shouldSkip ? '0.6' : null\" style=\"min-height: 50px\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - step groups inside step groups cannot be reordered) -->\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-step-group\" />\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\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Folder Icon -->\n <div>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 15C15.3978 15 15.7794 14.842 16.0607 14.5607C16.342 14.2794 16.5 13.8978 16.5 13.5V6C16.5 5.60217 16.342 5.22064 16.0607 4.93934C15.7794 4.65804 15.3978 4.5 15 4.5H9.075C8.82413 4.50246 8.57666 4.44196 8.35523 4.32403C8.13379 4.20611 7.94547 4.03453 7.8075 3.825L7.2 2.925C7.06342 2.7176 6.87748 2.54736 6.65887 2.42955C6.44027 2.31174 6.19583 2.25004 5.9475 2.25H3C2.60218 2.25 2.22064 2.40804 1.93934 2.68934C1.65804 2.97064 1.5 3.35218 1.5 3.75V13.5C1.5 13.8978 1.65804 14.2794 1.93934 14.5607C2.22064 14.842 2.60218 15 3 15H15Z\"\n fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Group Name and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-gap-[2px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Group Name Input -->\n <p class=\"cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[18px] cqa-font-bold\">{{groupName}}</p>\n <!-- Reusable Tag -->\n <span *ngIf=\"reusable\"\n class=\"cqa-px-2 cqa-py-[1.5px] cqa-rounded-lg cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#D8D9FC] cqa-border cqa-border-solid cqa-border-[#8A8CF4]\">\n Reusable\n </span>\n </div>\n\n <!-- Description -->\n <p class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">{{description}}</p>\n </div>\n\n <!-- Steps Summary and Action Icons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-self-center\">\n <span *ngIf=\"config?.shouldSkip\" 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] cqa-flex-shrink-0\">Skipped</span>\n <!-- Action Icons - placed first -->\n <div *ngIf=\"editable && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-1.5 cqa-pr-2\">\n\n <!-- Edit Icon -->\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onSkipToggle(); $event.stopPropagation()\" [attr.title]=\"config?.shouldSkip ? 'Unskip step' : 'Skip step'\" [class.cqa-text-[#1447E6]]=\"config?.shouldSkip\" 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\">\n <path d=\"M8.25 8.75C9.2165 8.75 10 7.9665 10 7C10 6.0335 9.2165 5.25 8.25 5.25C7.2835 5.25 6.5 6.0335 6.5 7C6.5 7.9665 7.2835 8.75 8.25 8.75Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.75033 2.91663H5.25033C2.99516 2.91663 1.16699 4.7448 1.16699 6.99996C1.16699 9.25512 2.99516 11.0833 5.25033 11.0833H8.75033C11.0055 11.0833 12.8337 9.25512 12.8337 6.99996C12.8337 4.7448 11.0055 2.91663 8.75033 2.91663Z\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Link Icon -->\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\" class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_609_26588)\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_609_26588\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> -->\n\n <!-- Duplicate Icon -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n\n <!-- Delete Icon -->\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\" class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n 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\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- External Link Icon -->\n <button type=\"button\" (click)=\"onOpenExternal(); $event.stopPropagation()\" title=\"Open in new tab\"\n class=\"cqa-p-0 cqa-text-[#99999E] hover:cqa-text-[#1447E6]\">\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 8.66667V12.6667C12 13.0203 11.8595 13.3594 11.6095 13.6095C11.3594 13.8595 11.0203 14 10.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V5.33333C2 4.97971 2.14048 4.64057 2.39052 4.39052C2.64057 4.14048 2.97971 4 3.33333 4H7.33333M10 2H14M14 2V6M14 2L6.66667 9.33333\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Steps Summary (show loader when loading on expand) -->\n <span *ngIf=\"loading || config?.loading\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 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 <span class=\"cqa-inline-block cqa-w-3 cqa-h-3 cqa-border-2 cqa-border-solid cqa-border-[#3F43EE] cqa-border-t-transparent cqa-rounded-full cqa-animate-spin\"></span>\n Loading...\n </span>\n <span *ngIf=\"!(loading || config?.loading) && hasSteps()\" 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 </span>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1 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\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 </div>\n\n <!-- Expanded Content with Nested Steps (indent so 14.1.1, 14.1.2 sit under 14.1) -->\n <div *ngIf=\"expanded\" [class]=\"'cqa-flex cqa-flex-col ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10' : 'cqa-pl-10')\">\n <!-- START GROUP Marker (centered with decorative lines) - only when there are nested steps -->\n <div *ngIf=\"nestedSteps.length > 0\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#D1C4E9]\" style=\"border-top: 1px solid #D1C4E9;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">START GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <!-- Loading Indicator -->\n <div *ngIf=\"loading\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-8 cqa-px-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-3\">\n <!-- Spinner -->\n <svg class=\"cqa-animate-spin cqa-h-6 cqa-w-6 cqa-text-[#3F43EE]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-[#6B7280] cqa-text-sm\">Loading steps...</span>\n </div>\n </div>\n \n <!-- Nested Steps Content (only show when not loading) -->\n <div *ngIf=\"!loading\" class=\"cqa-flex cqa-flex-col\">\n <!-- Steps inside step groups cannot be reordered - always use non-dnd list (no drag handle/dropzone) -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer\n *ngFor=\"let step of nestedSteps; let i = index\"\n [step]=\"step\"\n [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n <!-- Steps inside step groups cannot be reordered - dnd list never shown -->\n <div *ngIf=\"false\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\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 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 [isNested]=\"true\"\n [isInsideStepGroup]=\"true\"\n [isReorder]=\"isReorder\"\n [addStepBetween]=\"false\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\"\n (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\"\n (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\"\n (duplicate)=\"onNestedDuplicate($event, step)\"\n (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\"\n (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (stepUpdate)=\"stepUpdate.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\"\n (addStepForLoop)=\"addStepForLoop.emit($event)\"\n >\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END GROUP Marker (centered with decorative lines) - only when there are nested steps -->\n <div *ngIf=\"nestedSteps.length > 0\" class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#D1C4E9]\" style=\"border-top: 1px solid #D1C4E9;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">END GROUP</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-white cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n </div>\n</div>" }]
332
332
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
333
333
  type: Input
334
334
  }], id: [{
@@ -425,4 +425,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
425
425
  }], deleteBranch: [{
426
426
  type: Output
427
427
  }] } });
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZ3JvdXAvc3RlcC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZ3JvdXAvc3RlcC1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFnRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUErRyxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBU3JFLE1BQU0sT0FBTywwQkFBMEI7SUF1Q3JDLFlBQ1UsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoQ3ZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUNsQyw0Q0FBNEM7UUFDbkMsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQ3hDLGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDOUMsc0NBQXNDO1FBQzdCLDBC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LEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU14QyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBEb0NoZWNrLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdGVwR3JvdXBDb25maWcsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgTG9vcFN0ZXBDb25maWcsIENvbmRpdGlvblN0ZXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1zdGVwLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1NURVBfUk9XX0FDVElPTlNfU1RZTEVTXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjayB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IFN0ZXBHcm91cENvbmZpZztcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBcnJheSBpbmRleCBmcm9tIHBhcmVudCByZW5kZXJlciAtIHVzZSBmb3IgZWRpdEluRGVwdGggKHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHdyb25nKSAqL1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZ3JvdXBOYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgcmV1c2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRHVwbGljYXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uICovXG4gIEBJbnB1dCgpIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBhYm92ZSBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5BYm92ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYmVsb3cgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQmVsb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBhZGRTdGVwQmV0d2VlbkFib3ZlIGFuZCBhZGRTdGVwQmV0d2VlbkJlbG93IGluc3RlYWQuIElmIHNldCwgYXBwbGllcyB0byBib3RoIGJ1dHRvbnMuICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHByZXZpb3VzTmVzdGVkU3RlcHNSZWZlcmVuY2U6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBTdGVwR3JvdXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIGdyb3VwTmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJldXNhYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgbmVzdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBvcGVuRXh0ZXJuYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHtzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWd9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgbGluayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBkbmREcm9wSW5ab25lID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBEbmREcm9wRXZlbnQ7IHRhcmdldExpc3Q6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIH0+KCk7XG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIGRhdGEgcHJvZmlsZSBzZWFyY2ggcXVlcnkgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VhcmNoRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCBpcyB1cGRhdGVkIChlLmcuLCBBcHBseSBidXR0b24gY2xpY2tlZCBpbiBsb29wLXN0ZXAgZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEZvckxvb3AgZnJvbSBuZXN0ZWQgbG9vcHMgc28gTi1sZXZlbCBuZXN0aW5nIHdvcmtzIChlbXB0eSBsb29wIGFkZCBzdGVwKS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBGb3JMb29wID0gbmV3IEV2ZW50RW1pdHRlcjx7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlQnJhbmNoID0gbmV3IEV2ZW50RW1pdHRlcjxDb25kaXRpb25CcmFuY2g+KCk7XG5cbiAgb25EbmREcm9wKGV2ZW50OiBEbmREcm9wRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRuZERyb3BJblpvbmUuZW1pdCh7IGV2ZW50LCB0YXJnZXRMaXN0OiB0aGlzLm5lc3RlZFN0ZXBzIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVGcm9tQ29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gRGV0ZWN0IGNoYW5nZXMgdG8gY29uZmlnIG9yIG5lc3RlZFN0ZXBzIGlucHV0XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db25maWcoKTtcbiAgICAgIHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSA9IHRoaXMuY29uZmlnPy5uZXN0ZWRTdGVwcyB8fCBudWxsO1xuICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gdGhpcy5jb25maWc/Lm5lc3RlZFN0ZXBzPy5sZW5ndGggfHwgMDtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10pIHtcbiAgICAgIC8vIElmIG5lc3RlZFN0ZXBzIGlucHV0IGNoYW5nZWQgZGlyZWN0bHksIHVwZGF0ZSBpdFxuICAgICAgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzUmVmZXJlbmNlID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzWydsb2FkaW5nJ10pIHtcbiAgICAgIC8vIFVwZGF0ZSBsb2FkaW5nIHN0YXRlIGZyb20gaW5wdXRcbiAgICAgIHRoaXMubG9hZGluZyA9IGNoYW5nZXNbJ2xvYWRpbmcnXS5jdXJyZW50VmFsdWUgfHwgZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFN5bmMgbG9hZGluZyBmcm9tIGNvbmZpZyB3aGVuIG11dGF0ZWQgKGUuZy4gZWFnZXItbG9hZCBzZXRzIGNvbmZpZy5sb2FkaW5nID0gdHJ1ZSlcbiAgICBjb25zdCBjb25maWdMb2FkaW5nID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmxvYWRpbmc7XG4gICAgaWYgKHR5cGVvZiBjb25maWdMb2FkaW5nID09PSAnYm9vbGVhbicgJiYgdGhpcy5sb2FkaW5nICE9PSBjb25maWdMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBjb25maWdMb2FkaW5nO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBkZWVwIGNoYW5nZXMgaW4gY29uZmlnLm5lc3RlZFN0ZXBzICh3aGVuIG11dGF0ZWQgZGlyZWN0bHkpXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzO1xuICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IGN1cnJlbnROZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICAvLyBGb3IgbmVzdGVkIHN0ZXAgZ3JvdXBzLCBhdm9pZCBvdmVyd3JpdGluZyB3aXRoIGVtcHR5IHdoZW4gd2UgYWxyZWFkeSBoYXZlIHN0ZXBzXG4gICAgICAvLyAocGFyZW50IHJlLWZldGNoIG9yIHN5bmMgY2FuIHRlbXBvcmFyaWx5IHNldCBjb25maWcubmVzdGVkU3RlcHMgdG8gW10gYmVmb3JlIGFzeW5jIGxvYWQgY29tcGxldGVzKVxuICAgICAgY29uc3Qgc2hvdWxkU3luYyA9IHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSAhPT0gY3VycmVudE5lc3RlZFN0ZXBzIHx8XG4gICAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoICE9PSBjdXJyZW50TGVuZ3RoO1xuICAgICAgY29uc3Qgd291bGRDbGVhclN0ZXBzID0gY3VycmVudExlbmd0aCA9PT0gMCAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoc2hvdWxkU3luYyAmJiAhd291bGRDbGVhclN0ZXBzKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBjdXJyZW50TmVzdGVkU3RlcHM7XG4gICAgICAgIHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSA9IGN1cnJlbnROZXN0ZWRTdGVwcztcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gY3VycmVudExlbmd0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuZ3JvdXBOYW1lID0gdGhpcy5jb25maWcuZ3JvdXBOYW1lO1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uO1xuICAgICAgdGhpcy5yZXVzYWJsZSA9IHRoaXMuY29uZmlnLnJldXNhYmxlIHx8IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkaW5nID0gdGhpcy5jb25maWcubG9hZGluZyB8fCBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBuZXN0ZWRTdGVwcyBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGU7IGZvciBuZXN0ZWQgc3RlcCBncm91cHMsIGRvbid0IG92ZXJ3cml0ZVxuICAgICAgLy8gd2l0aCBlbXB0eSB3aGVuIHdlIGFscmVhZHkgaGF2ZSBzdGVwcyAoYXZvaWRzIFwiMCBzdGVwc1wiIGZsYXNoIHdoZW4gcGFyZW50IHJlLXN5bmNzKVxuICAgICAgaWYgKHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY29uZmlnU3RlcHMgPSB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcztcbiAgICAgICAgaWYgKGNvbmZpZ1N0ZXBzLmxlbmd0aCA+IDAgfHwgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gY29uZmlnU3RlcHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uZXN0ZWRTdGVwcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5uZXN0ZWRTdGVwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiBubyBjb25maWcsIGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBpbml0aWFsaXplZFxuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBzdGVwIGdyb3VwIGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQgc3RlcCAodXNlZCB0byBoaWRlIFwiMCBzdGVwc1wiIGJhZGdlKS4gKi9cbiAgaGFzU3RlcHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZnJvbUNvbmZpZyA9IHRoaXMuY29uZmlnPy5uZXN0ZWRTdGVwcztcbiAgICBjb25zdCBmcm9tSW5wdXQgPSB0aGlzLm5lc3RlZFN0ZXBzO1xuICAgIGNvbnN0IHN0ZXBzID0gKGZyb21Db25maWc/Lmxlbmd0aCA/PyAwKSA+PSAoZnJvbUlucHV0Py5sZW5ndGggPz8gMClcbiAgICAgID8gKGZyb21Db25maWcgPz8gZnJvbUlucHV0KVxuICAgICAgOiAoZnJvbUlucHV0ID8/IGZyb21Db25maWcpO1xuICAgIHJldHVybiAhIShzdGVwcyAmJiBzdGVwcy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKiBNYXggbGVuZ3RoIGZvciBzdGFydC9lbmQgc3RlcCBudW1iZXIgaW4gc3VtbWFyeTsgYmV5b25kIHRoaXMgdXNlIGxvY2FsIGluZGljZXMgKDEgdG8gY291bnQpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU1RFUF9OVU1CRVJfRElTUExBWV9MRU5HVEggPSAyMDtcblxuICAvKipcbiAgICogU3RlcCBjb3VudCBpcyBkZXJpdmVkIG9ubHkgZnJvbSB0aGUgY2hpbGQgc3RlcCBhcnJheSBsZW5ndGguXG4gICAqIFJ1bnMgb24gZXZlcnkgcmVuZGVyIChubyBleHBhbmQvY29sbGFwc2UgZGVwZW5kZW5jeSkuIFVzZWQgZm9yIGluaXRpYWwgbG9hZCBhbmQgYWxsIG5lc3RpbmcgbGV2ZWxzLlxuICAgKiBGb3IgZGVlcGx5IG5lc3RlZCBzdGVwcyB3aXRoIGxvbmcgbnVtYmVycywgc2hvd3MgXCJTdGVwcyAxLU4gKE4gc3RlcHMpXCIgdXNpbmcgbG9jYWwgaW5kaWNlcy5cbiAgICovXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZyb21Db25maWcgPSB0aGlzLmNvbmZpZz8ubmVzdGVkU3RlcHM7XG4gICAgY29uc3QgZnJvbUlucHV0ID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICBjb25zdCBzdGVwcyA9IChmcm9tQ29uZmlnPy5sZW5ndGggPz8gMCkgPj0gKGZyb21JbnB1dD8ubGVuZ3RoID8/IDApXG4gICAgICA/IChmcm9tQ29uZmlnID8/IGZyb21JbnB1dClcbiAgICAgIDogKGZyb21JbnB1dCA/PyBmcm9tQ29uZmlnKTtcbiAgICBpZiAoIXN0ZXBzIHx8IHN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBzdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgZmlyc3RTdGVwID0gc3RlcHNbMF07XG4gICAgY29uc3QgbGFzdFN0ZXAgPSBzdGVwc1tzdGVwcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBzdGFydFJhdyA9IChmaXJzdFN0ZXAgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgY29uc3QgZW5kUmF3ID0gKGxhc3RTdGVwIGFzIGFueSkuc3RlcE51bWJlciA/PyBjb3VudDtcbiAgICBjb25zdCBzdGFydFN0ciA9IFN0cmluZyhzdGFydFJhdyk7XG4gICAgY29uc3QgZW5kU3RyID0gU3RyaW5nKGVuZFJhdyk7XG4gICAgY29uc3QgdG9vTG9uZyA9IHN0YXJ0U3RyLmxlbmd0aCA+IFRlc3RDYXNlU3RlcEdyb3VwQ29tcG9uZW50Lk1BWF9TVEVQX05VTUJFUl9ESVNQTEFZX0xFTkdUSCB8fFxuICAgICAgZW5kU3RyLmxlbmd0aCA+IFRlc3RDYXNlU3RlcEdyb3VwQ29tcG9uZW50Lk1BWF9TVEVQX05VTUJFUl9ESVNQTEFZX0xFTkdUSDtcbiAgICBjb25zdCBzdGFydCA9IHRvb0xvbmcgPyAxIDogc3RhcnRSYXc7XG4gICAgY29uc3QgZW5kID0gdG9vTG9uZyA/IGNvdW50IDogZW5kUmF3O1xuICAgIHJldHVybiBgU3RlcHMgJHtzdGFydH0tJHtlbmR9ICgke2NvdW50fSBzdGVwJHtjb3VudCAhPT0gMSA/ICdzJyA6ICcnfSlgO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uR3JvdXBOYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwTmFtZSA9IHZhbHVlO1xuICAgIHRoaXMuZ3JvdXBOYW1lQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25EZXNjcmlwdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblJldXNhYmxlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJldXNhYmxlID0gY2hlY2tlZDtcbiAgICB0aGlzLnJldXNhYmxlQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IG9wZW5FeHRlcm5hbCBmcm9tIG5lc3RlZCBzdGVwIGdyb3VwIHNvIHJlZGlyZWN0IHdvcmtzIGZvciBzdGVwIGdyb3VwcyBpbnNpZGUgc3RlcCBncm91cHMuICovXG4gIG9uTmVzdGVkT3BlbkV4dGVybmFsKHBheWxvYWQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0pOiB2b2lkIHtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkge1xuICAgICAgdGhpcy5vcGVuRXh0ZXJuYWwuZW1pdChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBib29sZWFuIHwge2NvbmZpZzogVGVzdENhc2VTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0sIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIG5lc3RlZCBzdGVwLWdyb3VwOiB7Y29uZmlnLCBleHBhbmRlZH1cbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudC5leHBhbmRlZDtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCdzIGNvbmZpZyBpcyBhIHN0ZXAtZ3JvdXAgKG5vdCB0aGUgY3VycmVudCBzdGVwKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5lc3RlZCBzdGVwLWdyb3VwIGV2ZW50cyBidWJibGUgdXAgY29ycmVjdGx5IGV2ZW4gd2hlbiBuZXN0ZWQgaW5zaWRlIG90aGVyIHN0ZXAtZ3JvdXBzXG4gICAgICBpZiAodGhpcy5pc1N0ZXBHcm91cChldmVudC5jb25maWcpKSB7XG4gICAgICAgIC8vIFJlLWVtaXQgdGhlIHRvZ2dsZUV4cGFuZGVkIGV2ZW50IHdpdGggdGhlIG9iamVjdCBmb3JtYXQsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIFN0ZXBHcm91cENvbmZpZywgZXhwYW5kZWQ6IGV2ZW50LmV4cGFuZGVkfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvb2xlYW4gZm9ybWF0IGZyb20gb3RoZXIgc3RlcCB0eXBlc1xuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50IGFzIGJvb2xlYW47XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uQWRkU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGVTdGVwKHBheWxvYWRPckluZGV4OiBhbnksIGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogcGF5bG9hZE9ySW5kZXg7XG4gICAgY29uc3QgcGF5bG9hZCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBwYXlsb2FkT3JJbmRleCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlbGV0ZVN0ZXAuZW1pdChpZHgpO1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB0aGlzLmRlbGV0ZS5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZWRpdCBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIG9wZW4gZWRpdCBtb2RhbCAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWRFZGl0KGV2ZW50OiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5zdGVwICE9IG51bGwpIHRoaXMuZWRpdC5lbWl0KGV2ZW50IGFzIGFueSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBkdXBsaWNhdGUgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBkdXBsaWNhdGUgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRHVwbGljYXRlKGV2ZW50OiBhbnksIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKGV2ZW50ICYmIGV2ZW50LnN0ZXAgIT0gbnVsbCkgPyBldmVudCA6IHsgc3RlcCB9IGFzIGFueSk7XG4gIH1cblxuICBvblZpZXdEZXRhaWxzKGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRlc2NyaXB0aW9uIHx8IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMudmlld0RldGFpbHMuZW1pdCh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aXRsZTogJ1N0ZXAgR3JvdXAgRGV0YWlscycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkV4dGVybmFsLmVtaXQoe3N0ZXA6IHRoaXMuY29uZmlnfSk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgLy8gRW1pdCBlZGl0SW5EZXB0aCAtIHByZWZlciByZW5kZXJlciBpbmRleCAoY29ycmVjdCk7IHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHdyb25nXG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInID8gdGhpcy5pbmRleCA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnbnVtYmVyJyA/IHRoaXMuc3RlcE51bWJlciAtIDEgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSAtIDEgOiAwKSk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KHsgc3RlcDogdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogaXNOYU4oaWR4IGFzIG51bWJlcikgPyAwIDogKGlkeCBhcyBudW1iZXIpIH0pO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgdGhpcy5saW5rLmVtaXQoKTtcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHVwbGljYXRpbmcpIHJldHVybjtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KCk7XG4gIH1cblxuICBvblNraXBUb2dnbGUoKTogdm9pZCB7XG4gICAgLy8gVG9nZ2xlOiBpZiBjdXJyZW50bHkgdHJ1ZSDihpIgcGFzcyBmYWxzZSAodW5za2lwKTsgaWYgY3VycmVudGx5IGZhbHNlL3VuZGVmaW5lZCDihpIgcGFzcyB0cnVlIChza2lwKVxuICAgIGNvbnN0IGN1cnJlbnRseVNraXBwZWQgPSAhISh0aGlzLmNvbmZpZz8uc2hvdWxkU2tpcCk7XG4gICAgY29uc3Qgc2hvdWxkU2tpcE5leHQgPSAhY3VycmVudGx5U2tpcHBlZDtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh7IC4uLnRoaXMuY29uZmlnLCBzaG91bGRTa2lwOiBzaG91bGRTa2lwTmV4dCB9IGFzIFRlc3RDYXNlU3RlcENvbmZpZyk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChjaGVja2VkKTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gc3RlcCBncm91cCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBzdGVwIGdyb3VwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBsYWJlbDogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnSUYgVFJVRScgOiAnRUxTRScsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGJyYW5jaDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUmUtZW1pdCBkZWxldGVCcmFuY2ggc28gc3RlcC1saXN0IGNhbiBvcGVuIGRlbGV0ZSBtb2RhbCBhbmQgY2FsbCBBUElcbiAgICB0aGlzLmRlbGV0ZUJyYW5jaC5lbWl0KGJyYW5jaCk7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIidjcWEtZmxleCBjcWEtZmxleC1jb2wnXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgPCEtLSBTdGVwIEdyb3VwIEhlYWRlciAtLT5cbiAgPGRpdiBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtaXRlbXMtY2VudGVyIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wICYmIGlzSW5zaWRlU3RlcEdyb3VwID8gJ2NxYS1wbC0yMCBjcWEtcHItNCcgOiAoaXNJbnNpZGVMb29wIHx8IGlzSW5zaWRlU3RlcEdyb3VwKSA/ICdjcWEtcGwtMTAgY3FhLXByLTQnIDogJ2NxYS1weC00JykgKyAoY29uZmlnPy5zaG91bGRTa2lwID8gJyBjcWEtc3RlcC1za2lwcGVkJyA6ICcnKVwiIFtzdHlsZS5vcGFjaXR5XT1cImNvbmZpZz8uc2hvdWxkU2tpcCA/ICcwLjYnIDogbnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gc3RlcCBncm91cHMgaW5zaWRlIHN0ZXAgZ3JvdXBzIGNhbm5vdCBiZSByZW9yZGVyZWQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXIgJiYgIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gaGlkZSBmb3Igc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCJlZGl0YWJsZSAmJiAhaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1zdGVwLWdyb3VwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImV4cGFuZGVkXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBGb2xkZXIgSWNvbiAtLT5cbiAgICA8ZGl2PlxuICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNSAxNUMxNS4zOTc4IDE1IDE1Ljc3OTQgMTQuODQyIDE2LjA2MDcgMTQuNTYwN0MxNi4zNDIgMTQuMjc5NCAxNi41IDEzLjg5NzggMTYuNSAxMy41VjZDMTYuNSA1LjYwMjE3IDE2LjM0MiA1LjIyMDY0IDE2LjA2MDcgNC45MzkzNEMxNS43Nzk0IDQuNjU4MDQgMTUuMzk3OCA0LjUgMTUgNC41SDkuMDc1QzguODI0MTMgNC41MDI0NiA4LjU3NjY2IDQuNDQxOTYgOC4zNTUyMyA0LjMyNDAzQzguMTMzNzkgNC4yMDYxMSA3Ljk0NTQ3IDQuMDM0NTMgNy44MDc1IDMuODI1TDcuMiAyLjkyNUM3LjA2MzQyIDIuNzE3NiA2Ljg3NzQ4IDIuNTQ3MzYgNi42NTg4NyAyLjQyOTU1QzYuNDQwMjcgMi4zMTE3NCA2LjE5NTgzIDIuMjUwMDQgNS45NDc1IDIuMjVIM0MyLjYwMjE4IDIuMjUgMi4yMjA2NCAyLjQwODA0IDEuOTM5MzQgMi42ODkzNEMxLjY1ODA0IDIuOTcwNjQgMS41IDMuMzUyMTggMS41IDMuNzVWMTMuNUMxLjUgMTMuODk3OCAxLjY1ODA0IDE0LjI3OTQgMS45MzkzNCAxNC41NjA3QzIuMjIwNjQgMTQuODQyIDIuNjAyMTggMTUgMyAxNUgxNVpcIlxuICAgICAgICAgIGZpbGw9XCIjRUZGNkZGXCIgc3Ryb2tlPVwiIzYwQTVGQVwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEdyb3VwIE5hbWUgYW5kIERlc2NyaXB0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtZ2FwLVsycHhdXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPCEtLSBHcm91cCBOYW1lIElucHV0IC0tPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LWJvbGRcIj57e2dyb3VwTmFtZX19PC9wPlxuICAgICAgICA8IS0tIFJldXNhYmxlIFRhZyAtLT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJyZXVzYWJsZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzEuNXB4XSBjcWEtcm91bmRlZC1sZyBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRDhEOUZDXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzhBOENGNF1cIj5cbiAgICAgICAgICBSZXVzYWJsZVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj57e2Rlc2NyaXB0aW9ufX08L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0ZXBzIFN1bW1hcnkgYW5kIEFjdGlvbiBJY29ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXNlbGYtY2VudGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZz8uc2hvdWxkU2tpcFwiIGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj5Ta2lwcGVkPC9zcGFuPlxuICAgICAgPCEtLSBBY3Rpb24gSWNvbnMgLSBwbGFjZWQgZmlyc3QgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGFibGUgJiYgIWlzUmVvcmRlclwiIGNsYXNzPVwic3RlcC1hY3Rpb25zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXByLTJcIj5cblxuICAgICAgICA8IS0tIEVkaXQgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uU2tpcFRvZ2dsZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbYXR0ci50aXRsZV09XCJjb25maWc/LnNob3VsZFNraXAgPyAnVW5za2lwIHN0ZXAnIDogJ1NraXAgc3RlcCdcIiBbY2xhc3MuY3FhLXRleHQtWyMxNDQ3RTZdXT1cImNvbmZpZz8uc2hvdWxkU2tpcFwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMjUgOC43NUM5LjIxNjUgOC43NSAxMCA3Ljk2NjUgMTAgN0MxMCA2LjAzMzUgOS4yMTY1IDUuMjUgOC4yNSA1LjI1QzcuMjgzNSA1LjI1IDYuNSA2LjAzMzUgNi41IDdDNi41IDcuOTY2NSA3LjI4MzUgOC43NSA4LjI1IDguNzVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NTAzMyAyLjkxNjYzSDUuMjUwMzNDMi45OTUxNiAyLjkxNjYzIDEuMTY2OTkgNC43NDQ4IDEuMTY2OTkgNi45OTk5NkMxLjE2Njk5IDkuMjU1MTIgMi45OTUxNiAxMS4wODMzIDUuMjUwMzMgMTEuMDgzM0g4Ljc1MDMzQzExLjAwNTUgMTEuMDgzMyAxMi44MzM3IDkuMjU1MTIgMTIuODMzNyA2Ljk5OTk2QzEyLjgzMzcgNC43NDQ4IDExLjAwNTUgMi45MTY2MyA4Ljc1MDMzIDIuOTE2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBMaW5rIEljb24gLS0+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uTGluaygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkxpbmtcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF82MDlfMjY1ODgpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82MDlfMjY1ODhcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgPCEtLSBEdXBsaWNhdGUgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0R1cGxpY2F0aW5nXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJpc0R1cGxpY2F0aW5nID8gJ0R1cGxpY2F0aW5nLi4uJyA6ICdEdXBsaWNhdGUnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XSBkaXNhYmxlZDpjcWEtb3BhY2l0eS02MCBkaXNhYmxlZDpjcWEtY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNEdXBsaWNhdGluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHVwbGljYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1sYWJlbD1cIkR1cGxpY2F0aW5nXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLW9wYWNpdHk9XCIwLjJcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDhBNiA2IDAgMCAwIDggMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XG4gICAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgOCA4XCIgdG89XCIzNjAgOCA4XCIgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiLz5cbiAgICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBEZWxldGUgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV4dGVybmFsIExpbmsgSWNvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbk9wZW5FeHRlcm5hbCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIk9wZW4gaW4gbmV3IHRhYlwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5OTk5RV0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAxNiAxN1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTEyIDguNjY2NjdWMTIuNjY2N0MxMiAxMy4wMjAzIDExLjg1OTUgMTMuMzU5NCAxMS42MDk1IDEzLjYwOTVDMTEuMzU5NCAxMy44NTk1IDExLjAyMDMgMTQgMTAuNjY2NyAxNEgzLjMzMzMzQzIuOTc5NzEgMTQgMi42NDA1NyAxMy44NTk1IDIuMzkwNTIgMTMuNjA5NUMyLjE0MDQ4IDEzLjM1OTQgMiAxMy4wMjAzIDIgMTIuNjY2N1Y1LjMzMzMzQzIgNC45Nzk3MSAyLjE0MDQ4IDQuNjQwNTcgMi4zOTA1MiA0LjM5MDUyQzIuNjQwNTcgNC4xNDA0OCAyLjk3OTcxIDQgMy4zMzMzMyA0SDcuMzMzMzNNMTAgMkgxNE0xNCAyVjZNMTQgMkw2LjY2NjY3IDkuMzMzMzNcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBTdGVwcyBTdW1tYXJ5IChzaG93IGxvYWRlciB3aGVuIGxvYWRpbmcgb24gZXhwYW5kKSAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZyB8fCBjb25maWc/LmxvYWRpbmdcIiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XSBjcWEtcm91bmRlZC1sZyBjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy0zIGNxYS1oLTMgY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLWJvcmRlci10LXRyYW5zcGFyZW50IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWFuaW1hdGUtc3BpblwiPjwvc3Bhbj5cbiAgICAgICAgTG9hZGluZy4uLlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhKGxvYWRpbmcgfHwgY29uZmlnPy5sb2FkaW5nKSAmJiBoYXNTdGVwcygpXCIgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICAgIDxhICpuZ0lmPVwiY29uZmlnLmRlc2NyaXB0aW9uICYmIGNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgIT09ICcnXCIgI3ZpZXdEZXRhaWxzVHJpZ2dlciBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtbm8tdW5kZXJsaW5lXCI+VmlldyBEZXRhaWxzPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuXG4gICAgICA8IS0tIENyZWF0ZWQgRGF0ZSAoZnJvbSBBUEkpIC0gbGFzdCBzbyBhbGlnbmVkIGFjcm9zcyBhbGwgc3RlcHMsIGZvcm1hdDogMjUgRmViIDIwMjYgLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5jcmVhdGVkRGF0ZVwiIGNsYXNzPVwic3RlcC1kYXRlIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1tbC1hdXRvIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCB3aXRoIE5lc3RlZCBTdGVwcyAoaW5kZW50IHNvIDE0LjEuMSwgMTQuMS4yIHNpdCB1bmRlciAxNC4xKSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgW2NsYXNzXT1cIidjcWEtZmxleCBjcWEtZmxleC1jb2wgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwJyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCcgOiAnY3FhLXBsLTEwJylcIj5cbiAgICA8IS0tIFNUQVJUIEdST1VQIE1hcmtlciAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgY3FhLXB4LTggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItWyNEMUM0RTldIGNxYS1iZy1bI0QxQzRFOV1cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLXdoaXRlIGNxYS1vcGFjaXR5LTYwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1ib2xkIGNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LXNtIGNxYS11cHBlcmNhc2UgY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+U1RBUlQgR1JPVVA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci13aGl0ZSBjcWEtb3BhY2l0eS02MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIExvYWRpbmcgSW5kaWNhdG9yIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktOCBjcWEtcHgtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtM1wiPlxuICAgICAgICA8IS0tIFNwaW5uZXIgLS0+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYW5pbWF0ZS1zcGluIGNxYS1oLTYgY3FhLXctNiBjcWEtdGV4dC1bIzNGNDNFRV1cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImNxYS1vcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgPHBhdGggY2xhc3M9XCJjcWEtb3BhY2l0eS03NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQgMTJhOCA4IDAgMDE4LThWMEM1LjM3MyAwIDAgNS4zNzMgMCAxMmg0em0yIDUuMjkxQTcuOTYyIDcuOTYyIDAgMDE0IDEySDBjMCAzLjA0MiAxLjEzNSA1LjgyNCAzIDcuOTM4bDMtMi42NDd6XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc21cIj5Mb2FkaW5nIHN0ZXBzLi4uPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPCEtLSBOZXN0ZWQgU3RlcHMgQ29udGVudCAob25seSBzaG93IHdoZW4gbm90IGxvYWRpbmcpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8IS0tIFN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcyBjYW5ub3QgYmUgcmVvcmRlcmVkIC0gYWx3YXlzIHVzZSBub24tZG5kIGxpc3QgKG5vIGRyYWcgaGFuZGxlL2Ryb3B6b25lKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXJcbiAgICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCJcbiAgICAgICAgW2lzSW5zaWRlU3RlcEdyb3VwXT1cInRydWVcIlxuICAgICAgICBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJmYWxzZVwiXG4gICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCJcbiAgICAgICAgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwib25OZXN0ZWRUb2dnbGVFeHBhbmRlZCgkZXZlbnQsIHN0ZXAsIGkpXCJcbiAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChyZXVzYWJsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnJldXNhYmxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkT3BlbkV4dGVybmFsKCRldmVudClcIlxuICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiXG4gICAgICAgIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzdGVwVXBkYXRlKT1cInN0ZXBVcGRhdGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwRm9yTG9vcCk9XCJhZGRTdGVwRm9yTG9vcC5lbWl0KCRldmVudClcIlxuICAgICAgPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBTdGVwcyBpbnNpZGUgc3RlcCBncm91cHMgY2Fubm90IGJlIHJlb3JkZXJlZCAtIGRuZCBsaXN0IG5ldmVyIHNob3duIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmYWxzZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICAgIFtpc0luc2lkZVN0ZXBHcm91cF09XCJ0cnVlXCJcbiAgICAgICAgICBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImZhbHNlXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiXG4gICAgICAgICAgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZE9wZW5FeHRlcm5hbCgkZXZlbnQpXCJcbiAgICAgICAgICAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIlxuICAgICAgICAgIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc3RlcFVwZGF0ZSk9XCJzdGVwVXBkYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEZvckxvb3ApPVwiYWRkU3RlcEZvckxvb3AuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVORCBHUk9VUCBNYXJrZXIgKGNlbnRlcmVkIHdpdGggZGVjb3JhdGl2ZSBsaW5lcykgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgY3FhLXB4LTggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItWyNEMUM0RTldIGNxYS1iZy1bI0QxQzRFOV1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItd2hpdGUgY3FhLW9wYWNpdHktNjBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtYm9sZCBjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1zbSBjcWEtdXBwZXJjYXNlIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPkVORCBHUk9VUDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItd2hpdGUgY3FhLW9wYWNpdHktNjBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZ3JvdXAvc3RlcC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZ3JvdXAvc3RlcC1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFnRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUErRyxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBU3JFLE1BQU0sT0FBTywwQkFBMEI7SUF1Q3JDLFlBQ1UsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoQ3ZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUNsQyw0Q0FBNEM7UUFDbkMsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQ3hDLGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDOUMsc0NBQXNDO1FBQzdCLDBC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LEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU14QyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBEb0NoZWNrLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdGVwR3JvdXBDb25maWcsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgTG9vcFN0ZXBDb25maWcsIENvbmRpdGlvblN0ZXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1zdGVwLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1NURVBfUk9XX0FDVElPTlNfU1RZTEVTXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjayB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IFN0ZXBHcm91cENvbmZpZztcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBcnJheSBpbmRleCBmcm9tIHBhcmVudCByZW5kZXJlciAtIHVzZSBmb3IgZWRpdEluRGVwdGggKHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHdyb25nKSAqL1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZ3JvdXBOYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgcmV1c2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRHVwbGljYXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uICovXG4gIEBJbnB1dCgpIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBhYm92ZSBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5BYm92ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYmVsb3cgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQmVsb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBhZGRTdGVwQmV0d2VlbkFib3ZlIGFuZCBhZGRTdGVwQmV0d2VlbkJlbG93IGluc3RlYWQuIElmIHNldCwgYXBwbGllcyB0byBib3RoIGJ1dHRvbnMuICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHByZXZpb3VzTmVzdGVkU3RlcHNSZWZlcmVuY2U6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBTdGVwR3JvdXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIGdyb3VwTmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJldXNhYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgbmVzdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBvcGVuRXh0ZXJuYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHtzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWd9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgbGluayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBkbmREcm9wSW5ab25lID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBEbmREcm9wRXZlbnQ7IHRhcmdldExpc3Q6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIH0+KCk7XG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIGRhdGEgcHJvZmlsZSBzZWFyY2ggcXVlcnkgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VhcmNoRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCBpcyB1cGRhdGVkIChlLmcuLCBBcHBseSBidXR0b24gY2xpY2tlZCBpbiBsb29wLXN0ZXAgZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEZvckxvb3AgZnJvbSBuZXN0ZWQgbG9vcHMgc28gTi1sZXZlbCBuZXN0aW5nIHdvcmtzIChlbXB0eSBsb29wIGFkZCBzdGVwKS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBGb3JMb29wID0gbmV3IEV2ZW50RW1pdHRlcjx7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlQnJhbmNoID0gbmV3IEV2ZW50RW1pdHRlcjxDb25kaXRpb25CcmFuY2g+KCk7XG5cbiAgb25EbmREcm9wKGV2ZW50OiBEbmREcm9wRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRuZERyb3BJblpvbmUuZW1pdCh7IGV2ZW50LCB0YXJnZXRMaXN0OiB0aGlzLm5lc3RlZFN0ZXBzIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVGcm9tQ29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gRGV0ZWN0IGNoYW5nZXMgdG8gY29uZmlnIG9yIG5lc3RlZFN0ZXBzIGlucHV0XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db25maWcoKTtcbiAgICAgIHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSA9IHRoaXMuY29uZmlnPy5uZXN0ZWRTdGVwcyB8fCBudWxsO1xuICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gdGhpcy5jb25maWc/Lm5lc3RlZFN0ZXBzPy5sZW5ndGggfHwgMDtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10pIHtcbiAgICAgIC8vIElmIG5lc3RlZFN0ZXBzIGlucHV0IGNoYW5nZWQgZGlyZWN0bHksIHVwZGF0ZSBpdFxuICAgICAgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzUmVmZXJlbmNlID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzWydsb2FkaW5nJ10pIHtcbiAgICAgIC8vIFVwZGF0ZSBsb2FkaW5nIHN0YXRlIGZyb20gaW5wdXRcbiAgICAgIHRoaXMubG9hZGluZyA9IGNoYW5nZXNbJ2xvYWRpbmcnXS5jdXJyZW50VmFsdWUgfHwgZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFN5bmMgbG9hZGluZyBmcm9tIGNvbmZpZyB3aGVuIG11dGF0ZWQgKGUuZy4gZWFnZXItbG9hZCBzZXRzIGNvbmZpZy5sb2FkaW5nID0gdHJ1ZSlcbiAgICBjb25zdCBjb25maWdMb2FkaW5nID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmxvYWRpbmc7XG4gICAgaWYgKHR5cGVvZiBjb25maWdMb2FkaW5nID09PSAnYm9vbGVhbicgJiYgdGhpcy5sb2FkaW5nICE9PSBjb25maWdMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBjb25maWdMb2FkaW5nO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBkZWVwIGNoYW5nZXMgaW4gY29uZmlnLm5lc3RlZFN0ZXBzICh3aGVuIG11dGF0ZWQgZGlyZWN0bHkpXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzO1xuICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IGN1cnJlbnROZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICAvLyBGb3IgbmVzdGVkIHN0ZXAgZ3JvdXBzLCBhdm9pZCBvdmVyd3JpdGluZyB3aXRoIGVtcHR5IHdoZW4gd2UgYWxyZWFkeSBoYXZlIHN0ZXBzXG4gICAgICAvLyAocGFyZW50IHJlLWZldGNoIG9yIHN5bmMgY2FuIHRlbXBvcmFyaWx5IHNldCBjb25maWcubmVzdGVkU3RlcHMgdG8gW10gYmVmb3JlIGFzeW5jIGxvYWQgY29tcGxldGVzKVxuICAgICAgY29uc3Qgc2hvdWxkU3luYyA9IHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSAhPT0gY3VycmVudE5lc3RlZFN0ZXBzIHx8XG4gICAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoICE9PSBjdXJyZW50TGVuZ3RoO1xuICAgICAgY29uc3Qgd291bGRDbGVhclN0ZXBzID0gY3VycmVudExlbmd0aCA9PT0gMCAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoc2hvdWxkU3luYyAmJiAhd291bGRDbGVhclN0ZXBzKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBjdXJyZW50TmVzdGVkU3RlcHM7XG4gICAgICAgIHRoaXMucHJldmlvdXNOZXN0ZWRTdGVwc1JlZmVyZW5jZSA9IGN1cnJlbnROZXN0ZWRTdGVwcztcbiAgICAgICAgdGhpcy5wcmV2aW91c05lc3RlZFN0ZXBzTGVuZ3RoID0gY3VycmVudExlbmd0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuZ3JvdXBOYW1lID0gdGhpcy5jb25maWcuZ3JvdXBOYW1lO1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uO1xuICAgICAgdGhpcy5yZXVzYWJsZSA9IHRoaXMuY29uZmlnLnJldXNhYmxlIHx8IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkaW5nID0gdGhpcy5jb25maWcubG9hZGluZyB8fCBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBuZXN0ZWRTdGVwcyBmcm9tIGNvbmZpZyBpZiBhdmFpbGFibGU7IGZvciBuZXN0ZWQgc3RlcCBncm91cHMsIGRvbid0IG92ZXJ3cml0ZVxuICAgICAgLy8gd2l0aCBlbXB0eSB3aGVuIHdlIGFscmVhZHkgaGF2ZSBzdGVwcyAoYXZvaWRzIFwiMCBzdGVwc1wiIGZsYXNoIHdoZW4gcGFyZW50IHJlLXN5bmNzKVxuICAgICAgaWYgKHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY29uZmlnU3RlcHMgPSB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcztcbiAgICAgICAgaWYgKGNvbmZpZ1N0ZXBzLmxlbmd0aCA+IDAgfHwgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gY29uZmlnU3RlcHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uZXN0ZWRTdGVwcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5uZXN0ZWRTdGVwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiBubyBjb25maWcsIGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBpbml0aWFsaXplZFxuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBzdGVwIGdyb3VwIGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQgc3RlcCAodXNlZCB0byBoaWRlIFwiMCBzdGVwc1wiIGJhZGdlKS4gKi9cbiAgaGFzU3RlcHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZnJvbUNvbmZpZyA9IHRoaXMuY29uZmlnPy5uZXN0ZWRTdGVwcztcbiAgICBjb25zdCBmcm9tSW5wdXQgPSB0aGlzLm5lc3RlZFN0ZXBzO1xuICAgIGNvbnN0IHN0ZXBzID0gKGZyb21Db25maWc/Lmxlbmd0aCA/PyAwKSA+PSAoZnJvbUlucHV0Py5sZW5ndGggPz8gMClcbiAgICAgID8gKGZyb21Db25maWcgPz8gZnJvbUlucHV0KVxuICAgICAgOiAoZnJvbUlucHV0ID8/IGZyb21Db25maWcpO1xuICAgIHJldHVybiAhIShzdGVwcyAmJiBzdGVwcy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKiBNYXggbGVuZ3RoIGZvciBzdGFydC9lbmQgc3RlcCBudW1iZXIgaW4gc3VtbWFyeTsgYmV5b25kIHRoaXMgdXNlIGxvY2FsIGluZGljZXMgKDEgdG8gY291bnQpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU1RFUF9OVU1CRVJfRElTUExBWV9MRU5HVEggPSAyMDtcblxuICAvKipcbiAgICogU3RlcCBjb3VudCBpcyBkZXJpdmVkIG9ubHkgZnJvbSB0aGUgY2hpbGQgc3RlcCBhcnJheSBsZW5ndGguXG4gICAqIFJ1bnMgb24gZXZlcnkgcmVuZGVyIChubyBleHBhbmQvY29sbGFwc2UgZGVwZW5kZW5jeSkuIFVzZWQgZm9yIGluaXRpYWwgbG9hZCBhbmQgYWxsIG5lc3RpbmcgbGV2ZWxzLlxuICAgKiBGb3IgZGVlcGx5IG5lc3RlZCBzdGVwcyB3aXRoIGxvbmcgbnVtYmVycywgc2hvd3MgXCJTdGVwcyAxLU4gKE4gc3RlcHMpXCIgdXNpbmcgbG9jYWwgaW5kaWNlcy5cbiAgICovXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZyb21Db25maWcgPSB0aGlzLmNvbmZpZz8ubmVzdGVkU3RlcHM7XG4gICAgY29uc3QgZnJvbUlucHV0ID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICBjb25zdCBzdGVwcyA9IChmcm9tQ29uZmlnPy5sZW5ndGggPz8gMCkgPj0gKGZyb21JbnB1dD8ubGVuZ3RoID8/IDApXG4gICAgICA/IChmcm9tQ29uZmlnID8/IGZyb21JbnB1dClcbiAgICAgIDogKGZyb21JbnB1dCA/PyBmcm9tQ29uZmlnKTtcbiAgICBpZiAoIXN0ZXBzIHx8IHN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBzdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgZmlyc3RTdGVwID0gc3RlcHNbMF07XG4gICAgY29uc3QgbGFzdFN0ZXAgPSBzdGVwc1tzdGVwcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBzdGFydFJhdyA9IChmaXJzdFN0ZXAgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgY29uc3QgZW5kUmF3ID0gKGxhc3RTdGVwIGFzIGFueSkuc3RlcE51bWJlciA/PyBjb3VudDtcbiAgICBjb25zdCBzdGFydFN0ciA9IFN0cmluZyhzdGFydFJhdyk7XG4gICAgY29uc3QgZW5kU3RyID0gU3RyaW5nKGVuZFJhdyk7XG4gICAgY29uc3QgdG9vTG9uZyA9IHN0YXJ0U3RyLmxlbmd0aCA+IFRlc3RDYXNlU3RlcEdyb3VwQ29tcG9uZW50Lk1BWF9TVEVQX05VTUJFUl9ESVNQTEFZX0xFTkdUSCB8fFxuICAgICAgZW5kU3RyLmxlbmd0aCA+IFRlc3RDYXNlU3RlcEdyb3VwQ29tcG9uZW50Lk1BWF9TVEVQX05VTUJFUl9ESVNQTEFZX0xFTkdUSDtcbiAgICBjb25zdCBzdGFydCA9IHRvb0xvbmcgPyAxIDogc3RhcnRSYXc7XG4gICAgY29uc3QgZW5kID0gdG9vTG9uZyA/IGNvdW50IDogZW5kUmF3O1xuICAgIHJldHVybiBgU3RlcHMgJHtzdGFydH0tJHtlbmR9ICgke2NvdW50fSBzdGVwJHtjb3VudCAhPT0gMSA/ICdzJyA6ICcnfSlgO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uR3JvdXBOYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwTmFtZSA9IHZhbHVlO1xuICAgIHRoaXMuZ3JvdXBOYW1lQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25EZXNjcmlwdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblJldXNhYmxlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJldXNhYmxlID0gY2hlY2tlZDtcbiAgICB0aGlzLnJldXNhYmxlQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IG9wZW5FeHRlcm5hbCBmcm9tIG5lc3RlZCBzdGVwIGdyb3VwIHNvIHJlZGlyZWN0IHdvcmtzIGZvciBzdGVwIGdyb3VwcyBpbnNpZGUgc3RlcCBncm91cHMuICovXG4gIG9uTmVzdGVkT3BlbkV4dGVybmFsKHBheWxvYWQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0pOiB2b2lkIHtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkge1xuICAgICAgdGhpcy5vcGVuRXh0ZXJuYWwuZW1pdChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBib29sZWFuIHwge2NvbmZpZzogVGVzdENhc2VTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0sIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIG5lc3RlZCBzdGVwLWdyb3VwOiB7Y29uZmlnLCBleHBhbmRlZH1cbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudC5leHBhbmRlZDtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCdzIGNvbmZpZyBpcyBhIHN0ZXAtZ3JvdXAgKG5vdCB0aGUgY3VycmVudCBzdGVwKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5lc3RlZCBzdGVwLWdyb3VwIGV2ZW50cyBidWJibGUgdXAgY29ycmVjdGx5IGV2ZW4gd2hlbiBuZXN0ZWQgaW5zaWRlIG90aGVyIHN0ZXAtZ3JvdXBzXG4gICAgICBpZiAodGhpcy5pc1N0ZXBHcm91cChldmVudC5jb25maWcpKSB7XG4gICAgICAgIC8vIFJlLWVtaXQgdGhlIHRvZ2dsZUV4cGFuZGVkIGV2ZW50IHdpdGggdGhlIG9iamVjdCBmb3JtYXQsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIFN0ZXBHcm91cENvbmZpZywgZXhwYW5kZWQ6IGV2ZW50LmV4cGFuZGVkfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvb2xlYW4gZm9ybWF0IGZyb20gb3RoZXIgc3RlcCB0eXBlc1xuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50IGFzIGJvb2xlYW47XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uQWRkU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGVTdGVwKHBheWxvYWRPckluZGV4OiBhbnksIGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogcGF5bG9hZE9ySW5kZXg7XG4gICAgY29uc3QgcGF5bG9hZCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBwYXlsb2FkT3JJbmRleCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlbGV0ZVN0ZXAuZW1pdChpZHgpO1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB0aGlzLmRlbGV0ZS5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZWRpdCBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIG9wZW4gZWRpdCBtb2RhbCAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWRFZGl0KGV2ZW50OiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5zdGVwICE9IG51bGwpIHRoaXMuZWRpdC5lbWl0KGV2ZW50IGFzIGFueSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBkdXBsaWNhdGUgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBkdXBsaWNhdGUgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRHVwbGljYXRlKGV2ZW50OiBhbnksIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKGV2ZW50ICYmIGV2ZW50LnN0ZXAgIT0gbnVsbCkgPyBldmVudCA6IHsgc3RlcCB9IGFzIGFueSk7XG4gIH1cblxuICBvblZpZXdEZXRhaWxzKGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRlc2NyaXB0aW9uIHx8IHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMudmlld0RldGFpbHMuZW1pdCh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aXRsZTogJ1N0ZXAgR3JvdXAgRGV0YWlscycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkV4dGVybmFsLmVtaXQoe3N0ZXA6IHRoaXMuY29uZmlnfSk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgLy8gRW1pdCBlZGl0SW5EZXB0aCAtIHByZWZlciByZW5kZXJlciBpbmRleCAoY29ycmVjdCk7IHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHdyb25nXG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInID8gdGhpcy5pbmRleCA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnbnVtYmVyJyA/IHRoaXMuc3RlcE51bWJlciAtIDEgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSAtIDEgOiAwKSk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KHsgc3RlcDogdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogaXNOYU4oaWR4IGFzIG51bWJlcikgPyAwIDogKGlkeCBhcyBudW1iZXIpIH0pO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgdGhpcy5saW5rLmVtaXQoKTtcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHVwbGljYXRpbmcpIHJldHVybjtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KCk7XG4gIH1cblxuICBvblNraXBUb2dnbGUoKTogdm9pZCB7XG4gICAgLy8gVG9nZ2xlOiBpZiBjdXJyZW50bHkgdHJ1ZSDihpIgcGFzcyBmYWxzZSAodW5za2lwKTsgaWYgY3VycmVudGx5IGZhbHNlL3VuZGVmaW5lZCDihpIgcGFzcyB0cnVlIChza2lwKVxuICAgIGNvbnN0IGN1cnJlbnRseVNraXBwZWQgPSAhISh0aGlzLmNvbmZpZz8uc2hvdWxkU2tpcCk7XG4gICAgY29uc3Qgc2hvdWxkU2tpcE5leHQgPSAhY3VycmVudGx5U2tpcHBlZDtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh7IC4uLnRoaXMuY29uZmlnLCBzaG91bGRTa2lwOiBzaG91bGRTa2lwTmV4dCB9IGFzIFRlc3RDYXNlU3RlcENvbmZpZyk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChjaGVja2VkKTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gc3RlcCBncm91cCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBzdGVwIGdyb3VwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBsYWJlbDogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnSUYgVFJVRScgOiAnRUxTRScsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGJyYW5jaDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUmUtZW1pdCBkZWxldGVCcmFuY2ggc28gc3RlcC1saXN0IGNhbiBvcGVuIGRlbGV0ZSBtb2RhbCBhbmQgY2FsbCBBUElcbiAgICB0aGlzLmRlbGV0ZUJyYW5jaC5lbWl0KGJyYW5jaCk7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIidjcWEtZmxleCBjcWEtZmxleC1jb2wnXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgPCEtLSBTdGVwIEdyb3VwIEhlYWRlciAtLT5cbiAgPGRpdiBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtaXRlbXMtY2VudGVyIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wICYmIGlzSW5zaWRlU3RlcEdyb3VwID8gJ2NxYS1wbC0yMCBjcWEtcHItNCcgOiAoaXNJbnNpZGVMb29wIHx8IGlzSW5zaWRlU3RlcEdyb3VwKSA/ICdjcWEtcGwtMTAgY3FhLXByLTQnIDogJ2NxYS1weC00JykgKyAoY29uZmlnPy5zaG91bGRTa2lwID8gJyBjcWEtc3RlcC1za2lwcGVkJyA6ICcnKVwiIFtzdHlsZS5vcGFjaXR5XT1cImNvbmZpZz8uc2hvdWxkU2tpcCA/ICcwLjYnIDogbnVsbFwiIHN0eWxlPVwibWluLWhlaWdodDogNTBweFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gc3RlcCBncm91cHMgaW5zaWRlIHN0ZXAgZ3JvdXBzIGNhbm5vdCBiZSByZW9yZGVyZWQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXIgJiYgIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gaGlkZSBmb3Igc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCJlZGl0YWJsZSAmJiAhaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1zdGVwLWdyb3VwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImV4cGFuZGVkXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBGb2xkZXIgSWNvbiAtLT5cbiAgICA8ZGl2PlxuICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNSAxNUMxNS4zOTc4IDE1IDE1Ljc3OTQgMTQuODQyIDE2LjA2MDcgMTQuNTYwN0MxNi4zNDIgMTQuMjc5NCAxNi41IDEzLjg5NzggMTYuNSAxMy41VjZDMTYuNSA1LjYwMjE3IDE2LjM0MiA1LjIyMDY0IDE2LjA2MDcgNC45MzkzNEMxNS43Nzk0IDQuNjU4MDQgMTUuMzk3OCA0LjUgMTUgNC41SDkuMDc1QzguODI0MTMgNC41MDI0NiA4LjU3NjY2IDQuNDQxOTYgOC4zNTUyMyA0LjMyNDAzQzguMTMzNzkgNC4yMDYxMSA3Ljk0NTQ3IDQuMDM0NTMgNy44MDc1IDMuODI1TDcuMiAyLjkyNUM3LjA2MzQyIDIuNzE3NiA2Ljg3NzQ4IDIuNTQ3MzYgNi42NTg4NyAyLjQyOTU1QzYuNDQwMjcgMi4zMTE3NCA2LjE5NTgzIDIuMjUwMDQgNS45NDc1IDIuMjVIM0MyLjYwMjE4IDIuMjUgMi4yMjA2NCAyLjQwODA0IDEuOTM5MzQgMi42ODkzNEMxLjY1ODA0IDIuOTcwNjQgMS41IDMuMzUyMTggMS41IDMuNzVWMTMuNUMxLjUgMTMuODk3OCAxLjY1ODA0IDE0LjI3OTQgMS45MzkzNCAxNC41NjA3QzIuMjIwNjQgMTQuODQyIDIuNjAyMTggMTUgMyAxNUgxNVpcIlxuICAgICAgICAgIGZpbGw9XCIjRUZGNkZGXCIgc3Ryb2tlPVwiIzYwQTVGQVwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEdyb3VwIE5hbWUgYW5kIERlc2NyaXB0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtZ2FwLVsycHhdXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPCEtLSBHcm91cCBOYW1lIElucHV0IC0tPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LWJvbGRcIj57e2dyb3VwTmFtZX19PC9wPlxuICAgICAgICA8IS0tIFJldXNhYmxlIFRhZyAtLT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJyZXVzYWJsZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzEuNXB4XSBjcWEtcm91bmRlZC1sZyBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRDhEOUZDXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzhBOENGNF1cIj5cbiAgICAgICAgICBSZXVzYWJsZVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj57e2Rlc2NyaXB0aW9ufX08L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0ZXBzIFN1bW1hcnkgYW5kIEFjdGlvbiBJY29ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXNlbGYtY2VudGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZz8uc2hvdWxkU2tpcFwiIGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj5Ta2lwcGVkPC9zcGFuPlxuICAgICAgPCEtLSBBY3Rpb24gSWNvbnMgLSBwbGFjZWQgZmlyc3QgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGFibGUgJiYgIWlzUmVvcmRlclwiIGNsYXNzPVwic3RlcC1hY3Rpb25zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXByLTJcIj5cblxuICAgICAgICA8IS0tIEVkaXQgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uU2tpcFRvZ2dsZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbYXR0ci50aXRsZV09XCJjb25maWc/LnNob3VsZFNraXAgPyAnVW5za2lwIHN0ZXAnIDogJ1NraXAgc3RlcCdcIiBbY2xhc3MuY3FhLXRleHQtWyMxNDQ3RTZdXT1cImNvbmZpZz8uc2hvdWxkU2tpcFwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMjUgOC43NUM5LjIxNjUgOC43NSAxMCA3Ljk2NjUgMTAgN0MxMCA2LjAzMzUgOS4yMTY1IDUuMjUgOC4yNSA1LjI1QzcuMjgzNSA1LjI1IDYuNSA2LjAzMzUgNi41IDdDNi41IDcuOTY2NSA3LjI4MzUgOC43NSA4LjI1IDguNzVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NTAzMyAyLjkxNjYzSDUuMjUwMzNDMi45OTUxNiAyLjkxNjYzIDEuMTY2OTkgNC43NDQ4IDEuMTY2OTkgNi45OTk5NkMxLjE2Njk5IDkuMjU1MTIgMi45OTUxNiAxMS4wODMzIDUuMjUwMzMgMTEuMDgzM0g4Ljc1MDMzQzExLjAwNTUgMTEuMDgzMyAxMi44MzM3IDkuMjU1MTIgMTIuODMzNyA2Ljk5OTk2QzEyLjgzMzcgNC43NDQ4IDExLjAwNTUgMi45MTY2MyA4Ljc1MDMzIDIuOTE2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBMaW5rIEljb24gLS0+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uTGluaygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkxpbmtcIiBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF82MDlfMjY1ODgpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82MDlfMjY1ODhcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgPCEtLSBEdXBsaWNhdGUgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0R1cGxpY2F0aW5nXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJpc0R1cGxpY2F0aW5nID8gJ0R1cGxpY2F0aW5nLi4uJyA6ICdEdXBsaWNhdGUnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XSBkaXNhYmxlZDpjcWEtb3BhY2l0eS02MCBkaXNhYmxlZDpjcWEtY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNEdXBsaWNhdGluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHVwbGljYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1sYWJlbD1cIkR1cGxpY2F0aW5nXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLW9wYWNpdHk9XCIwLjJcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDhBNiA2IDAgMCAwIDggMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XG4gICAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgOCA4XCIgdG89XCIzNjAgOCA4XCIgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiLz5cbiAgICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBEZWxldGUgSWNvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV4dGVybmFsIExpbmsgSWNvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbk9wZW5FeHRlcm5hbCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIk9wZW4gaW4gbmV3IHRhYlwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5OTk5RV0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAxNiAxN1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTEyIDguNjY2NjdWMTIuNjY2N0MxMiAxMy4wMjAzIDExLjg1OTUgMTMuMzU5NCAxMS42MDk1IDEzLjYwOTVDMTEuMzU5NCAxMy44NTk1IDExLjAyMDMgMTQgMTAuNjY2NyAxNEgzLjMzMzMzQzIuOTc5NzEgMTQgMi42NDA1NyAxMy44NTk1IDIuMzkwNTIgMTMuNjA5NUMyLjE0MDQ4IDEzLjM1OTQgMiAxMy4wMjAzIDIgMTIuNjY2N1Y1LjMzMzMzQzIgNC45Nzk3MSAyLjE0MDQ4IDQuNjQwNTcgMi4zOTA1MiA0LjM5MDUyQzIuNjQwNTcgNC4xNDA0OCAyLjk3OTcxIDQgMy4zMzMzMyA0SDcuMzMzMzNNMTAgMkgxNE0xNCAyVjZNMTQgMkw2LjY2NjY3IDkuMzMzMzNcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBTdGVwcyBTdW1tYXJ5IChzaG93IGxvYWRlciB3aGVuIGxvYWRpbmcgb24gZXhwYW5kKSAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZyB8fCBjb25maWc/LmxvYWRpbmdcIiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XSBjcWEtcm91bmRlZC1sZyBjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy0zIGNxYS1oLTMgY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLWJvcmRlci10LXRyYW5zcGFyZW50IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWFuaW1hdGUtc3BpblwiPjwvc3Bhbj5cbiAgICAgICAgTG9hZGluZy4uLlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhKGxvYWRpbmcgfHwgY29uZmlnPy5sb2FkaW5nKSAmJiBoYXNTdGVwcygpXCIgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICAgIDxhICpuZ0lmPVwiY29uZmlnLmRlc2NyaXB0aW9uICYmIGNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgIT09ICcnXCIgI3ZpZXdEZXRhaWxzVHJpZ2dlciBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtbm8tdW5kZXJsaW5lXCI+VmlldyBEZXRhaWxzPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuXG4gICAgICA8IS0tIENyZWF0ZWQgRGF0ZSAoZnJvbSBBUEkpIC0gbGFzdCBzbyBhbGlnbmVkIGFjcm9zcyBhbGwgc3RlcHMsIGZvcm1hdDogMjUgRmViIDIwMjYgLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5jcmVhdGVkRGF0ZVwiIGNsYXNzPVwic3RlcC1kYXRlIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1tbC1hdXRvIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCB3aXRoIE5lc3RlZCBTdGVwcyAoaW5kZW50IHNvIDE0LjEuMSwgMTQuMS4yIHNpdCB1bmRlciAxNC4xKSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgW2NsYXNzXT1cIidjcWEtZmxleCBjcWEtZmxleC1jb2wgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwJyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCcgOiAnY3FhLXBsLTEwJylcIj5cbiAgICA8IS0tIFNUQVJUIEdST1VQIE1hcmtlciAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtIG9ubHkgd2hlbiB0aGVyZSBhcmUgbmVzdGVkIHN0ZXBzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJuZXN0ZWRTdGVwcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEMUM0RTldXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0QxQzRFOTtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLXdoaXRlIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj5TVEFSVCBHUk9VUDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLXdoaXRlIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gTG9hZGluZyBJbmRpY2F0b3IgLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS04IGNxYS1weC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zXCI+XG4gICAgICAgIDwhLS0gU3Bpbm5lciAtLT5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLWgtNiBjcWEtdy02IGNxYS10ZXh0LVsjM0Y0M0VFXVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY3FhLW9wYWNpdHktMjVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICAgICAgICA8cGF0aCBjbGFzcz1cImNxYS1vcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbVwiPkxvYWRpbmcgc3RlcHMuLi48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8IS0tIE5lc3RlZCBTdGVwcyBDb250ZW50IChvbmx5IHNob3cgd2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDwhLS0gU3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzIGNhbm5vdCBiZSByZW9yZGVyZWQgLSBhbHdheXMgdXNlIG5vbi1kbmQgbGlzdCAobm8gZHJhZyBoYW5kbGUvZHJvcHpvbmUpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlclxuICAgICAgICAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICBbaW5kZXhdPVwiaVwiXG4gICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIlxuICAgICAgICBbaXNJbnNpZGVTdGVwR3JvdXBdPVwidHJ1ZVwiXG4gICAgICAgIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImZhbHNlXCJcbiAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIlxuICAgICAgICAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRPcGVuRXh0ZXJuYWwoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZER1cGxpY2F0ZSgkZXZlbnQsIHN0ZXApXCJcbiAgICAgICAgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQsIGkpXCJcbiAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHN0ZXBVcGRhdGUpPVwic3RlcFVwZGF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBGb3JMb29wKT1cImFkZFN0ZXBGb3JMb29wLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcyBjYW5ub3QgYmUgcmVvcmRlcmVkIC0gZG5kIGxpc3QgbmV2ZXIgc2hvd24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImZhbHNlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgIFtkbmREcm9wem9uZV09XCJbJ3N0ZXAnXVwiXG4gICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgKGRuZERyb3ApPVwib25EbmREcm9wKCRldmVudClcIj5cbiAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgW2RuZERyYWdnYWJsZV09XCJzdGVwXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyXG4gICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lzSW5zaWRlU3RlcEdyb3VwXT1cInRydWVcIlxuICAgICAgICAgIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiZmFsc2VcIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCJcbiAgICAgICAgICAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkT3BlbkV4dGVybmFsKCRldmVudClcIlxuICAgICAgICAgIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiXG4gICAgICAgICAgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzdGVwVXBkYXRlKT1cInN0ZXBVcGRhdGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwRm9yTG9vcCk9XCJhZGRTdGVwRm9yTG9vcC5lbWl0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRU5EIEdST1VQIE1hcmtlciAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtIG9ubHkgd2hlbiB0aGVyZSBhcmUgbmVzdGVkIHN0ZXBzIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00IGNxYS1iZy1bI0QxQzRFOV1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRDFDNEU5O1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci13aGl0ZSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj5FTkQgR1JPVVA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLXdoaXRlIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19