@cqa-lib/cqa-ui 1.1.184 → 1.1.185

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.
@@ -1,29 +1,109 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Validators } from '@angular/forms';
2
+ import { FormControl, Validators } from '@angular/forms';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/forms";
5
5
  import * as i2 from "../../dynamic-select/dynamic-select-field.component";
6
6
  import * as i3 from "../../custom-textarea/custom-textarea.component";
7
7
  import * as i4 from "../../custom-input/custom-input.component";
8
- import * as i5 from "../../button/button.component";
8
+ import * as i5 from "@angular/material/slide-toggle";
9
+ import * as i6 from "../../button/button.component";
10
+ import * as i7 from "@angular/common";
9
11
  export class StepBuilderCustomCodeComponent {
10
12
  constructor(fb) {
11
13
  this.fb = fb;
12
14
  /** Options for language dropdown */
13
15
  this.languageOptions = [];
16
+ /** Template to get variables from */
17
+ this.template = null;
18
+ /** Function to handle variable processing or custom logic. Can be passed from parent component. */
19
+ this.setTemplateVariables = () => { return []; };
14
20
  /** Emit when step is created */
15
21
  this.createStep = new EventEmitter();
16
22
  /** Emit when cancelled */
17
23
  this.cancelled = new EventEmitter();
24
+ this.templateVariables = [];
18
25
  this.customCodeForm = this.fb.group({
19
26
  language: ['', Validators.required],
20
27
  code: ['', Validators.required],
21
28
  metadata: [''],
22
29
  description: ['']
23
30
  });
31
+ this.variablesForm = this.fb.group({});
24
32
  }
25
33
  ngOnInit() {
26
- // Component initialization
34
+ // Initialize template variables if template is provided
35
+ if (this.template) {
36
+ this.loadTemplateVariables();
37
+ }
38
+ }
39
+ ngOnChanges(changes) {
40
+ if (changes['template'] && this.template) {
41
+ this.loadTemplateVariables();
42
+ }
43
+ }
44
+ loadTemplateVariables() {
45
+ if (this.template && this.setTemplateVariables) {
46
+ this.templateVariables = this.setTemplateVariables(this.template);
47
+ this.buildVariablesForm();
48
+ }
49
+ }
50
+ buildVariablesForm() {
51
+ // Clear existing form controls
52
+ Object.keys(this.variablesForm.controls).forEach(key => {
53
+ this.variablesForm.removeControl(key);
54
+ });
55
+ // Add form controls for each variable
56
+ this.templateVariables.forEach(variable => {
57
+ // Handle boolean variables - use boolean value, others use string
58
+ const defaultValue = variable.type === 'boolean'
59
+ ? (variable.value === true || variable.value === 'true' || variable.value === 1)
60
+ : (variable.value || '');
61
+ this.variablesForm.addControl(variable.name, new FormControl(defaultValue));
62
+ });
63
+ }
64
+ getSelectConfig(variable) {
65
+ const options = (variable.options || []).map((opt) => ({
66
+ id: opt,
67
+ value: opt,
68
+ name: opt,
69
+ label: opt
70
+ }));
71
+ return {
72
+ key: variable.name,
73
+ placeholder: `Select ${variable.label}`,
74
+ multiple: false,
75
+ searchable: false,
76
+ options: options,
77
+ onChange: (value) => {
78
+ this.onVariableValueChange(variable.name, value);
79
+ }
80
+ };
81
+ }
82
+ onVariableValueChange(variableName, value) {
83
+ // Update the variable in templateVariables array
84
+ const variable = this.templateVariables.find(v => v.name === variableName);
85
+ if (variable) {
86
+ variable.value = value;
87
+ }
88
+ // Also update form control
89
+ if (this.variablesForm.get(variableName)) {
90
+ this.variablesForm.get(variableName)?.setValue(value);
91
+ }
92
+ }
93
+ onVariableBooleanChange(variableName, value) {
94
+ // Update the variable in templateVariables array
95
+ const variable = this.templateVariables.find(v => v.name === variableName);
96
+ if (variable) {
97
+ variable.value = value;
98
+ }
99
+ // Also update form control
100
+ if (this.variablesForm.get(variableName)) {
101
+ this.variablesForm.get(variableName)?.setValue(value);
102
+ }
103
+ else {
104
+ // Create form control if it doesn't exist
105
+ this.variablesForm.addControl(variableName, new FormControl(value));
106
+ }
27
107
  }
28
108
  getLanguageConfig() {
29
109
  return {
@@ -44,22 +124,27 @@ export class StepBuilderCustomCodeComponent {
44
124
  language: formValue.language || '',
45
125
  code: formValue.code || '',
46
126
  metadata: formValue.metadata || '',
47
- description: formValue.description || ''
127
+ description: formValue.description || '',
128
+ templateVariables: this.templateVariables.length > 0 ? this.templateVariables : undefined
48
129
  };
49
130
  this.createStep.emit(stepData);
50
131
  }
51
132
  }
52
133
  }
53
134
  StepBuilderCustomCodeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderCustomCodeComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
54
- StepBuilderCustomCodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderCustomCodeComponent, selector: "cqa-step-builder-custom-code", inputs: { languageOptions: "languageOptions" }, outputs: { createStep: "createStep", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Custom Code Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-max-h-[500px] cqa-overflow-y-auto\">\n <!-- Language Dropdown -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Language\n </label>\n <cqa-dynamic-select class=\"cqa-w-full\" [form]=\"customCodeForm\" [config]=\"getLanguageConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Code Textarea -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1 cqa-block\">\n Code\n </label>\n <cqa-custom-textarea\n class=\"cqa-step-builder-custom-code-textarea\"\n [placeholder]=\"'// Write your code here...'\"\n [value]=\"customCodeForm.get('code')?.value\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n (valueChange)=\"customCodeForm.get('code')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <div class=\"cqa-flex cqa-flex-wrap cqa-custom-form-fields\">\n <!-- Metadata Input -->\n <div class=\"cqa-mb-2 cqa-w-1/2 cqa-pr-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('metadata')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('metadata')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description Input -->\n <div class=\"cqa-w-1/2 cqa-pl-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i3.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle", "customClass"], outputs: ["valueChange", "blurred", "focused"] }, { type: i4.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: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }] });
135
+ StepBuilderCustomCodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderCustomCodeComponent, selector: "cqa-step-builder-custom-code", inputs: { languageOptions: "languageOptions", template: "template", setTemplateVariables: "setTemplateVariables" }, outputs: { createStep: "createStep", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Custom Code Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-max-h-[500px] cqa-overflow-y-auto\">\n \n\n <!-- Language Dropdown -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Language\n </label>\n <cqa-dynamic-select class=\"cqa-w-full\" [form]=\"customCodeForm\" [config]=\"getLanguageConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Code Textarea -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1 cqa-block\">\n Code\n </label>\n <cqa-custom-textarea\n class=\"cqa-step-builder-custom-code-textarea\"\n [placeholder]=\"'// Write your code here...'\"\n [value]=\"customCodeForm.get('code')?.value\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n (valueChange)=\"customCodeForm.get('code')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <div class=\"cqa-flex cqa-flex-wrap cqa-custom-form-fields\">\n <!-- Metadata Input -->\n <div class=\"cqa-mb-2 cqa-w-1/2 cqa-pr-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('metadata')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('metadata')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description Input -->\n <div class=\"cqa-w-1/2 cqa-pl-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Template Variables Section -->\n <div *ngIf=\"templateVariables && templateVariables.length > 0\" class=\"cqa-mb-4\">\n <!-- Template Variables Form Fields -->\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-mb-4\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type' || variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i3.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle", "customClass"], outputs: ["valueChange", "blurred", "focused"] }, { type: i4.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: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
55
136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderCustomCodeComponent, decorators: [{
56
137
  type: Component,
57
- args: [{ selector: 'cqa-step-builder-custom-code', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Custom Code Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-max-h-[500px] cqa-overflow-y-auto\">\n <!-- Language Dropdown -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Language\n </label>\n <cqa-dynamic-select class=\"cqa-w-full\" [form]=\"customCodeForm\" [config]=\"getLanguageConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Code Textarea -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1 cqa-block\">\n Code\n </label>\n <cqa-custom-textarea\n class=\"cqa-step-builder-custom-code-textarea\"\n [placeholder]=\"'// Write your code here...'\"\n [value]=\"customCodeForm.get('code')?.value\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n (valueChange)=\"customCodeForm.get('code')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <div class=\"cqa-flex cqa-flex-wrap cqa-custom-form-fields\">\n <!-- Metadata Input -->\n <div class=\"cqa-mb-2 cqa-w-1/2 cqa-pr-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('metadata')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('metadata')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description Input -->\n <div class=\"cqa-w-1/2 cqa-pl-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
138
+ args: [{ selector: 'cqa-step-builder-custom-code', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Custom Code Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-max-h-[500px] cqa-overflow-y-auto\">\n \n\n <!-- Language Dropdown -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Language\n </label>\n <cqa-dynamic-select class=\"cqa-w-full\" [form]=\"customCodeForm\" [config]=\"getLanguageConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Code Textarea -->\n <div class=\"cqa-mb-3\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1 cqa-block\">\n Code\n </label>\n <cqa-custom-textarea\n class=\"cqa-step-builder-custom-code-textarea\"\n [placeholder]=\"'// Write your code here...'\"\n [value]=\"customCodeForm.get('code')?.value\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n (valueChange)=\"customCodeForm.get('code')?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <div class=\"cqa-flex cqa-flex-wrap cqa-custom-form-fields\">\n <!-- Metadata Input -->\n <div class=\"cqa-mb-2 cqa-w-1/2 cqa-pr-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('metadata')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('metadata')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description Input -->\n <div class=\"cqa-w-1/2 cqa-pl-2\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[12px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input\n [placeholder]=\"'Text Input'\"\n [value]=\"customCodeForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"customCodeForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Template Variables Section -->\n <div *ngIf=\"templateVariables && templateVariables.length > 0\" class=\"cqa-mb-4\">\n <!-- Template Variables Form Fields -->\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-mb-4\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type' || variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
58
139
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { languageOptions: [{
59
140
  type: Input
141
+ }], template: [{
142
+ type: Input
143
+ }], setTemplateVariables: [{
144
+ type: Input
60
145
  }], createStep: [{
61
146
  type: Output
62
147
  }], cancelled: [{
63
148
  type: Output
64
149
  }] } });
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1jdXN0b20tY29kZS9zdGVwLWJ1aWxkZXItY3VzdG9tLWNvZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlL3N0ZXAtYnVpbGRlci1jdXN0b20tY29kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFnQnBFLE1BQU0sT0FBTyw4QkFBOEI7SUFZekMsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFYbkMsb0NBQW9DO1FBQzNCLG9CQUFlLEdBQW1CLEVBQUUsQ0FBQztRQUU5QyxnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRTlELDBCQUEwQjtRQUNoQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUs3QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ25DLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNkLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLDJCQUEyQjtJQUM3QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTztZQUNMLEdBQUcsRUFBRSxVQUFVO1lBQ2YsV0FBVyxFQUFFLEtBQUs7WUFDbEIsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDNUMsTUFBTSxRQUFRLEdBQXVCO2dCQUNuQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsSUFBSSxFQUFFO2dCQUNsQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUMxQixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsSUFBSSxFQUFFO2dCQUNsQyxXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVcsSUFBSSxFQUFFO2FBQ3pDLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7OzJIQWxEVSw4QkFBOEI7K0dBQTlCLDhCQUE4Qiw0TkNqQjNDLHMyRkF1RUE7MkZEdERhLDhCQUE4QjtrQkFOMUMsU0FBUzsrQkFDRSw4QkFBOEIsUUFHbEMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO2tHQUlyQixlQUFlO3NCQUF2QixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ29kZUZvcm1EYXRhIHtcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgY29kZTogc3RyaW5nO1xuICBtZXRhZGF0YT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItY3VzdG9tLWNvZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyQ3VzdG9tQ29kZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKiBPcHRpb25zIGZvciBsYW5ndWFnZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBsYW5ndWFnZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG5cbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUNvZGVGb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGN1c3RvbUNvZGVGb3JtOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLmN1c3RvbUNvZGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsYW5ndWFnZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGNvZGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBtZXRhZGF0YTogWycnXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDb21wb25lbnQgaW5pdGlhbGl6YXRpb25cbiAgfVxuXG4gIGdldExhbmd1YWdlQ29uZmlnKCk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogJ2xhbmd1YWdlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnLi4uJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5sYW5ndWFnZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DcmVhdGVTdGVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1c3RvbUNvZGVGb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmN1c3RvbUNvZGVGb3JtLnZhbHVlO1xuICAgICAgY29uc3Qgc3RlcERhdGE6IEN1c3RvbUNvZGVGb3JtRGF0YSA9IHtcbiAgICAgICAgbGFuZ3VhZ2U6IGZvcm1WYWx1ZS5sYW5ndWFnZSB8fCAnJyxcbiAgICAgICAgY29kZTogZm9ybVZhbHVlLmNvZGUgfHwgJycsXG4gICAgICAgIG1ldGFkYXRhOiBmb3JtVmFsdWUubWV0YWRhdGEgfHwgJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWUuZGVzY3JpcHRpb24gfHwgJydcbiAgICAgIH07XG4gICAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yXCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi00XCI+XG4gICAgQ3VzdG9tIENvZGUgU3RlcFxuICA8L2gyPlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtbWF4LWgtWzUwMHB4XSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBMYW5ndWFnZSBEcm9wZG93biAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtYmxvY2sgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLW1iLTFcIj5cbiAgICAgICAgTGFuZ3VhZ2VcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IGNsYXNzPVwiY3FhLXctZnVsbFwiIFtmb3JtXT1cImN1c3RvbUNvZGVGb3JtXCIgW2NvbmZpZ109XCJnZXRMYW5ndWFnZUNvbmZpZygpXCI+XG4gICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ29kZSBUZXh0YXJlYSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS1tYi0xIGNxYS1ibG9ja1wiPlxuICAgICAgICBDb2RlXG4gICAgICA8L2xhYmVsPlxuICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgICAgY2xhc3M9XCJjcWEtc3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlLXRleHRhcmVhXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvLyBXcml0ZSB5b3VyIGNvZGUgaGVyZS4uLidcIlxuICAgICAgICBbdmFsdWVdPVwiY3VzdG9tQ29kZUZvcm0uZ2V0KCdjb2RlJyk/LnZhbHVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjdXN0b21Db2RlRm9ybS5nZXQoJ2NvZGUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWN1c3RvbS1mb3JtLWZpZWxkc1wiPlxuICAgICAgPCEtLSBNZXRhZGF0YSBJbnB1dCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItMiBjcWEtdy0xLzIgY3FhLXByLTJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWxlYWRpbmctWzEwMCVdIGNxYS1ibG9jayBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtbWItMVwiPlxuICAgICAgICAgIE1ldGFkYXRhXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImN1c3RvbUNvZGVGb3JtLmdldCgnbWV0YWRhdGEnKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImN1c3RvbUNvZGVGb3JtLmdldCgnbWV0YWRhdGEnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiBJbnB1dCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXBsLTJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWxlYWRpbmctWzEwMCVdIGNxYS1ibG9jayBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtbWItMVwiPlxuICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImN1c3RvbUNvZGVGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImN1c3RvbUNvZGVGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC1hdXRvIGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXJvdW5kZWQtWzEwcHhdXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLWJvcmRlci1zb2xpZCBjcWEtcm91bmRlZC1bOXB4XSBjcWEtdy0xLzIgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjM0Y0M0VFXVwiIHZhcmlhbnQ9XCJmaWxsZWRcIiB0ZXh0PVwiQ3JlYXRlIFN0ZXBcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1jdXN0b20tY29kZS9zdGVwLWJ1aWxkZXItY3VzdG9tLWNvZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlL3N0ZXAtYnVpbGRlci1jdXN0b20tY29kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQTBCLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBa0JqRixNQUFNLE9BQU8sOEJBQThCO0lBb0J6QyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQW5CbkMsb0NBQW9DO1FBQzNCLG9CQUFlLEdBQW1CLEVBQUUsQ0FBQztRQUU5QyxxQ0FBcUM7UUFDNUIsYUFBUSxHQUEwQixJQUFJLENBQUM7UUFFaEQsbUdBQW1HO1FBQzFGLHlCQUFvQixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUV2RixnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRTlELDBCQUEwQjtRQUNoQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUcvQyxzQkFBaUIsR0FBVSxFQUFFLENBQUM7UUFJNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxD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T0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO1lBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQzVDLE1BQU0sUUFBUSxHQUF1QjtnQkFDbkMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRTtnQkFDbEMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDMUIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRTtnQkFDbEMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDeEMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUMxRixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDOzsySEEzSVUsOEJBQThCOytHQUE5Qiw4QkFBOEIscVRDbkIzQywrcktBc0hBOzJGRG5HYSw4QkFBOEI7a0JBTjFDLFNBQVM7K0JBQ0UsOEJBQThCLFFBR2xDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtrR0FJckIsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21Db2RlRm9ybURhdGEge1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBjb2RlOiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGVtcGxhdGVWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1jdXN0b20tY29kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItY3VzdG9tLWNvZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJDdXN0b21Db2RlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogT3B0aW9ucyBmb3IgbGFuZ3VhZ2UgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgbGFuZ3VhZ2VPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBUZW1wbGF0ZSB0byBnZXQgdmFyaWFibGVzIGZyb20gKi9cbiAgQElucHV0KCkgdGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIHZhcmlhYmxlIHByb2Nlc3Npbmcgb3IgY3VzdG9tIGxvZ2ljLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0VGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIFxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29kZUZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY3VzdG9tQ29kZUZvcm06IEZvcm1Hcm91cDtcbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMuY3VzdG9tQ29kZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGxhbmd1YWdlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29kZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG1ldGFkYXRhOiBbJyddLFxuICAgICAgZGVzY3JpcHRpb246IFsnJ11cbiAgICB9KTtcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWxpemUgdGVtcGxhdGUgdmFyaWFibGVzIGlmIHRlbXBsYXRlIGlzIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMubG9hZFRlbXBsYXRlVmFyaWFibGVzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZSddICYmIHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMubG9hZFRlbXBsYXRlVmFyaWFibGVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVGVtcGxhdGVWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUgJiYgdGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXModGhpcy50ZW1wbGF0ZSk7XG4gICAgICB0aGlzLmJ1aWxkVmFyaWFibGVzRm9ybSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZm9ybSBjb250cm9scyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgb25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sXG4gICAgaWYgKHRoaXMudmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGVOYW1lKSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sXG4gICAgaWYgKHRoaXMudmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGVOYW1lKSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBmb3JtIGNvbnRyb2wgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGVOYW1lLCBuZXcgRm9ybUNvbnRyb2wodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBnZXRMYW5ndWFnZUNvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdsYW5ndWFnZScsXG4gICAgICBwbGFjZWhvbGRlcjogJy4uLicsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubGFuZ3VhZ2VPcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXN0b21Db2RlRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jdXN0b21Db2RlRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBDdXN0b21Db2RlRm9ybURhdGEgPSB7XG4gICAgICAgIGxhbmd1YWdlOiBmb3JtVmFsdWUubGFuZ3VhZ2UgfHwgJycsXG4gICAgICAgIGNvZGU6IGZvcm1WYWx1ZS5jb2RlIHx8ICcnLFxuICAgICAgICBtZXRhZGF0YTogZm9ybVZhbHVlLm1ldGFkYXRhIHx8ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwID8gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW1iLTRcIj5cbiAgICBDdXN0b20gQ29kZSBTdGVwXG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xIGNxYS1tYXgtaC1bNTAwcHhdIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgIFxuXG4gICAgPCEtLSBMYW5ndWFnZSBEcm9wZG93biAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtYmxvY2sgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLW1iLTFcIj5cbiAgICAgICAgTGFuZ3VhZ2VcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IGNsYXNzPVwiY3FhLXctZnVsbFwiIFtmb3JtXT1cImN1c3RvbUNvZGVGb3JtXCIgW2NvbmZpZ109XCJnZXRMYW5ndWFnZUNvbmZpZygpXCI+XG4gICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ29kZSBUZXh0YXJlYSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS1tYi0xIGNxYS1ibG9ja1wiPlxuICAgICAgICBDb2RlXG4gICAgICA8L2xhYmVsPlxuICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgICAgY2xhc3M9XCJjcWEtc3RlcC1idWlsZGVyLWN1c3RvbS1jb2RlLXRleHRhcmVhXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvLyBXcml0ZSB5b3VyIGNvZGUgaGVyZS4uLidcIlxuICAgICAgICBbdmFsdWVdPVwiY3VzdG9tQ29kZUZvcm0uZ2V0KCdjb2RlJyk/LnZhbHVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjdXN0b21Db2RlRm9ybS5nZXQoJ2NvZGUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWN1c3RvbS1mb3JtLWZpZWxkc1wiPlxuICAgICAgPCEtLSBNZXRhZGF0YSBJbnB1dCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItMiBjcWEtdy0xLzIgY3FhLXByLTJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWxlYWRpbmctWzEwMCVdIGNxYS1ibG9jayBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtbWItMVwiPlxuICAgICAgICAgIE1ldGFkYXRhXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImN1c3RvbUNvZGVGb3JtLmdldCgnbWV0YWRhdGEnKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImN1c3RvbUNvZGVGb3JtLmdldCgnbWV0YWRhdGEnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiBJbnB1dCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXBsLTJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWxlYWRpbmctWzEwMCVdIGNxYS1ibG9jayBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtbWItMVwiPlxuICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImN1c3RvbUNvZGVGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImN1c3RvbUNvZGVGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBTZWN0aW9uIC0tPlxuICAgICA8ZGl2ICpuZ0lmPVwidGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIEZvcm0gRmllbGRzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXAgY3FhLW1iLTRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXNcIj5cbiAgICAgICAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIE5vbi1ib29sZWFuLCBub24tY3VzdG9tX2NvZGUgdmFyaWFibGVzIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnICYmIHZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyk7IGVsc2UgZGVmYXVsdElucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwidmFyaWFibGVzRm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1yb3VuZGVkLVsxMHB4XVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJDYW5jZWxcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiBjbGFzcz1cImNxYS1ib3JkZXItc29saWQgY3FhLXJvdW5kZWQtWzlweF0gY3FhLXctMS8yIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzNGNDNFRV1cIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
@@ -0,0 +1,114 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { isNormalStepConfig, } from '../test-case-step.models';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "../../custom-input/custom-input.component";
7
+ import * as i3 from "../../button/button.component";
8
+ import * as i4 from "@angular/common";
9
+ /**
10
+ * Create Step Group panel/modal for Test Case Details.
11
+ * Follows the same structure and validation pattern as Test Data Modal and Loop Step.
12
+ * Displays selected steps and allows naming the new group; emits createGroup with group name
13
+ * so the host can create the step group and replace selected steps with it.
14
+ */
15
+ export class CreateStepGroupComponent {
16
+ constructor(fb) {
17
+ this.fb = fb;
18
+ this.stepsToGroup = [];
19
+ this.createGroup = new EventEmitter();
20
+ this.cancelled = new EventEmitter();
21
+ this.form = this.fb.group({
22
+ groupName: ['', [Validators.required, Validators.minLength(1)]],
23
+ });
24
+ }
25
+ get stepsCount() {
26
+ return this.stepsToGroup?.length ?? 0;
27
+ }
28
+ get subtitleText() {
29
+ const n = this.stepsCount;
30
+ return n === 1
31
+ ? 'Group 1 selected step into a container'
32
+ : `Group ${n} selected steps into a container`;
33
+ }
34
+ /** Display label for a step in the "Steps to group" list (same pattern as normal-step display). */
35
+ getStepDisplayLabel(step, index) {
36
+ if (isNormalStepConfig(step)) {
37
+ return this.getNormalStepLabel(step);
38
+ }
39
+ if ('groupName' in step && step.groupName) {
40
+ return step.groupName;
41
+ }
42
+ if ('condition' in step && step.condition) {
43
+ return step.condition;
44
+ }
45
+ if ('loopType' in step) {
46
+ const loop = step;
47
+ if (loop.loopType === 'for' && loop.testDataProfile) {
48
+ return `For loop: ${loop.testDataProfile}`;
49
+ }
50
+ if (loop.loopType === 'while' && loop.condition) {
51
+ return `While: ${loop.condition}`;
52
+ }
53
+ }
54
+ if (step.description) {
55
+ return step.description;
56
+ }
57
+ return `Step ${index + 1}`;
58
+ }
59
+ getNormalStepLabel(step) {
60
+ const params = step.parameters ?? [];
61
+ const getParam = (name) => params.find((p) => p.name?.toLowerCase() === name.toLowerCase());
62
+ const val = (p) => p?.displayValue ?? p?.value ?? '';
63
+ switch (step.eventType) {
64
+ case 'navigate': {
65
+ const url = getParam('url');
66
+ return url ? `Navigate to ${val(url)}` : 'Navigate';
67
+ }
68
+ case 'ai-agent': {
69
+ const instructions = getParam('instructions') ?? getParam('description');
70
+ return val(instructions) || 'AI Agent step';
71
+ }
72
+ case 'type':
73
+ return val(getParam('text')) || 'Type';
74
+ case 'click':
75
+ return val(getParam('selector')) ? `Click ${val(getParam('selector'))}` : 'Click';
76
+ case 'verify':
77
+ return val(getParam('description')) || 'Verify';
78
+ case 'custom': {
79
+ const desc = getParam('description') ?? getParam('action');
80
+ return val(desc) || 'Custom step';
81
+ }
82
+ default:
83
+ return val(getParam('description')) || val(params[0]) || 'Step';
84
+ }
85
+ }
86
+ onCancel() {
87
+ this.cancelled.emit();
88
+ }
89
+ onCreateGroup() {
90
+ if (this.form.invalid || this.stepsCount === 0) {
91
+ this.form.markAllAsTouched();
92
+ return;
93
+ }
94
+ const groupName = (this.form.get('groupName')?.value ?? '').trim();
95
+ if (!groupName) {
96
+ this.form.get('groupName')?.setErrors({ required: true });
97
+ return;
98
+ }
99
+ this.createGroup.emit({ groupName });
100
+ }
101
+ }
102
+ CreateStepGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CreateStepGroupComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
103
+ CreateStepGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CreateStepGroupComponent, selector: "cqa-create-step-group", inputs: { stepsToGroup: "stepsToGroup" }, outputs: { createGroup: "createGroup", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-full cqa-max-w-[500px] cqa-flex cqa-flex-col cqa-gap-4 cqa-p-6 cqa-box-border cqa-min-h-0\">\n <!-- Header: title + close (X) -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0\">\n Create step group\n </h2>\n <p class=\"cqa-text-[14px] cqa-leading-[20px] cqa-text-[#64748B] cqa-m-0\">\n {{ subtitleText }}\n </p>\n </div>\n <button\n type=\"button\"\n (click)=\"onCancel()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-7 cqa-min-w-7 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0 cqa-flex-shrink-0\"\n title=\"Close\"\n aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Group name * -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#161617]\">\n Group name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"e.g., Authentication flow\"\n [value]=\"form.get('groupName')?.value\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"form.get('groupName')?.setValue($event); form.get('groupName')?.updateValueAndValidity()\">\n </cqa-custom-input>\n <p *ngIf=\"form.get('groupName')?.invalid && form.get('groupName')?.touched\" class=\"cqa-text-xs cqa-text-red-500 cqa-m-0\">\n Group name is required.\n </p>\n </div>\n\n <!-- Steps to group (N) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[100%] cqa-tracking-normal cqa-text-[#0A0A0A] cqa-align-middle\">\n Steps to group ({{ stepsCount }})\n </label>\n <div class=\"cqa-scrollbar-hide cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[200px] cqa-overflow-y-auto cqa-rounded-[8px] cqa-p-[6px] cqa-border cqa-border-solid cqa-border-[rgba(0,0,0,0.1)]\">\n <div\n *ngFor=\"let step of stepsToGroup; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-rounded-[4px] cqa-py-[4px] cqa-px-[8px] cqa-bg-[rgba(216,217,252,0.3)]\">\n <!-- Numbered badge -->\n <span\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded-full cqa-bg-[#3F43EE] cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex-shrink-0\">\n {{ i + 1 }}\n </span>\n <span class=\"cqa-font-medium cqa-text-[10px] cqa-leading-[15px] cqa-tracking-[0px] cqa-text-[#0B0B0C] cqa-flex-1 cqa-min-w-0 cqa-truncate\">\n {{ getStepDisplayLabel(step, i) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Actions: Cancel | Create group -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create group\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateGroup()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i2.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: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CreateStepGroupComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'cqa-create-step-group', host: { class: 'cqa-ui-root' }, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-full cqa-max-w-[500px] cqa-flex cqa-flex-col cqa-gap-4 cqa-p-6 cqa-box-border cqa-min-h-0\">\n <!-- Header: title + close (X) -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0\">\n Create step group\n </h2>\n <p class=\"cqa-text-[14px] cqa-leading-[20px] cqa-text-[#64748B] cqa-m-0\">\n {{ subtitleText }}\n </p>\n </div>\n <button\n type=\"button\"\n (click)=\"onCancel()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-7 cqa-min-w-7 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0 cqa-flex-shrink-0\"\n title=\"Close\"\n aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Group name * -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#161617]\">\n Group name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"e.g., Authentication flow\"\n [value]=\"form.get('groupName')?.value\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"form.get('groupName')?.setValue($event); form.get('groupName')?.updateValueAndValidity()\">\n </cqa-custom-input>\n <p *ngIf=\"form.get('groupName')?.invalid && form.get('groupName')?.touched\" class=\"cqa-text-xs cqa-text-red-500 cqa-m-0\">\n Group name is required.\n </p>\n </div>\n\n <!-- Steps to group (N) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[100%] cqa-tracking-normal cqa-text-[#0A0A0A] cqa-align-middle\">\n Steps to group ({{ stepsCount }})\n </label>\n <div class=\"cqa-scrollbar-hide cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[200px] cqa-overflow-y-auto cqa-rounded-[8px] cqa-p-[6px] cqa-border cqa-border-solid cqa-border-[rgba(0,0,0,0.1)]\">\n <div\n *ngFor=\"let step of stepsToGroup; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-rounded-[4px] cqa-py-[4px] cqa-px-[8px] cqa-bg-[rgba(216,217,252,0.3)]\">\n <!-- Numbered badge -->\n <span\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded-full cqa-bg-[#3F43EE] cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex-shrink-0\">\n {{ i + 1 }}\n </span>\n <span class=\"cqa-font-medium cqa-text-[10px] cqa-leading-[15px] cqa-tracking-[0px] cqa-text-[#0B0B0C] cqa-flex-1 cqa-min-w-0 cqa-truncate\">\n {{ getStepDisplayLabel(step, i) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Actions: Cancel | Create group -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create group\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateGroup()\">\n </cqa-button>\n </div>\n </div>\n</div>\n" }]
107
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { stepsToGroup: [{
108
+ type: Input
109
+ }], createGroup: [{
110
+ type: Output
111
+ }], cancelled: [{
112
+ type: Output
113
+ }] } });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXN0ZXAtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9jcmVhdGUtc3RlcC1ncm91cC9jcmVhdGUtc3RlcC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2NyZWF0ZS1zdGVwLWdyb3VwL2NyZWF0ZS1zdGVwLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBSUwsa0JBQWtCLEdBQ25CLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQU1sQzs7Ozs7R0FLRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFRbkMsWUFBNkIsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFQbkMsaUJBQVksR0FBeUIsRUFBRSxDQUFDO1FBRXZDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFDMUQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QixTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVE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QUNFLHVCQUF1QixRQUUzQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7a0dBR3JCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZVN0ZXBDb25maWcsXG4gIE5vcm1hbFN0ZXBDb25maWcsXG4gIFRlc3RDYXNlRXZlbnRUeXBlLFxuICBpc05vcm1hbFN0ZXBDb25maWcsXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RlcEdyb3VwRm9ybURhdGEge1xuICBncm91cE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGUgU3RlcCBHcm91cCBwYW5lbC9tb2RhbCBmb3IgVGVzdCBDYXNlIERldGFpbHMuXG4gKiBGb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhbmQgdmFsaWRhdGlvbiBwYXR0ZXJuIGFzIFRlc3QgRGF0YSBNb2RhbCBhbmQgTG9vcCBTdGVwLlxuICogRGlzcGxheXMgc2VsZWN0ZWQgc3RlcHMgYW5kIGFsbG93cyBuYW1pbmcgdGhlIG5ldyBncm91cDsgZW1pdHMgY3JlYXRlR3JvdXAgd2l0aCBncm91cCBuYW1lXG4gKiBzbyB0aGUgaG9zdCBjYW4gY3JlYXRlIHRoZSBzdGVwIGdyb3VwIGFuZCByZXBsYWNlIHNlbGVjdGVkIHN0ZXBzIHdpdGggaXQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1jcmVhdGUtc3RlcC1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtc3RlcC1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlU3RlcEdyb3VwQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc3RlcHNUb0dyb3VwOiBUZXN0Q2FzZVN0ZXBDb25maWdbXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSBjcmVhdGVHcm91cCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3JlYXRlU3RlcEdyb3VwRm9ybURhdGE+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybTogRm9ybUdyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cE5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEpXV0sXG4gICAgfSk7XG4gIH1cblxuICBnZXQgc3RlcHNDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0ZXBzVG9Hcm91cD8ubGVuZ3RoID8/IDA7XG4gIH1cblxuICBnZXQgc3VidGl0bGVUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgbiA9IHRoaXMuc3RlcHNDb3VudDtcbiAgICByZXR1cm4gbiA9PT0gMVxuICAgICAgPyAnR3JvdXAgMSBzZWxlY3RlZCBzdGVwIGludG8gYSBjb250YWluZXInXG4gICAgICA6IGBHcm91cCAke259IHNlbGVjdGVkIHN0ZXBzIGludG8gYSBjb250YWluZXJgO1xuICB9XG5cbiAgLyoqIERpc3BsYXkgbGFiZWwgZm9yIGEgc3RlcCBpbiB0aGUgXCJTdGVwcyB0byBncm91cFwiIGxpc3QgKHNhbWUgcGF0dGVybiBhcyBub3JtYWwtc3RlcCBkaXNwbGF5KS4gKi9cbiAgZ2V0U3RlcERpc3BsYXlMYWJlbChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpc05vcm1hbFN0ZXBDb25maWcoc3RlcCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5vcm1hbFN0ZXBMYWJlbChzdGVwKTtcbiAgICB9XG4gICAgaWYgKCdncm91cE5hbWUnIGluIHN0ZXAgJiYgc3RlcC5ncm91cE5hbWUpIHtcbiAgICAgIHJldHVybiBzdGVwLmdyb3VwTmFtZTtcbiAgICB9XG4gICAgaWYgKCdjb25kaXRpb24nIGluIHN0ZXAgJiYgc3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBzdGVwLmNvbmRpdGlvbjtcbiAgICB9XG4gICAgaWYgKCdsb29wVHlwZScgaW4gc3RlcCkge1xuICAgICAgY29uc3QgbG9vcCA9IHN0ZXAgYXMgeyBsb29wVHlwZTogc3RyaW5nOyB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7IGNvbmRpdGlvbj86IHN0cmluZyB9O1xuICAgICAgaWYgKGxvb3AubG9vcFR5cGUgPT09ICdmb3InICYmIGxvb3AudGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgIHJldHVybiBgRm9yIGxvb3A6ICR7bG9vcC50ZXN0RGF0YVByb2ZpbGV9YDtcbiAgICAgIH1cbiAgICAgIGlmIChsb29wLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIGxvb3AuY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiBgV2hpbGU6ICR7bG9vcC5jb25kaXRpb259YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0ZXAuZGVzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiBzdGVwLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gYFN0ZXAgJHtpbmRleCArIDF9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Tm9ybWFsU3RlcExhYmVsKHN0ZXA6IE5vcm1hbFN0ZXBDb25maWcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IHN0ZXAucGFyYW1ldGVycyA/PyBbXTtcbiAgICBjb25zdCBnZXRQYXJhbSA9IChuYW1lOiBzdHJpbmcpID0+XG4gICAgICBwYXJhbXMuZmluZCgocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IHZhbCA9IChwOiB7IHZhbHVlPzogc3RyaW5nOyBkaXNwbGF5VmFsdWU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCkgPT5cbiAgICAgIHA/LmRpc3BsYXlWYWx1ZSA/PyBwPy52YWx1ZSA/PyAnJztcblxuICAgIHN3aXRjaCAoc3RlcC5ldmVudFR5cGUgYXMgVGVzdENhc2VFdmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ25hdmlnYXRlJzoge1xuICAgICAgICBjb25zdCB1cmwgPSBnZXRQYXJhbSgndXJsJyk7XG4gICAgICAgIHJldHVybiB1cmwgPyBgTmF2aWdhdGUgdG8gJHt2YWwodXJsKX1gIDogJ05hdmlnYXRlJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FpLWFnZW50Jzoge1xuICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBnZXRQYXJhbSgnaW5zdHJ1Y3Rpb25zJykgPz8gZ2V0UGFyYW0oJ2Rlc2NyaXB0aW9uJyk7XG4gICAgICAgIHJldHVybiB2YWwoaW5zdHJ1Y3Rpb25zKSB8fCAnQUkgQWdlbnQgc3RlcCc7XG4gICAgICB9XG4gICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgcmV0dXJuIHZhbChnZXRQYXJhbSgndGV4dCcpKSB8fCAnVHlwZSc7XG4gICAgICBjYXNlICdjbGljayc6XG4gICAgICAgIHJldHVybiB2YWwoZ2V0UGFyYW0oJ3NlbGVjdG9yJykpID8gYENsaWNrICR7dmFsKGdldFBhcmFtKCdzZWxlY3RvcicpKX1gIDogJ0NsaWNrJztcbiAgICAgIGNhc2UgJ3ZlcmlmeSc6XG4gICAgICAgIHJldHVybiB2YWwoZ2V0UGFyYW0oJ2Rlc2NyaXB0aW9uJykpIHx8ICdWZXJpZnknO1xuICAgICAgY2FzZSAnY3VzdG9tJzoge1xuICAgICAgICBjb25zdCBkZXNjID0gZ2V0UGFyYW0oJ2Rlc2NyaXB0aW9uJykgPz8gZ2V0UGFyYW0oJ2FjdGlvbicpO1xuICAgICAgICByZXR1cm4gdmFsKGRlc2MpIHx8ICdDdXN0b20gc3RlcCc7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsKGdldFBhcmFtKCdkZXNjcmlwdGlvbicpKSB8fCB2YWwocGFyYW1zWzBdKSB8fCAnU3RlcCc7XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DcmVhdGVHcm91cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQgfHwgdGhpcy5zdGVwc0NvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBncm91cE5hbWUgPSAodGhpcy5mb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCFncm91cE5hbWUpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5zZXRFcnJvcnMoeyByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVHcm91cC5lbWl0KHsgZ3JvdXBOYW1lIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLVsxMnB4XSBjcWEtc2hhZG93LWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXAtNiBjcWEtYm94LWJvcmRlciBjcWEtbWluLWgtMFwiPlxuICA8IS0tIEhlYWRlcjogdGl0bGUgKyBjbG9zZSAoWCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1ib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+XG4gICAgICAgIENyZWF0ZSBzdGVwIGdyb3VwXG4gICAgICA8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtbS0wXCI+XG4gICAgICAgIHt7IHN1YnRpdGxlVGV4dCB9fVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWluLWgtNyBjcWEtbWluLXctNyBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wIGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2bDEyIDEyXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIEdyb3VwIG5hbWUgKiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN11cIj5cbiAgICAgIEdyb3VwIG5hbWUgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIEF1dGhlbnRpY2F0aW9uIGZsb3dcIlxuICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KCdncm91cE5hbWUnKT8udmFsdWVcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgIHNpemU9XCJtZFwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5zZXRWYWx1ZSgkZXZlbnQpOyBmb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVwiPlxuICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICA8cCAqbmdJZj1cImZvcm0uZ2V0KCdncm91cE5hbWUnKT8uaW52YWxpZCAmJiBmb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWRcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LXJlZC01MDAgY3FhLW0tMFwiPlxuICAgICAgR3JvdXAgbmFtZSBpcyByZXF1aXJlZC5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcHMgdG8gZ3JvdXAgKE4pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWFsaWduLW1pZGRsZVwiPlxuICAgICAgU3RlcHMgdG8gZ3JvdXAgKHt7IHN0ZXBzQ291bnQgfX0pXG4gICAgPC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXNjcm9sbGJhci1oaWRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1heC1oLVsyMDBweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcm91bmRlZC1bOHB4XSBjcWEtcC1bNnB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bcmdiYSgwLDAsMCwwLjEpXVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwc1RvR3JvdXA7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1weS1bNHB4XSBjcWEtcHgtWzhweF0gY3FhLWJnLVtyZ2JhKDIxNiwyMTcsMjUyLDAuMyldXCI+XG4gICAgICAgIDwhLS0gTnVtYmVyZWQgYmFkZ2UgLS0+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy03IGNxYS1oLTcgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyMzRjQzRUVdIGNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAge3sgaSArIDEgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS10cmFja2luZy1bMHB4XSBjcWEtdGV4dC1bIzBCMEIwQ10gY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICB7eyBnZXRTdGVwRGlzcGxheUxhYmVsKHN0ZXAsIGkpIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEFjdGlvbnM6IENhbmNlbCB8IENyZWF0ZSBncm91cCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS13LWZ1bGwgY3FhLWdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgdGV4dD1cIkNyZWF0ZSBncm91cFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtYmctWyMzRjQzRUVdJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlR3JvdXAoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,104 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { isNormalStepConfig, } from '../test-case-step.models';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../button/button.component";
5
+ import * as i2 from "@angular/common";
6
+ /**
7
+ * Delete Steps confirmation modal for Test Case Details.
8
+ * Matches the design of Create Step Group: shows selected steps with context (e.g. "IF lane"),
9
+ * warning text, and Cancel / Delete actions. Steps are shown with red/danger styling.
10
+ */
11
+ export class DeleteStepsComponent {
12
+ constructor() {
13
+ /** Steps that will be deleted (shown in the list). */
14
+ this.stepsToDelete = [];
15
+ /** Context label for the sub-heading, e.g. "IF lane", "ELSE", "For loop". */
16
+ this.contextLabel = '';
17
+ this.confirmDelete = new EventEmitter();
18
+ this.cancelled = new EventEmitter();
19
+ }
20
+ get stepsCount() {
21
+ return this.stepsToDelete?.length ?? 0;
22
+ }
23
+ get titleText() {
24
+ const n = this.stepsCount;
25
+ return n === 1 ? 'Delete 1 step?' : `Delete ${n} steps?`;
26
+ }
27
+ get selectedStepsSubtitle() {
28
+ const ctx = this.contextLabel?.trim() || 'selected';
29
+ return `Selected steps for ${ctx} (${this.stepsCount})`;
30
+ }
31
+ /** Display label for a step in the list (same pattern as create-step-group). */
32
+ getStepDisplayLabel(step, index) {
33
+ if (isNormalStepConfig(step)) {
34
+ return this.getNormalStepLabel(step);
35
+ }
36
+ if ('groupName' in step && step.groupName) {
37
+ return step.groupName;
38
+ }
39
+ if ('condition' in step && step.condition) {
40
+ return step.condition;
41
+ }
42
+ if ('loopType' in step) {
43
+ const loop = step;
44
+ if (loop.loopType === 'for' && loop.testDataProfile) {
45
+ return `For loop: ${loop.testDataProfile}`;
46
+ }
47
+ if (loop.loopType === 'while' && loop.condition) {
48
+ return `While: ${loop.condition}`;
49
+ }
50
+ }
51
+ if (step.description) {
52
+ return step.description;
53
+ }
54
+ return `Step ${index + 1}`;
55
+ }
56
+ getNormalStepLabel(step) {
57
+ const params = step.parameters ?? [];
58
+ const getParam = (name) => params.find((p) => p.name?.toLowerCase() === name.toLowerCase());
59
+ const val = (p) => p?.displayValue ?? p?.value ?? '';
60
+ switch (step.eventType) {
61
+ case 'navigate': {
62
+ const url = getParam('url');
63
+ return url ? `Navigate to ${val(url)}` : 'Navigate to';
64
+ }
65
+ case 'ai-agent': {
66
+ const instructions = getParam('instructions') ?? getParam('description');
67
+ return val(instructions) || 'AI Agent step';
68
+ }
69
+ case 'type':
70
+ return val(getParam('text')) || 'Type';
71
+ case 'click':
72
+ return val(getParam('selector')) ? `Click ${val(getParam('selector'))}` : 'Click';
73
+ case 'verify':
74
+ return val(getParam('description')) || 'Verify';
75
+ case 'custom': {
76
+ const desc = getParam('description') ?? getParam('action');
77
+ return val(desc) || 'Custom step';
78
+ }
79
+ default:
80
+ return val(getParam('description')) || val(params[0]) || 'Step';
81
+ }
82
+ }
83
+ onCancel() {
84
+ this.cancelled.emit();
85
+ }
86
+ onDelete() {
87
+ this.confirmDelete.emit();
88
+ }
89
+ }
90
+ DeleteStepsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DeleteStepsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
+ DeleteStepsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DeleteStepsComponent, selector: "cqa-delete-steps", inputs: { stepsToDelete: "stepsToDelete", contextLabel: "contextLabel" }, outputs: { confirmDelete: "confirmDelete", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-full cqa-max-w-[500px] cqa-flex cqa-flex-col cqa-gap-4 cqa-p-6 cqa-box-border cqa-min-h-0\">\n <!-- Header: title + close (X) -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-font-medium cqa-text-[22px] cqa-leading-[28px] cqa-tracking-normal cqa-text-[#101828] cqa-m-0\">\n {{ titleText }}\n </h2>\n <p class=\"cqa-font-normal cqa-text-[14px] cqa-leading-[21px] cqa-tracking-[-0.15px] cqa-text-[#4A5565] cqa-m-0\">\n This action cannot be undone, but you can use the undo function in the toolbar.\n </p>\n </div>\n <button\n type=\"button\"\n (click)=\"onCancel()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-7 cqa-min-w-7 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0 cqa-flex-shrink-0\"\n title=\"Close\"\n aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Selected steps for [context] (N) \u2013 scroll when many steps, scrollbar hidden (same as create-step-group) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0\">\n <label class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[100%] cqa-tracking-normal cqa-text-[#0A0A0A] cqa-align-middle\">\n {{ selectedStepsSubtitle }}\n </label>\n <div class=\"cqa-scrollbar-hide cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[200px] cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-rounded-[8px] cqa-p-[6px] cqa-border cqa-border-solid cqa-border-[rgba(0,0,0,0.1)]\">\n <div\n *ngFor=\"let step of stepsToDelete; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-[8px] cqa-rounded-[4px] cqa-pt-[4px] cqa-pb-[4px] cqa-pl-[8px] cqa-pr-[8px] cqa-bg-[rgba(238,63,63,0.1)]\">\n <!-- Numbered badge (red) -->\n <span\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded-full cqa-bg-[#C63535] cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex-shrink-0\">\n {{ i + 1 }}\n </span>\n <span class=\"cqa-font-medium cqa-text-[10px] cqa-leading-[15px] cqa-tracking-[0px] cqa-text-[#DC2626] cqa-flex-1 cqa-min-w-0 cqa-truncate\">\n {{ getStepDisplayLabel(step, i) }}\n </span>\n </div>\n </div>\n </div> \n\n <!-- Actions: Cancel | Delete (right-aligned) -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-end cqa-w-full cqa-gap-3\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-white cqa-border cqa-border-solid cqa-border-[#414146] cqa-text-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Delete\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-rounded-[8px] cqa-border-0 cqa-bg-[#EE3F3F] cqa-text-white'\"\n (clicked)=\"onDelete()\">\n </cqa-button>\n </div>\n</div>\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DeleteStepsComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'cqa-delete-steps', host: { class: 'cqa-ui-root' }, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-full cqa-max-w-[500px] cqa-flex cqa-flex-col cqa-gap-4 cqa-p-6 cqa-box-border cqa-min-h-0\">\n <!-- Header: title + close (X) -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-font-medium cqa-text-[22px] cqa-leading-[28px] cqa-tracking-normal cqa-text-[#101828] cqa-m-0\">\n {{ titleText }}\n </h2>\n <p class=\"cqa-font-normal cqa-text-[14px] cqa-leading-[21px] cqa-tracking-[-0.15px] cqa-text-[#4A5565] cqa-m-0\">\n This action cannot be undone, but you can use the undo function in the toolbar.\n </p>\n </div>\n <button\n type=\"button\"\n (click)=\"onCancel()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-7 cqa-min-w-7 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0 cqa-flex-shrink-0\"\n title=\"Close\"\n aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Selected steps for [context] (N) \u2013 scroll when many steps, scrollbar hidden (same as create-step-group) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0\">\n <label class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[100%] cqa-tracking-normal cqa-text-[#0A0A0A] cqa-align-middle\">\n {{ selectedStepsSubtitle }}\n </label>\n <div class=\"cqa-scrollbar-hide cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[200px] cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-rounded-[8px] cqa-p-[6px] cqa-border cqa-border-solid cqa-border-[rgba(0,0,0,0.1)]\">\n <div\n *ngFor=\"let step of stepsToDelete; let i = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-[8px] cqa-rounded-[4px] cqa-pt-[4px] cqa-pb-[4px] cqa-pl-[8px] cqa-pr-[8px] cqa-bg-[rgba(238,63,63,0.1)]\">\n <!-- Numbered badge (red) -->\n <span\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded-full cqa-bg-[#C63535] cqa-text-white cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex-shrink-0\">\n {{ i + 1 }}\n </span>\n <span class=\"cqa-font-medium cqa-text-[10px] cqa-leading-[15px] cqa-tracking-[0px] cqa-text-[#DC2626] cqa-flex-1 cqa-min-w-0 cqa-truncate\">\n {{ getStepDisplayLabel(step, i) }}\n </span>\n </div>\n </div>\n </div> \n\n <!-- Actions: Cancel | Delete (right-aligned) -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-end cqa-w-full cqa-gap-3\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-white cqa-border cqa-border-solid cqa-border-[#414146] cqa-text-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Delete\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-rounded-[8px] cqa-border-0 cqa-bg-[#EE3F3F] cqa-text-white'\"\n (clicked)=\"onDelete()\">\n </cqa-button>\n </div>\n</div>\n" }]
95
+ }], propDecorators: { stepsToDelete: [{
96
+ type: Input
97
+ }], contextLabel: [{
98
+ type: Input
99
+ }], confirmDelete: [{
100
+ type: Output
101
+ }], cancelled: [{
102
+ type: Output
103
+ }] } });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXN0ZXBzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvZGVsZXRlLXN0ZXBzL2RlbGV0ZS1zdGVwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2RlbGV0ZS1zdGVwcy9kZWxldGUtc3RlcHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBSUwsa0JBQWtCLEdBQ25CLE1BQU0sMEJBQTBCLENBQUM7Ozs7QUFFbEM7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyxvQkFBb0I7SUFMakM7UUFNRSxzREFBc0Q7UUFDN0Msa0JBQWEsR0FBeUIsRUFBRSxDQUFDO1FBRWxELDZFQUE2RTtRQUNwRSxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUVqQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDekMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FnRmhEO0lBOUVDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFD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LFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQzthQUNuQztZQUNEO2dCQUNFLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7O2lIQXZGVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixnUENsQmpDLG8xR0ErREE7MkZEN0NhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0IsUUFFdEIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFOzhCQUlyQixhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlU3RlcENvbmZpZyxcbiAgTm9ybWFsU3RlcENvbmZpZyxcbiAgVGVzdENhc2VFdmVudFR5cGUsXG4gIGlzTm9ybWFsU3RlcENvbmZpZyxcbn0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcblxuLyoqXG4gKiBEZWxldGUgU3RlcHMgY29uZmlybWF0aW9uIG1vZGFsIGZvciBUZXN0IENhc2UgRGV0YWlscy5cbiAqIE1hdGNoZXMgdGhlIGRlc2lnbiBvZiBDcmVhdGUgU3RlcCBHcm91cDogc2hvd3Mgc2VsZWN0ZWQgc3RlcHMgd2l0aCBjb250ZXh0IChlLmcuIFwiSUYgbGFuZVwiKSxcbiAqIHdhcm5pbmcgdGV4dCwgYW5kIENhbmNlbCAvIERlbGV0ZSBhY3Rpb25zLiBTdGVwcyBhcmUgc2hvd24gd2l0aCByZWQvZGFuZ2VyIHN0eWxpbmcuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1kZWxldGUtc3RlcHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVsZXRlLXN0ZXBzLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBEZWxldGVTdGVwc0NvbXBvbmVudCB7XG4gIC8qKiBTdGVwcyB0aGF0IHdpbGwgYmUgZGVsZXRlZCAoc2hvd24gaW4gdGhlIGxpc3QpLiAqL1xuICBASW5wdXQoKSBzdGVwc1RvRGVsZXRlOiBUZXN0Q2FzZVN0ZXBDb25maWdbXSA9IFtdO1xuXG4gIC8qKiBDb250ZXh0IGxhYmVsIGZvciB0aGUgc3ViLWhlYWRpbmcsIGUuZy4gXCJJRiBsYW5lXCIsIFwiRUxTRVwiLCBcIkZvciBsb29wXCIuICovXG4gIEBJbnB1dCgpIGNvbnRleHRMYWJlbCA9ICcnO1xuXG4gIEBPdXRwdXQoKSBjb25maXJtRGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGdldCBzdGVwc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHNUb0RlbGV0ZT8ubGVuZ3RoID8/IDA7XG4gIH1cblxuICBnZXQgdGl0bGVUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgbiA9IHRoaXMuc3RlcHNDb3VudDtcbiAgICByZXR1cm4gbiA9PT0gMSA/ICdEZWxldGUgMSBzdGVwPycgOiBgRGVsZXRlICR7bn0gc3RlcHM/YDtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFN0ZXBzU3VidGl0bGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmNvbnRleHRMYWJlbD8udHJpbSgpIHx8ICdzZWxlY3RlZCc7XG4gICAgcmV0dXJuIGBTZWxlY3RlZCBzdGVwcyBmb3IgJHtjdHh9ICgke3RoaXMuc3RlcHNDb3VudH0pYDtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciBhIHN0ZXAgaW4gdGhlIGxpc3QgKHNhbWUgcGF0dGVybiBhcyBjcmVhdGUtc3RlcC1ncm91cCkuICovXG4gIGdldFN0ZXBEaXNwbGF5TGFiZWwoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaXNOb3JtYWxTdGVwQ29uZmlnKHN0ZXApKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROb3JtYWxTdGVwTGFiZWwoc3RlcCk7XG4gICAgfVxuICAgIGlmICgnZ3JvdXBOYW1lJyBpbiBzdGVwICYmIHN0ZXAuZ3JvdXBOYW1lKSB7XG4gICAgICByZXR1cm4gc3RlcC5ncm91cE5hbWU7XG4gICAgfVxuICAgIGlmICgnY29uZGl0aW9uJyBpbiBzdGVwICYmIHN0ZXAuY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gc3RlcC5jb25kaXRpb247XG4gICAgfVxuICAgIGlmICgnbG9vcFR5cGUnIGluIHN0ZXApIHtcbiAgICAgIGNvbnN0IGxvb3AgPSBzdGVwIGFzIHsgbG9vcFR5cGU6IHN0cmluZzsgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyBjb25kaXRpb24/OiBzdHJpbmcgfTtcbiAgICAgIGlmIChsb29wLmxvb3BUeXBlID09PSAnZm9yJyAmJiBsb29wLnRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICByZXR1cm4gYEZvciBsb29wOiAke2xvb3AudGVzdERhdGFQcm9maWxlfWA7XG4gICAgICB9XG4gICAgICBpZiAobG9vcC5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBsb29wLmNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gYFdoaWxlOiAke2xvb3AuY29uZGl0aW9ufWA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGVwLmRlc2NyaXB0aW9uKSB7XG4gICAgICByZXR1cm4gc3RlcC5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGBTdGVwICR7aW5kZXggKyAxfWA7XG4gIH1cblxuICBwcml2YXRlIGdldE5vcm1hbFN0ZXBMYWJlbChzdGVwOiBOb3JtYWxTdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSBzdGVwLnBhcmFtZXRlcnMgPz8gW107XG4gICAgY29uc3QgZ2V0UGFyYW0gPSAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgcGFyYW1zLmZpbmQoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCB2YWwgPSAocDogeyB2YWx1ZT86IHN0cmluZzsgZGlzcGxheVZhbHVlPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpID0+XG4gICAgICBwPy5kaXNwbGF5VmFsdWUgPz8gcD8udmFsdWUgPz8gJyc7XG5cbiAgICBzd2l0Y2ggKHN0ZXAuZXZlbnRUeXBlIGFzIFRlc3RDYXNlRXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICduYXZpZ2F0ZSc6IHtcbiAgICAgICAgY29uc3QgdXJsID0gZ2V0UGFyYW0oJ3VybCcpO1xuICAgICAgICByZXR1cm4gdXJsID8gYE5hdmlnYXRlIHRvICR7dmFsKHVybCl9YCA6ICdOYXZpZ2F0ZSB0byc7XG4gICAgICB9XG4gICAgICBjYXNlICdhaS1hZ2VudCc6IHtcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZ2V0UGFyYW0oJ2luc3RydWN0aW9ucycpID8/IGdldFBhcmFtKCdkZXNjcmlwdGlvbicpO1xuICAgICAgICByZXR1cm4gdmFsKGluc3RydWN0aW9ucykgfHwgJ0FJIEFnZW50IHN0ZXAnO1xuICAgICAgfVxuICAgICAgY2FzZSAndHlwZSc6XG4gICAgICAgIHJldHVybiB2YWwoZ2V0UGFyYW0oJ3RleHQnKSkgfHwgJ1R5cGUnO1xuICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICByZXR1cm4gdmFsKGdldFBhcmFtKCdzZWxlY3RvcicpKSA/IGBDbGljayAke3ZhbChnZXRQYXJhbSgnc2VsZWN0b3InKSl9YCA6ICdDbGljayc7XG4gICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICByZXR1cm4gdmFsKGdldFBhcmFtKCdkZXNjcmlwdGlvbicpKSB8fCAnVmVyaWZ5JztcbiAgICAgIGNhc2UgJ2N1c3RvbSc6IHtcbiAgICAgICAgY29uc3QgZGVzYyA9IGdldFBhcmFtKCdkZXNjcmlwdGlvbicpID8/IGdldFBhcmFtKCdhY3Rpb24nKTtcbiAgICAgICAgcmV0dXJuIHZhbChkZXNjKSB8fCAnQ3VzdG9tIHN0ZXAnO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbChnZXRQYXJhbSgnZGVzY3JpcHRpb24nKSkgfHwgdmFsKHBhcmFtc1swXSkgfHwgJ1N0ZXAnO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybURlbGV0ZS5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtWzEycHhdIGNxYS1zaGFkb3ctbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS13LWZ1bGwgY3FhLW1heC13LVs1MDBweF0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtcC02IGNxYS1ib3gtYm9yZGVyIGNxYS1taW4taC0wXCI+XG4gIDwhLS0gSGVhZGVyOiB0aXRsZSArIGNsb3NlIChYKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWzIycHhdIGNxYS1sZWFkaW5nLVsyOHB4XSBjcWEtdHJhY2tpbmctbm9ybWFsIGNxYS10ZXh0LVsjMTAxODI4XSBjcWEtbS0wXCI+XG4gICAgICAgIHt7IHRpdGxlVGV4dCB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMjFweF0gY3FhLXRyYWNraW5nLVstMC4xNXB4XSBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW0tMFwiPlxuICAgICAgICBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLCBidXQgeW91IGNhbiB1c2UgdGhlIHVuZG8gZnVuY3Rpb24gaW4gdGhlIHRvb2xiYXIuXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwib25DYW5jZWwoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC03IGNxYS1taW4tdy03IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZsMTIgMTJcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VsZWN0ZWQgc3RlcHMgZm9yIFtjb250ZXh0XSAoTikg4oCTIHNjcm9sbCB3aGVuIG1hbnkgc3RlcHMsIHNjcm9sbGJhciBoaWRkZW4gKHNhbWUgYXMgY3JlYXRlLXN0ZXAtZ3JvdXApIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbWluLWgtMFwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWFsaWduLW1pZGRsZVwiPlxuICAgICAge3sgc2VsZWN0ZWRTdGVwc1N1YnRpdGxlIH19XG4gICAgPC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXNjcm9sbGJhci1oaWRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1heC1oLVsyMDBweF0gY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXAtWzZweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItW3JnYmEoMCwwLDAsMC4xKV1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHNUb0RlbGV0ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVs4cHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1wdC1bNHB4XSBjcWEtcGItWzRweF0gY3FhLXBsLVs4cHhdIGNxYS1wci1bOHB4XSBjcWEtYmctW3JnYmEoMjM4LDYzLDYzLDAuMSldXCI+XG4gICAgICAgIDwhLS0gTnVtYmVyZWQgYmFkZ2UgKHJlZCkgLS0+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy03IGNxYS1oLTcgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNDNjM1MzVdIGNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAge3sgaSArIDEgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS10cmFja2luZy1bMHB4XSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICB7eyBnZXRTdGVwRGlzcGxheUxhYmVsKHN0ZXAsIGkpIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj4gIFxuXG4gIDwhLS0gQWN0aW9uczogQ2FuY2VsIHwgRGVsZXRlIChyaWdodC1hbGlnbmVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktZW5kIGNxYS13LWZ1bGwgY3FhLWdhcC0zXCI+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICBidG5TaXplPVwibGdcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjNDE0MTQ2XSBjcWEtdGV4dC1bIzQxNDE0Nl0nXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgIHRleHQ9XCJEZWxldGVcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS1ib3JkZXItMCBjcWEtYmctWyNFRTNGM0ZdIGNxYS10ZXh0LXdoaXRlJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkRlbGV0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19