@cqa-lib/cqa-ui 1.1.205 → 1.1.207

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.
Files changed (43) hide show
  1. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +3 -3
  2. package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +9 -3
  3. package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +11 -3
  4. package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +6 -2
  5. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +8 -3
  6. package/esm2020/lib/test-case-details/custom-code-step/custom-code-step.component.mjs +11 -3
  7. package/esm2020/lib/test-case-details/database-step/database-step.component.mjs +11 -3
  8. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +8 -3
  9. package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +10 -2
  10. package/esm2020/lib/test-case-details/restore-session-step/restore-session-step.component.mjs +11 -3
  11. package/esm2020/lib/test-case-details/screenshot-step/screenshot-step.component.mjs +11 -3
  12. package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +11 -3
  13. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-data.mjs +1 -1
  14. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +27 -3
  15. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.service.mjs +8 -2
  16. package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +8 -2
  17. package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +37 -19
  18. package/esm2020/lib/test-case-details/upload-step/upload-step.component.mjs +11 -3
  19. package/esm2020/lib/test-case-details/verify-url-step/verify-url-step.component.mjs +11 -3
  20. package/fesm2015/cqa-lib-cqa-ui.mjs +197 -50
  21. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  22. package/fesm2020/cqa-lib-cqa-ui.mjs +194 -48
  23. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  24. package/lib/test-case-details/ai-agent-step/ai-agent-step.component.d.ts +6 -2
  25. package/lib/test-case-details/ai-verify-step/ai-verify-step.component.d.ts +6 -2
  26. package/lib/test-case-details/api-step/api-step.component.d.ts +6 -2
  27. package/lib/test-case-details/condition-step/condition-step.component.d.ts +5 -1
  28. package/lib/test-case-details/custom-code-step/custom-code-step.component.d.ts +6 -2
  29. package/lib/test-case-details/database-step/database-step.component.d.ts +6 -2
  30. package/lib/test-case-details/loop-step/loop-step.component.d.ts +5 -1
  31. package/lib/test-case-details/normal-step/normal-step.component.d.ts +7 -2
  32. package/lib/test-case-details/restore-session-step/restore-session-step.component.d.ts +6 -2
  33. package/lib/test-case-details/screenshot-step/screenshot-step.component.d.ts +6 -2
  34. package/lib/test-case-details/scroll-step/scroll-step.component.d.ts +6 -2
  35. package/lib/test-case-details/step-details-drawer/step-details-drawer-data.d.ts +2 -0
  36. package/lib/test-case-details/step-details-drawer/step-details-drawer.component.d.ts +3 -0
  37. package/lib/test-case-details/step-details-drawer/step-details-drawer.service.d.ts +6 -1
  38. package/lib/test-case-details/step-group/step-group.component.d.ts +5 -1
  39. package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +6 -3
  40. package/lib/test-case-details/upload-step/upload-step.component.d.ts +6 -2
  41. package/lib/test-case-details/verify-url-step/verify-url-step.component.d.ts +6 -2
  42. package/package.json +1 -1
  43. package/styles.css +1 -1
@@ -33,12 +33,14 @@ export class StepDetailsDrawerComponent {
33
33
  this.dynamicFields = [];
34
34
  this.drawerTitleValue = 'Step Details';
35
35
  this.advancedExpanded = false;
36
+ this.pwLocator = [];
36
37
  /** Cached select configs per field key (stable refs for change detection). */
37
38
  this.selectConfigCache = {};
38
39
  this.step = data?.step ?? {};
39
40
  this.stepNumber = data?.stepNumber ?? 1;
40
41
  this.dynamicFields = data?.dynamicFields ?? [];
41
42
  this.drawerTitleValue = data?.title ?? 'Step Details';
43
+ this.pwLocator = data?.pwLocator ?? this.step.pwLocator ?? [];
42
44
  this.form = this.fb.group({});
43
45
  this.buildFormFromDynamicFields();
44
46
  }
@@ -81,6 +83,10 @@ export class StepDetailsDrawerComponent {
81
83
  if (this.stepData != null) {
82
84
  this.step = this.stepData;
83
85
  this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
86
+ // Initialize pwLocator from stepData if available
87
+ if (this.stepData.pwLocator) {
88
+ this.pwLocator = Array.isArray(this.stepData.pwLocator) ? [...this.stepData.pwLocator] : [];
89
+ }
84
90
  }
85
91
  if (this.dynamicFieldsInput != null) {
86
92
  this.dynamicFields = this.dynamicFieldsInput;
@@ -97,6 +103,10 @@ export class StepDetailsDrawerComponent {
97
103
  if (this.stepData != null) {
98
104
  this.step = this.stepData;
99
105
  this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
106
+ // Initialize pwLocator from stepData if available
107
+ if (this.stepData.pwLocator) {
108
+ this.pwLocator = Array.isArray(this.stepData.pwLocator) ? [...this.stepData.pwLocator] : [];
109
+ }
100
110
  }
101
111
  if (this.dynamicFieldsInput != null) {
102
112
  this.dynamicFields = this.dynamicFieldsInput;
@@ -161,6 +171,20 @@ export class StepDetailsDrawerComponent {
161
171
  this.setStepValue(field.key, this.form.get(field.key)?.value);
162
172
  }
163
173
  }
174
+ // Save pwLocator (Other Locators)
175
+ this.step.pwLocator = [...this.pwLocator];
176
+ }
177
+ copyLocator(inputElement) {
178
+ inputElement.select();
179
+ document.execCommand('copy');
180
+ inputElement.setSelectionRange(0, 0);
181
+ inputElement.focus();
182
+ }
183
+ deleteLocator(index) {
184
+ if (index >= 0 && index < this.pwLocator.length) {
185
+ this.pwLocator.splice(index, 1);
186
+ this.cdr.markForCheck();
187
+ }
164
188
  }
165
189
  /** Build select config for dropdown field (cached per key). */
166
190
  getSelectConfig(field) {
@@ -182,10 +206,10 @@ export class StepDetailsDrawerComponent {
182
206
  }
183
207
  }
184
208
  StepDetailsDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, deps: [{ token: STEP_DETAILS_DRAWER_REF }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: STEP_DETAILS_DRAWER_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
185
- StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput", dynamicFieldsInput: "dynamicFieldsInput", drawerTitle: "drawerTitle" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
209
+ StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput", dynamicFieldsInput: "dynamicFieldsInput", drawerTitle: "drawerTitle" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input\n type=\"text\"\n [value]=\"locator\"\n #locatorInput\n readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button\n type=\"button\"\n (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button\n type=\"button\"\n (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
186
210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, decorators: [{
187
211
  type: Component,
188
- args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
212
+ args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input\n type=\"text\"\n [value]=\"locator\"\n #locatorInput\n readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button\n type=\"button\"\n (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button\n type=\"button\"\n (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
189
213
  }], ctorParameters: function () { return [{ type: i9.StepDetailsDrawerRef, decorators: [{
190
214
  type: Inject,
191
215
  args: [STEP_DETAILS_DRAWER_REF]
@@ -209,4 +233,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
209
233
  }], drawerTitle: [{
210
234
  type: Input
211
235
  }] } });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT2pIOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBMkRyQyxZQUMyQyxHQUF5QixFQUMxRCxFQUFlLEVBQ2YsR0FBc0IsRUFDZ0IsSUFBNEI7UUFIakMsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFDMUQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0R0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFekQsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0Msb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQ3hELDZGQUE2RjtRQUNwRix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hFLHdFQUF3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QWdCLENBQUM7SUFDL0IsQ0FBQzs7dUhBMUxVLDBCQUEwQixrQkE0RDNCLHVCQUF1Qix5RUFHWCx3QkFBd0I7MkdBL0RuQywwQkFBMEIsc1dDakN2Qyx1L1VBa0xBOzJGRGpKYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UseUJBQXlCLFFBRTdCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzswQkE4RDVDLE1BQU07MkJBQUMsdUJBQXVCOzswQkFHOUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx3QkFBd0I7NENBOURwQyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiwgU3RlcERldGFpbHNEcmF3ZXJSZWYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhLCBEeW5hbWljRmllbGRDb25maWcgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItZGF0YSc7XG5pbXBvcnQgeyBUZXN0Q2FzZVN0ZXBDb25maWcgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHR5cGUge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuLyoqXG4gKiBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKS5cbiAqIFJlbmRlcnMgb25seSBmcm9tIHRoZSBwcm92aWRlZCBEeW5hbWljRmllbGRDb25maWdbXTsgbm8gZmlsdGVyaW5nIG9yIHN0ZXAtdHlwZS1iYXNlZCBmaWVsZCBsb2dpYy5cbiAqIEVhY2ggc3RlcCBpbnN0YW5jZSByZWNlaXZlcyBpdHMgb3duIGNvbXBsZXRlIGZpZWxkIGNvbmZpZ3VyYXRpb24uIEdlbmVyaWMga2V5LWJhc2VkIHN0ZXAgcmVhZC93cml0ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgc2F2ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVBc1RlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG5cbiAgQElucHV0KCkgc3RlcERhdGE6IFRlc3RDYXNlU3RlcENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzdGVwTnVtYmVySW5wdXQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBwcm92aWRlZCAoZS5nLiBTdG9yeWJvb2spLCB1c2UgaW5zdGVhZCBvZiBTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEuZHluYW1pY0ZpZWxkcy4gKi9cbiAgQElucHV0KCkgZHluYW1pY0ZpZWxkc0lucHV0OiBEeW5hbWljRmllbGRDb25maWdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlIGFzIGRyYXdlciBoZWFkZXIgdGl0bGUgKG92ZXJyaWRlcyBkYXRhLnRpdGxlKS4gKi9cbiAgQElucHV0KCkgZHJhd2VyVGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZztcbiAgc3RlcE51bWJlcjogbnVtYmVyIHwgc3RyaW5nO1xuICBkeW5hbWljRmllbGRzOiBEeW5hbWljRmllbGRDb25maWdbXSA9IFtdO1xuICBkcmF3ZXJUaXRsZVZhbHVlID0gJ1N0ZXAgRGV0YWlscyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgZm9ybTogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgcGVyIGZpZWxkIGtleSAoc3RhYmxlIHJlZnMgZm9yIGNoYW5nZSBkZXRlY3Rpb24pLiAqL1xuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0ge307XG5cbiAgLyoqIEFsbCBmaWVsZHMgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgKHNhbWUgcmVmZXJlbmNlOyB1c2VkIGZvciBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIHRlbXBsYXRlKS4gKi9cbiAgZ2V0IGFsbEZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcztcbiAgfVxuXG4gIC8qKiBGaWVsZHMgaW4gbWFpbiBzZWN0aW9uIChzZWN0aW9uID09PSAnbWFpbicgb3IgdW5kZWZpbmVkKS4gKi9cbiAgZ2V0IG1haW5GaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHMuZmlsdGVyKChmKSA9PiAoZi5zZWN0aW9uID8/ICdtYWluJykgPT09ICdtYWluJyk7XG4gIH1cblxuICAvKiogRmllbGRzIGluIGNvbnN0cmFpbnRzIHNlY3Rpb24uICovXG4gIGdldCBjb25zdHJhaW50c0ZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcy5maWx0ZXIoKGYpID0+IGYuc2VjdGlvbiA9PT0gJ2NvbnN0cmFpbnRzJyk7XG4gIH1cblxuICAvKiogRmllbGRzIGluIGFkdmFuY2VkIHNlY3Rpb24gKGluc2lkZSBleHBhbmRhYmxlIGJsb2NrKS4gKi9cbiAgZ2V0IGFkdmFuY2VkRmllbGRzKCk6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRmllbGRzLmZpbHRlcigoZikgPT4gZi5zZWN0aW9uID09PSAnYWR2YW5jZWQnKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGZpZWxkIGF0IGluZGV4IGlzIHRoZSBmaXJzdCBpbiBpdHMgc2VjdGlvbiAoZm9yIHNob3dpbmcgc2VjdGlvbiBoZWFkZXJzKS4gKi9cbiAgaXNGaXJzdEluU2VjdGlvbihpbmRleDogbnVtYmVyLCBzZWN0aW9uOiAnbWFpbicgfCAnY29uc3RyYWludHMnIHwgJ2FkdmFuY2VkJyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXhdO1xuICAgIGlmICghZikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGZTZWN0aW9uID0gZi5zZWN0aW9uID8/ICdtYWluJztcbiAgICBpZiAoZlNlY3Rpb24gIT09IHNlY3Rpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXggLSAxXTtcbiAgICByZXR1cm4gKHByZXY/LnNlY3Rpb24gPz8gJ21haW4nKSAhPT0gc2VjdGlvbjtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGZpZWxkIGF0IGluZGV4IGlzIG5vdCBpbiB0aGUgYWR2YW5jZWQgc2VjdGlvbiAocmVuZGVyIGluIG1haW4gZmxvdykuICovXG4gIGlzTm9uQWR2YW5jZWRGaWVsZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZiA9IHRoaXMuZHluYW1pY0ZpZWxkc1tpbmRleF07XG4gICAgcmV0dXJuIGYgIT0gbnVsbCAmJiAoZi5zZWN0aW9uID8/ICdtYWluJykgIT09ICdhZHZhbmNlZCc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFNURVBfREVUQUlMU19EUkFXRVJfUkVGKSBwcml2YXRlIHJlZjogU3RlcERldGFpbHNEcmF3ZXJSZWYsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBKSBkYXRhPzogU3RlcERldGFpbHNEcmF3ZXJEYXRhXG4gICkge1xuICAgIHRoaXMuc3RlcCA9IGRhdGE/LnN0ZXAgPz8gKHt9IGFzIFRlc3RDYXNlU3RlcENvbmZpZyk7XG4gICAgdGhpcy5zdGVwTnVtYmVyID0gZGF0YT8uc3RlcE51bWJlciA/PyAxO1xuICAgIHRoaXMuZHluYW1pY0ZpZWxkcyA9IGRhdGE/LmR5bmFtaWNGaWVsZHMgPz8gW107XG4gICAgdGhpcy5kcmF3ZXJUaXRsZVZhbHVlID0gZGF0YT8udGl0bGUgPz8gJ1N0ZXAgRGV0YWlscyc7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCB8fCB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsIHx8IHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY0ZpZWxkcyA9IHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCAmJiB0aGlzLmRyYXdlclRpdGxlICE9PSAnJykge1xuICAgICAgICB0aGlzLmRyYXdlclRpdGxlVmFsdWUgPSB0aGlzLmRyYXdlclRpdGxlO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGVwRGF0YSddIHx8IGNoYW5nZXNbJ3N0ZXBOdW1iZXJJbnB1dCddIHx8IGNoYW5nZXNbJ2R5bmFtaWNGaWVsZHNJbnB1dCddIHx8IGNoYW5nZXNbJ2RyYXdlclRpdGxlJ10pIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBEYXRhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGVwID0gdGhpcy5zdGVwRGF0YTtcbiAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVySW5wdXQgPz8gKHRoaXMuc3RlcERhdGEgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5keW5hbWljRmllbGRzSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmR5bmFtaWNGaWVsZHMgPSB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRyYXdlclRpdGxlICE9IG51bGwgJiYgdGhpcy5kcmF3ZXJUaXRsZSAhPT0gJycpIHtcbiAgICAgICAgdGhpcy5kcmF3ZXJUaXRsZVZhbHVlID0gdGhpcy5kcmF3ZXJUaXRsZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRGb3JtRnJvbUR5bmFtaWNGaWVsZHMoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5keW5hbWljRmllbGRzKSB7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmdldFN0ZXBWYWx1ZShmaWVsZC5rZXkpO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgJiYgZmllbGQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGZpZWxkLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgIDogcmF3O1xuICAgICAgZ3JvdXBbZmllbGQua2V5XSA9IFt2YWx1ZV07XG4gICAgfVxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXApO1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKiBSZWFkIHZhbHVlIGZyb20gc3RlcCBieSBrZXkuIE5vIHN0ZXAtdHlwZSBsb2dpYzsgc3RlcCBpcyBhIGdlbmVyaWMga2V5LXZhbHVlIGJhZy4gKi9cbiAgZ2V0U3RlcFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJhdyA9IHN0ZXBba2V5XTtcbiAgICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuXG4gIC8qKiBXcml0ZSB2YWx1ZSB0byBzdGVwIGJ5IGtleS4gTm8gc3RlcC10eXBlIGxvZ2ljOyBzdGVwIGlzIGEgZ2VuZXJpYyBrZXktdmFsdWUgYmFnLiAqL1xuICBzZXRTdGVwVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0ZXBba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25TYXZlQXNUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5Rm9ybVRvU3RlcCgpO1xuICAgIHRoaXMuc2F2ZUFzVGVtcGxhdGUuZW1pdCh0aGlzLnN0ZXApO1xuICAgIHRoaXMucmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZUFzVGVtcGxhdGUnLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gIH1cblxuICBvblNhdmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlGb3JtVG9TdGVwKCk7XG4gICAgdGhpcy5zYXZlQ2hhbmdlcy5lbWl0KHRoaXMuc3RlcCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlQ2hhbmdlcycsIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGb3JtVG9TdGVwKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5keW5hbWljRmllbGRzKSB7XG4gICAgICBpZiAodGhpcy5mb3JtLmNvbnRhaW5zKGZpZWxkLmtleSkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGVwVmFsdWUoZmllbGQua2V5LCB0aGlzLmZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZyBmb3IgZHJvcGRvd24gZmllbGQgKGNhY2hlZCBwZXIga2V5KS4gKi9cbiAgZ2V0U2VsZWN0Q29uZmlnKGZpZWxkOiBEeW5hbWljRmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2Ryb3Bkb3duJyB8fCAhZmllbGQub3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldKSByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldO1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gZmllbGQub3B0aW9ucy5tYXAoKG8pID0+ICh7IHZhbHVlOiBvLnZhbHVlLCBsYWJlbDogby5sYWJlbCB9KSk7XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldID0ge1xuICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICBwbGFjZWhvbGRlcjogZmllbGQucGxhY2Vob2xkZXIgPz8gZmllbGQubGFiZWwsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlZCBoZWFkZXIgdGl0bGUgZm9yIHRlbXBsYXRlOiBASW5wdXQgZHJhd2VyVGl0bGUgPiBpbmplY3RlZCBkYXRhLnRpdGxlID4gZGVmYXVsdC4gKi9cbiAgZ2V0IGRpc3BsYXlUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRyYXdlclRpdGxlVmFsdWU7XG4gIH1cbn1cbiIsIjwhLS0gU3RlcCBEZXRhaWxzIERyYXdlciDigJMgRWRpdCBJbiBEZXB0aC4gRnVsbHkgZHluYW1pYyBmcm9tIER5bmFtaWNGaWVsZENvbmZpZ1tdLiAtLT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNDgwcHhdIGNxYS1ib3gtYm9yZGVyXCI+XG4gIDwhLS0gSGVhZGVyOiBiYWNrIGNoZXZyb24sIHRpdGxlLCBTdGVwIE4gcGlsbCwgY2xvc2UgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS1weC00IGNxYS1weS00IGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC10LVsxMnB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25CYWNrKClcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkJhY2tcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsyMHB4XVwiPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZsZXgtMVwiPlxuICAgICAgICB7eyBkaXNwbGF5VGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRURFOUZFXSBjcWEtdGV4dC1bIzdDM0FFRF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bVwiPlxuICAgICAgICBTdGVwIHt7IHN0ZXBOdW1iZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1pbi1oLVsyOHB4XSBjcWEtbWluLXctWzI4cHhdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsyMHB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj4gPC9kaXY+XG5cbiAgPCEtLSBDb250ZW50OiBhbGwgZmllbGRzIGZyb20gZHluYW1pY0ZpZWxkcyBhcnJheSAobWFpbiArIGNvbnN0cmFpbnRzIGluIG9yZGVyLCB0aGVuIGFkdmFuY2VkIGdyb3VwZWQpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkeW5hbWljRmllbGRzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgIDwhLS0gQWxsIG5vbi1hZHZhbmNlZCBmaWVsZHMgaW4gYXJyYXkgb3JkZXIgd2l0aCBzZWN0aW9uIGhlYWRlcnMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGR5bmFtaWNGaWVsZHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOb25BZHZhbmNlZEZpZWxkKGkpXCI+XG4gICAgICAgICAgICA8cCAqbmdJZj1cImlzRmlyc3RJblNlY3Rpb24oaSwgJ21haW4nKVwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1iLTMgY3FhLW10LTBcIj5BdHRyaWJ1dGVzPC9wPlxuICAgICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdjb25zdHJhaW50cycpXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMiBjcWEtbXQtMFwiPkNvbnN0cmFpbnRzPC9wPlxuXG4gICAgICAgICAgICA8IS0tIHN0cmluZyAvIHVuZGVmaW5lZCDihpIgdGV4dCBpbnB1dCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gbnVtYmVyIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gdGV4dGFyZWEgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ3RleHRhcmVhJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGRUUyRTJdIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtXCI+UmVxdWlyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cImZpZWxkLnJvd3MgfHwgNFwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtcC0yIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMjBweF1cIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaWVsZC50aXBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMFwiPnt7IGZpZWxkLnRpcCB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGNvZGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2NvZGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiOFwiXG4gICAgICAgICAgICAgICAgcmVzaXplPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLXAtMiBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBib29sZWFuIOKGkiB0b2dnbGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Jvb2xlYW4nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj57eyBmaWVsZC5sYWJlbCB9fTwvcD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnN1YkxhYmVsXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLnN1YkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGRyb3Bkb3duIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkcm9wZG93bicgJiYgZ2V0U2VsZWN0Q29uZmlnKGZpZWxkKSAmJiBmb3JtLmNvbnRhaW5zKGZpZWxkLmtleSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKGZpZWxkKSFcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSAoYWxsIGFkdmFuY2VkIGZpZWxkcyBmcm9tIGFycmF5KSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkdmFuY2VkRmllbGRzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1weS0yIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3Bhbj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsyMHB4XSBjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB0LTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGFkdmFuY2VkRmllbGRzXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdib29sZWFuJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M11cIj57eyBmaWVsZC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMEEwQTBBXVwiICpuZ0lmPVwiZmllbGQuc3ViTGFiZWxcIj57eyBmaWVsZC5zdWJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cImR5bmFtaWNGaWVsZHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+Tm8gZmllbGRzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc3RlcC48L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuICA8IS0tIEZvb3RlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtYmctWyNGNUY1RjU0RF1cIj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwidGV4dFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLXRleHQtWyMzNzQxNTFdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPjwvZGl2PlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidTYXZlIGFzIFRlbXBsYXRlJ1wiIChjbGlja2VkKT1cIm9uU2F2ZUFzVGVtcGxhdGUoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCI+PC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiIChjbGlja2VkKT1cIm9uU2F2ZUNoYW5nZXMoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJnLVsjM0Y0M0VFXSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT2pIOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBNERyQyxZQUMyQyxHQUF5QixFQUMxRCxFQUFlLEVBQ2YsR0FBc0IsRUFDZ0IsSUFBNEI7UUFIakMsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFDMUQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUR0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFekQsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0Msb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQ3hELDZGQUE2RjtRQUNwRix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hFLHdFQUF3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N0MsT0FBTztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOzt1SEFwTlUsMEJBQTBCLGtCQTZEM0IsdUJBQXVCLHlFQUdYLHdCQUF3QjsyR0FoRW5DLDBCQUEwQixzV0NqQ3ZDLG9tWUFnTkE7MkZEL0thLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSx5QkFBeUIsUUFFN0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07OzBCQStENUMsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUc5QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHdCQUF3Qjs0Q0EvRHBDLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCBTdGVwRGV0YWlsc0RyYXdlckRhdGEsIER5bmFtaWNGaWVsZENvbmZpZyB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1kYXRhJztcbmltcG9ydCB7IFRlc3RDYXNlU3RlcENvbmZpZyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogUmVuZGVycyBvbmx5IGZyb20gdGhlIHByb3ZpZGVkIER5bmFtaWNGaWVsZENvbmZpZ1tdOyBubyBmaWx0ZXJpbmcgb3Igc3RlcC10eXBlLWJhc2VkIGZpZWxkIGxvZ2ljLlxuICogRWFjaCBzdGVwIGluc3RhbmNlIHJlY2VpdmVzIGl0cyBvd24gY29tcGxldGUgZmllbGQgY29uZmlndXJhdGlvbi4gR2VuZXJpYyBrZXktYmFzZWQgc3RlcCByZWFkL3dyaXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1kZXRhaWxzLWRyYXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VTdGVwQ29uZmlnPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2F2ZUFzVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcblxuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkIChlLmcuIFN0b3J5Ym9vayksIHVzZSBpbnN0ZWFkIG9mIFNURVBfREVUQUlMU19EUkFXRVJfREFUQS5keW5hbWljRmllbGRzLiAqL1xuICBASW5wdXQoKSBkeW5hbWljRmllbGRzSW5wdXQ6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCB1c2UgYXMgZHJhd2VyIGhlYWRlciB0aXRsZSAob3ZlcnJpZGVzIGRhdGEudGl0bGUpLiAqL1xuICBASW5wdXQoKSBkcmF3ZXJUaXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIGR5bmFtaWNGaWVsZHM6IER5bmFtaWNGaWVsZENvbmZpZ1tdID0gW107XG4gIGRyYXdlclRpdGxlVmFsdWUgPSAnU3RlcCBEZXRhaWxzJztcbiAgYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIHB3TG9jYXRvcjogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIHBlciBmaWVsZCBrZXkgKHN0YWJsZSByZWZzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuXG4gIC8qKiBBbGwgZmllbGRzIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IChzYW1lIHJlZmVyZW5jZTsgdXNlZCBmb3Igc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBpbiB0ZW1wbGF0ZSkuICovXG4gIGdldCBhbGxGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHM7XG4gIH1cblxuICAvKiogRmllbGRzIGluIG1haW4gc2VjdGlvbiAoc2VjdGlvbiA9PT0gJ21haW4nIG9yIHVuZGVmaW5lZCkuICovXG4gIGdldCBtYWluRmllbGRzKCk6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRmllbGRzLmZpbHRlcigoZikgPT4gKGYuc2VjdGlvbiA/PyAnbWFpbicpID09PSAnbWFpbicpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBjb25zdHJhaW50cyBzZWN0aW9uLiAqL1xuICBnZXQgY29uc3RyYWludHNGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHMuZmlsdGVyKChmKSA9PiBmLnNlY3Rpb24gPT09ICdjb25zdHJhaW50cycpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBhZHZhbmNlZCBzZWN0aW9uIChpbnNpZGUgZXhwYW5kYWJsZSBibG9jaykuICovXG4gIGdldCBhZHZhbmNlZEZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcy5maWx0ZXIoKGYpID0+IGYuc2VjdGlvbiA9PT0gJ2FkdmFuY2VkJyk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyB0aGUgZmlyc3QgaW4gaXRzIHNlY3Rpb24gKGZvciBzaG93aW5nIHNlY3Rpb24gaGVhZGVycykuICovXG4gIGlzRmlyc3RJblNlY3Rpb24oaW5kZXg6IG51bWJlciwgc2VjdGlvbjogJ21haW4nIHwgJ2NvbnN0cmFpbnRzJyB8ICdhZHZhbmNlZCcpOiBib29sZWFuIHtcbiAgICBjb25zdCBmID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4XTtcbiAgICBpZiAoIWYpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBmU2VjdGlvbiA9IGYuc2VjdGlvbiA/PyAnbWFpbic7XG4gICAgaWYgKGZTZWN0aW9uICE9PSBzZWN0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluZGV4ID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4IC0gMV07XG4gICAgcmV0dXJuIChwcmV2Py5zZWN0aW9uID8/ICdtYWluJykgIT09IHNlY3Rpb247XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyBub3QgaW4gdGhlIGFkdmFuY2VkIHNlY3Rpb24gKHJlbmRlciBpbiBtYWluIGZsb3cpLiAqL1xuICBpc05vbkFkdmFuY2VkRmllbGQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXhdO1xuICAgIHJldHVybiBmICE9IG51bGwgJiYgKGYuc2VjdGlvbiA/PyAnbWFpbicpICE9PSAnYWR2YW5jZWQnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRikgcHJpdmF0ZSByZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNURVBfREVUQUlMU19EUkFXRVJfREFUQSkgZGF0YT86IFN0ZXBEZXRhaWxzRHJhd2VyRGF0YVxuICApIHtcbiAgICB0aGlzLnN0ZXAgPSBkYXRhPy5zdGVwID8/ICh7fSBhcyBUZXN0Q2FzZVN0ZXBDb25maWcpO1xuICAgIHRoaXMuc3RlcE51bWJlciA9IGRhdGE/LnN0ZXBOdW1iZXIgPz8gMTtcbiAgICB0aGlzLmR5bmFtaWNGaWVsZHMgPSBkYXRhPy5keW5hbWljRmllbGRzID8/IFtdO1xuICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IGRhdGE/LnRpdGxlID8/ICdTdGVwIERldGFpbHMnO1xuICAgIHRoaXMucHdMb2NhdG9yID0gZGF0YT8ucHdMb2NhdG9yID8/ICh0aGlzLnN0ZXAgYXMgYW55KS5wd0xvY2F0b3IgPz8gW107XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCB8fCB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsIHx8IHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBEYXRhJ10gfHwgY2hhbmdlc1snc3RlcE51bWJlcklucHV0J10gfHwgY2hhbmdlc1snZHluYW1pY0ZpZWxkc0lucHV0J10gfHwgY2hhbmdlc1snZHJhd2VyVGl0bGUnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5nZXRTdGVwVmFsdWUoZmllbGQua2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpICYmIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBmaWVsZC5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA6IHJhdztcbiAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBbdmFsdWVdO1xuICAgIH1cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGdyb3VwKTtcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlID0ge307XG4gIH1cblxuICAvKiogUmVhZCB2YWx1ZSBmcm9tIHN0ZXAgYnkga2V5LiBObyBzdGVwLXR5cGUgbG9naWM7IHN0ZXAgaXMgYSBnZW5lcmljIGtleS12YWx1ZSBiYWcuICovXG4gIGdldFN0ZXBWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByYXcgPSBzdGVwW2tleV07XG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICAvKiogV3JpdGUgdmFsdWUgdG8gc3RlcCBieSBrZXkuIE5vIHN0ZXAtdHlwZSBsb2dpYzsgc3RlcCBpcyBhIGdlbmVyaWMga2V5LXZhbHVlIGJhZy4gKi9cbiAgc2V0U3RlcFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzdGVwW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uU2F2ZUFzVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVBc1RlbXBsYXRlLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVBc1RlbXBsYXRlJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5Rm9ybVRvU3RlcCgpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdCh0aGlzLnN0ZXApO1xuICAgIHRoaXMucmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybVRvU3RlcCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250YWlucyhmaWVsZC5rZXkpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RlcFZhbHVlKGZpZWxkLmtleSwgdGhpcy5mb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNhdmUgcHdMb2NhdG9yIChPdGhlciBMb2NhdG9ycylcbiAgICAodGhpcy5zdGVwIGFzIGFueSkucHdMb2NhdG9yID0gWy4uLnRoaXMucHdMb2NhdG9yXTtcbiAgfVxuXG4gIGNvcHlMb2NhdG9yKGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIGlucHV0RWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGRlbGV0ZUxvY2F0b3IoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wd0xvY2F0b3IubGVuZ3RoKSB7XG4gICAgICB0aGlzLnB3TG9jYXRvci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWcgZm9yIGRyb3Bkb3duIGZpZWxkIChjYWNoZWQgcGVyIGtleSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhmaWVsZDogRHluYW1pY0ZpZWxkQ29uZmlnKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdkcm9wZG93bicgfHwgIWZpZWxkLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSkgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XTtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IGZpZWxkLm9wdGlvbnMubWFwKChvKSA9PiAoeyB2YWx1ZTogby52YWx1ZSwgbGFiZWw6IG8ubGFiZWwgfSkpO1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSA9IHtcbiAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgcGxhY2Vob2xkZXI6IGZpZWxkLnBsYWNlaG9sZGVyID8/IGZpZWxkLmxhYmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlW2ZpZWxkLmtleV07XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgaGVhZGVyIHRpdGxlIGZvciB0ZW1wbGF0ZTogQElucHV0IGRyYXdlclRpdGxlID4gaW5qZWN0ZWQgZGF0YS50aXRsZSA+IGRlZmF1bHQuICovXG4gIGdldCBkaXNwbGF5VGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJUaXRsZVZhbHVlO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIEZ1bGx5IGR5bmFtaWMgZnJvbSBEeW5hbWljRmllbGRDb25maWdbXS4gLS0+XG48ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtbWF4LXctWzQ4MHB4XSBjcWEtYm94LWJvcmRlclwiPlxuICA8IS0tIEhlYWRlcjogYmFjayBjaGV2cm9uLCB0aXRsZSwgU3RlcCBOIHBpbGwsIGNsb3NlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktNCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtdC1bMTJweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTVFNUU1XVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQmFjaygpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy04IGNxYS1oLTggY3FhLXJvdW5kZWQgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS1iZy1bI0YzRjRGNl0gY3FhLXAtMFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJCYWNrXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LTFcIj5cbiAgICAgICAge3sgZGlzcGxheVRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgU3RlcCB7eyBzdGVwTnVtYmVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogYWxsIGZpZWxkcyBmcm9tIGR5bmFtaWNGaWVsZHMgYXJyYXkgKG1haW4gKyBjb25zdHJhaW50cyBpbiBvcmRlciwgdGhlbiBhZHZhbmNlZCBncm91cGVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZHluYW1pY0ZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNFwiPlxuICAgICAgICA8IS0tIEFsbCBub24tYWR2YW5jZWQgZmllbGRzIGluIGFycmF5IG9yZGVyIHdpdGggc2VjdGlvbiBoZWFkZXJzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBkeW5hbWljRmllbGRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTm9uQWR2YW5jZWRGaWVsZChpKVwiPlxuICAgICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdtYWluJylcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tYi0zIGNxYS1tdC0wXCI+QXR0cmlidXRlczwvcD5cbiAgICAgICAgICAgIDxwICpuZ0lmPVwiaXNGaXJzdEluU2VjdGlvbihpLCAnY29uc3RyYWludHMnKVwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1iLTIgY3FhLW10LTBcIj5Db25zdHJhaW50czwvcD5cblxuICAgICAgICAgICAgPCEtLSBzdHJpbmcgLyB1bmRlZmluZWQg4oaSIHRleHQgaW5wdXQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZpZWxkLnR5cGUgPz8gJ3N0cmluZycpID09PSAnc3RyaW5nJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIG51bWJlciAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbcm93c109XCJmaWVsZC5yb3dzIHx8IDRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLXAtMiBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxwICpuZ0lmPVwiZmllbGQudGlwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTBcIj57eyBmaWVsZC50aXAgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBjb2RlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIHJlc2l6ZT1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gYm9vbGVhbiDihpIgdG9nZ2xlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdib29sZWFuJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+e3sgZmllbGQubGFiZWwgfX08L3A+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5zdWJMYWJlbFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5zdWJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBkcm9wZG93biAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQ6IGV4cGFuZGFibGUgKGFsbCBhZHZhbmNlZCBmaWVsZHMgZnJvbSBhcnJheSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZHZhbmNlZEZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1bI0U1RTdFQl1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VkRXhwYW5kZWQgPSAhYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPHNwYW4+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIGV4cGFuZF9sZXNzXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1wdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBhZHZhbmNlZEZpZWxkc1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZpZWxkLnR5cGUgPz8gJ3N0cmluZycpID09PSAnc3RyaW5nJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnYm9vbGVhbidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdXCI+e3sgZmllbGQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzBBMEEwQV1cIiAqbmdJZj1cImZpZWxkLnN1YkxhYmVsXCI+e3sgZmllbGQuc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBnZXRTZWxlY3RDb25maWcoZmllbGQpICYmIGZvcm0uY29udGFpbnMoZmllbGQua2V5KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJmb3JtXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcoZmllbGQpIVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE90aGVyIExvY2F0b3JzIHNlY3Rpb24gKG1hdGNoaW5nIG9sZCBVSSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwd0xvY2F0b3IgJiYgcHdMb2NhdG9yLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tYi0zIGNxYS1tdC0wXCI+T3RoZXIgTG9jYXRvcnM8L3A+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbG9jYXRvciBvZiBwd0xvY2F0b3I7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImNxYS1tYi0zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9jYXRvciAhPT0gJydcIiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwibG9jYXRvclwiXG4gICAgICAgICAgICAgICAgI2xvY2F0b3JJbnB1dFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0yIGNxYS1wci0yMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsxNHB4XSBjcWEtYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyNnB4O1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlMb2NhdG9yKGxvY2F0b3JJbnB1dClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTIgY3FhLXRvcC0xLzIgY3FhLXRyYW5zZm9ybSBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcC0xIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xpY2sgdG8gQ29weVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVMb2NhdG9yKGkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wLTEgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjREMyNjI2XVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxwICpuZ0lmPVwiZHluYW1pY0ZpZWxkcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5ObyBmaWVsZHMgY29uZmlndXJlZCBmb3IgdGhpcyBzdGVwLjwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj4gPC9kaXY+XG4gIDwhLS0gRm9vdGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1iZy1bI0Y1RjVGNTREXVwiPlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtdGV4dC1bIzM3NDE1MV0nXCI+PC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+PC9kaXY+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgYXMgVGVtcGxhdGUnXCIgKGNsaWNrZWQpPVwib25TYXZlQXNUZW1wbGF0ZSgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidTYXZlIENoYW5nZXMnXCIgKGNsaWNrZWQpPVwib25TYXZlQ2hhbmdlcygpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYmctWyMzRjQzRUVdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -9,7 +9,8 @@ import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/cdk/overlay";
11
11
  /**
12
- * Opens the Step Details Drawer (Edit In Depth) from the right.
12
+ * Opens the Step Details Drawer (Edit In Depth) as a right-side drawer overlay.
13
+ * Matches the behavior of Element popup - opens as a right-side drawer panel.
13
14
  */
14
15
  export class StepDetailsDrawerService {
15
16
  constructor(overlay, injector) {
@@ -17,10 +18,15 @@ export class StepDetailsDrawerService {
17
18
  this.injector = injector;
18
19
  this.currentRef = null;
19
20
  }
21
+ /**
22
+ * Opens the Step Details Drawer as a right-side drawer overlay.
23
+ * @param data Step details drawer data
24
+ */
20
25
  open(data) {
21
26
  if (this.currentRef)
22
27
  return this.currentRef;
23
28
  const drawerWidth = 480;
29
+ // Always use right-side drawer positioning (same as Element popup)
24
30
  const positionStrategy = this.overlay
25
31
  .position()
26
32
  .global()
@@ -64,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
64
70
  type: Injectable,
65
71
  args: [{ providedIn: 'root' }]
66
72
  }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7R0FFRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkMsWUFBNkIsT0FBZ0IsRUFBbUIsUUFBa0I7UUFBckQsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRjFFLGVBQVUsR0FBeUQsSUFBSSxDQUFDO0lBRUssQ0FBQztJQUV0RixJQUFJLENBQUMsSUFBMkI7UUFDOUIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUU1QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTzthQUNsQyxRQUFRLEVBQUU7YUFDVixNQUFNLEVBQUU7YUFDUixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxLQUFLLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQyxJQUFJLGFBQWEsQ0FBQztZQUNoQixXQUFXLEVBQUUsSUFBSTtZQUNqQixhQUFhLEVBQUUsa0NBQWtDO1lBQ2pELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRCxnQkFBZ0I7WUFDaEIsVUFBVSxFQUFFLENBQUMsK0JBQStCLEVBQUUsYUFBYSxDQUFDO1lBQzVELEtBQUssRUFBRSxHQUFHLFdBQVcsSUFBSTtZQUN6QixRQUFRLEVBQUUsT0FBTztZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDckIsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pELEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDdEQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywwQkFBMEIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixVQUFVO2FBQ1AsYUFBYSxFQUFFO2FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7O3FIQW5EVSx3QkFBd0I7eUhBQXhCLHdCQUF3QixjQURYLE1BQU07MkZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGVzdENhc2VTdGVwQ29uZmlnIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0IHtcbiAgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnIHwgJ3NhdmVBc1RlbXBsYXRlJyB8ICdjYW5jZWwnO1xuICBzdGVwPzogVGVzdENhc2VTdGVwQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKSBmcm9tIHRoZSByaWdodC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdGVwRGV0YWlsc0RyYXdlclNlcnZpY2Uge1xuICBwcml2YXRlIGN1cnJlbnRSZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSwgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgb3BlbihkYXRhOiBTdGVwRGV0YWlsc0RyYXdlckRhdGEpOiBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZWYpIHJldHVybiB0aGlzLmN1cnJlbnRSZWY7XG5cbiAgICBjb25zdCBkcmF3ZXJXaWR0aCA9IDQ4MDtcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmdsb2JhbCgpXG4gICAgICAucmlnaHQoJzAnKVxuICAgICAgLnRvcCgnMCcpXG4gICAgICAuYm90dG9tKCcwJylcbiAgICAgIC53aWR0aChgJHtkcmF3ZXJXaWR0aH1weGApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgcGFuZWxDbGFzczogWydjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1wYW5lbCcsICdjcWEtdWktcm9vdCddLFxuICAgICAgICB3aWR0aDogYCR7ZHJhd2VyV2lkdGh9cHhgLFxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkcmF3ZXJSZWYgPSBuZXcgU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+KG92ZXJsYXlSZWYpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCB1c2VWYWx1ZTogZHJhd2VyUmVmIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCB1c2VWYWx1ZTogZGF0YSB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQsIHVuZGVmaW5lZCwgaW5qZWN0b3IpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICB0aGlzLmN1cnJlbnRSZWYgPSBkcmF3ZXJSZWY7XG4gICAgZHJhd2VyUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5jdXJyZW50UmVmID0gbnVsbDsgfSk7XG4gICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuICAgIG92ZXJsYXlSZWZcbiAgICAgIC5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuXG4gICAgcmV0dXJuIGRyYXdlclJlZjtcbiAgfVxufVxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLFlBQTZCLE9BQWdCLEVBQW1CLFFBQWtCO1FBQXJELFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBbUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUYxRSxlQUFVLEdBQXlELElBQUksQ0FBQztJQUVLLENBQUM7SUFFdEY7OztPQUdHO0lBQ0gsSUFBSSxDQUNGLElBQTJCO1FBRTNCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBRXhCLG1FQUFtRTtRQUNuRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ2xDLFFBQVEsRUFBRTthQUNWLE1BQU0sRUFBRTthQUNSLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLEtBQUssQ0FBQyxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3BDLElBQUksYUFBYSxDQUFDO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxrQ0FBa0M7WUFDakQsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ3JELGdCQUFnQjtZQUNoQixVQUFVLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxhQUFhLENBQUM7WUFDNUQsS0FBSyxFQUFFLEdBQUcsV0FBVyxJQUFJO1lBQ3pCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixDQUEwQixVQUFVLENBQUMsQ0FBQztRQUNoRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixTQUFTLEVBQUU7Z0JBQ1QsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtnQkFDekQsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTthQUN0RDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLDBCQUEwQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRixVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLFVBQVU7YUFDUCxhQUFhLEVBQUU7YUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQzthQUN6RSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs7cUhBM0RVLHdCQUF3Qjt5SEFBeEIsd0JBQXdCLGNBRFgsTUFBTTsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUZXN0Q2FzZVN0ZXBDb25maWcgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyUmVmIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLXJlZic7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCBTdGVwRGV0YWlsc0RyYXdlckRhdGEgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItZGF0YSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcERldGFpbHNEcmF3ZXJSZXN1bHQge1xuICBhY3Rpb246ICdzYXZlQ2hhbmdlcycgfCAnc2F2ZUFzVGVtcGxhdGUnIHwgJ2NhbmNlbCc7XG4gIHN0ZXA/OiBUZXN0Q2FzZVN0ZXBDb25maWc7XG59XG5cbi8qKlxuICogT3BlbnMgdGhlIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpIGFzIGEgcmlnaHQtc2lkZSBkcmF3ZXIgb3ZlcmxheS5cbiAqIE1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIEVsZW1lbnQgcG9wdXAgLSBvcGVucyBhcyBhIHJpZ2h0LXNpZGUgZHJhd2VyIHBhbmVsLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyU2VydmljZSB7XG4gIHByaXZhdGUgY3VycmVudFJlZjogU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICAvKipcbiAgICogT3BlbnMgdGhlIFN0ZXAgRGV0YWlscyBEcmF3ZXIgYXMgYSByaWdodC1zaWRlIGRyYXdlciBvdmVybGF5LlxuICAgKiBAcGFyYW0gZGF0YSBTdGVwIGRldGFpbHMgZHJhd2VyIGRhdGFcbiAgICovXG4gIG9wZW4oXG4gICAgZGF0YTogU3RlcERldGFpbHNEcmF3ZXJEYXRhXG4gICk6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFJlZikgcmV0dXJuIHRoaXMuY3VycmVudFJlZjtcblxuICAgIGNvbnN0IGRyYXdlcldpZHRoID0gNDgwO1xuXG4gICAgLy8gQWx3YXlzIHVzZSByaWdodC1zaWRlIGRyYXdlciBwb3NpdGlvbmluZyAoc2FtZSBhcyBFbGVtZW50IHBvcHVwKVxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZ2xvYmFsKClcbiAgICAgIC5yaWdodCgnMCcpXG4gICAgICAudG9wKCcwJylcbiAgICAgIC5ib3R0b20oJzAnKVxuICAgICAgLndpZHRoKGAke2RyYXdlcldpZHRofXB4YCk7XG5cbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICBwYW5lbENsYXNzOiBbJ2NxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXBhbmVsJywgJ2NxYS11aS1yb290J10sXG4gICAgICAgIHdpZHRoOiBgJHtkcmF3ZXJXaWR0aH1weGAsXG4gICAgICAgIG1heFdpZHRoOiAnMTAwdncnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGRyYXdlclJlZiA9IG5ldyBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ob3ZlcmxheVJlZik7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYsIHVzZVZhbHVlOiBkcmF3ZXJSZWYgfSxcbiAgICAgICAgeyBwcm92aWRlOiBTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEsIHVzZVZhbHVlOiBkYXRhIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChTdGVwRGV0YWlsc0RyYXdlckNvbXBvbmVudCwgdW5kZWZpbmVkLCBpbmplY3Rvcik7XG4gICAgb3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcblxuICAgIHRoaXMuY3VycmVudFJlZiA9IGRyYXdlclJlZjtcbiAgICBkcmF3ZXJSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLmN1cnJlbnRSZWYgPSBudWxsOyB9KTtcbiAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gZHJhd2VyUmVmLmNsb3NlKHsgYWN0aW9uOiAnY2FuY2VsJyB9KSk7XG4gICAgb3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUoZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiBlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZHJhd2VyUmVmLmNsb3NlKHsgYWN0aW9uOiAnY2FuY2VsJyB9KSk7XG5cbiAgICByZXR1cm4gZHJhd2VyUmVmO1xuICB9XG59XG4iXX0=