@cqa-lib/cqa-ui 1.1.191 → 1.1.193
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/autocomplete/autocomplete.component.mjs +156 -0
- package/esm2020/lib/autocomplete/autocomplete.model.mjs +2 -0
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +610 -11
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +505 -17
- package/esm2020/lib/test-case-details/delete-steps/delete-steps.component.mjs +32 -11
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +131 -9
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-data.mjs +67 -1
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.mjs +66 -1
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +112 -191
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +31 -3
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +128 -6
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +2153 -582
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +2038 -451
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/autocomplete/autocomplete.component.d.ts +48 -0
- package/lib/autocomplete/autocomplete.model.d.ts +10 -0
- package/lib/test-case-details/api-edit-step/api-edit-step.component.d.ts +96 -8
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +73 -4
- package/lib/test-case-details/delete-steps/delete-steps.component.d.ts +18 -2
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +34 -4
- package/lib/test-case-details/step-details-drawer/step-details-drawer-data.d.ts +56 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.d.ts +6 -0
- package/lib/test-case-details/step-details-drawer/step-details-drawer.component.d.ts +33 -27
- package/lib/test-case-details/step-group/step-group.component.d.ts +15 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +31 -5
- package/lib/ui-kit.module.d.ts +127 -126
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/styles.css +1 -1
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
|
|
2
|
-
import { getStepDetailsStepType, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, ADVANCED_TOGGLE_KEYS, ADVANCED_SUBFIELDS_BY_TYPE, } from './step-details-drawer-field.config';
|
|
3
2
|
import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
|
|
4
3
|
import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
|
|
5
|
-
import { isNormalStepConfig, isApiStepConfig, isAiAgentStepConfig, } from '../test-case-step.models';
|
|
6
4
|
import * as i0 from "@angular/core";
|
|
7
5
|
import * as i1 from "@angular/forms";
|
|
8
6
|
import * as i2 from "@angular/material/icon";
|
|
9
|
-
import * as i3 from "../../custom-
|
|
10
|
-
import * as i4 from "../../
|
|
11
|
-
import * as i5 from "../../custom-
|
|
12
|
-
import * as i6 from "../../
|
|
7
|
+
import * as i3 from "../../custom-input/custom-input.component";
|
|
8
|
+
import * as i4 from "../../custom-textarea/custom-textarea.component";
|
|
9
|
+
import * as i5 from "../../custom-toggle/custom-toggle.component";
|
|
10
|
+
import * as i6 from "../../dynamic-select/dynamic-select-field.component";
|
|
13
11
|
import * as i7 from "../../button/button.component";
|
|
14
12
|
import * as i8 from "@angular/common";
|
|
15
13
|
import * as i9 from "./step-details-drawer-ref";
|
|
16
14
|
/**
|
|
17
15
|
* Step Details Drawer (Edit In Depth).
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Renders only from the provided DynamicFieldConfig[]; no filtering or step-type-based field logic.
|
|
17
|
+
* Each step instance receives its own complete field configuration. Generic key-based step read/write.
|
|
20
18
|
*/
|
|
21
19
|
export class StepDetailsDrawerComponent {
|
|
22
20
|
constructor(ref, fb, cdr, data) {
|
|
@@ -26,165 +24,113 @@ export class StepDetailsDrawerComponent {
|
|
|
26
24
|
this.saveChanges = new EventEmitter();
|
|
27
25
|
this.cancel = new EventEmitter();
|
|
28
26
|
this.saveAsTemplate = new EventEmitter();
|
|
29
|
-
/** Optional: when provided (e.g. from Storybook Controls), use instead of STEP_DETAILS_DRAWER_DATA. */
|
|
30
27
|
this.stepData = null;
|
|
31
28
|
this.stepNumberInput = null;
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
this.
|
|
29
|
+
/** When provided (e.g. Storybook), use instead of STEP_DETAILS_DRAWER_DATA.dynamicFields. */
|
|
30
|
+
this.dynamicFieldsInput = null;
|
|
31
|
+
/** When provided, use as drawer header title (overrides data.title). */
|
|
32
|
+
this.drawerTitle = null;
|
|
33
|
+
this.dynamicFields = [];
|
|
34
|
+
this.drawerTitleValue = 'Step Details';
|
|
36
35
|
this.advancedExpanded = false;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.selectConfigMap = this.buildSelectConfigMap();
|
|
36
|
+
/** Cached select configs per field key (stable refs for change detection). */
|
|
37
|
+
this.selectConfigCache = {};
|
|
40
38
|
this.step = data?.step ?? {};
|
|
41
39
|
this.stepNumber = data?.stepNumber ?? 1;
|
|
40
|
+
this.dynamicFields = data?.dynamicFields ?? [];
|
|
41
|
+
this.drawerTitleValue = data?.title ?? 'Step Details';
|
|
42
42
|
this.form = this.fb.group({});
|
|
43
|
-
this.
|
|
43
|
+
this.buildFormFromDynamicFields();
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
46
|
-
get
|
|
47
|
-
return this.
|
|
45
|
+
/** All fields from the provided array (same reference; used for single source of truth in template). */
|
|
46
|
+
get allFields() {
|
|
47
|
+
return this.dynamicFields;
|
|
48
|
+
}
|
|
49
|
+
/** Fields in main section (section === 'main' or undefined). */
|
|
50
|
+
get mainFields() {
|
|
51
|
+
return this.dynamicFields.filter((f) => (f.section ?? 'main') === 'main');
|
|
52
|
+
}
|
|
53
|
+
/** Fields in constraints section. */
|
|
54
|
+
get constraintsFields() {
|
|
55
|
+
return this.dynamicFields.filter((f) => f.section === 'constraints');
|
|
56
|
+
}
|
|
57
|
+
/** Fields in advanced section (inside expandable block). */
|
|
58
|
+
get advancedFields() {
|
|
59
|
+
return this.dynamicFields.filter((f) => f.section === 'advanced');
|
|
60
|
+
}
|
|
61
|
+
/** True when the field at index is the first in its section (for showing section headers). */
|
|
62
|
+
isFirstInSection(index, section) {
|
|
63
|
+
const f = this.dynamicFields[index];
|
|
64
|
+
if (!f)
|
|
65
|
+
return false;
|
|
66
|
+
const fSection = f.section ?? 'main';
|
|
67
|
+
if (fSection !== section)
|
|
68
|
+
return false;
|
|
69
|
+
if (index === 0)
|
|
70
|
+
return true;
|
|
71
|
+
const prev = this.dynamicFields[index - 1];
|
|
72
|
+
return (prev?.section ?? 'main') !== section;
|
|
73
|
+
}
|
|
74
|
+
/** True when the field at index is not in the advanced section (render in main flow). */
|
|
75
|
+
isNonAdvancedField(index) {
|
|
76
|
+
const f = this.dynamicFields[index];
|
|
77
|
+
return f != null && (f.section ?? 'main') !== 'advanced';
|
|
48
78
|
}
|
|
49
79
|
ngOnInit() {
|
|
50
|
-
if (this.stepData != null) {
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
80
|
+
if (this.stepData != null || this.dynamicFieldsInput != null || this.drawerTitle != null) {
|
|
81
|
+
if (this.stepData != null) {
|
|
82
|
+
this.step = this.stepData;
|
|
83
|
+
this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
|
|
84
|
+
}
|
|
85
|
+
if (this.dynamicFieldsInput != null) {
|
|
86
|
+
this.dynamicFields = this.dynamicFieldsInput;
|
|
87
|
+
}
|
|
88
|
+
if (this.drawerTitle != null && this.drawerTitle !== '') {
|
|
89
|
+
this.drawerTitleValue = this.drawerTitle;
|
|
90
|
+
}
|
|
91
|
+
this.buildFormFromDynamicFields();
|
|
54
92
|
this.cdr.markForCheck();
|
|
55
93
|
}
|
|
56
94
|
}
|
|
57
95
|
ngOnChanges(changes) {
|
|
58
|
-
if (changes['stepData'] || changes['stepNumberInput']) {
|
|
96
|
+
if (changes['stepData'] || changes['stepNumberInput'] || changes['dynamicFieldsInput'] || changes['drawerTitle']) {
|
|
59
97
|
if (this.stepData != null) {
|
|
60
98
|
this.step = this.stepData;
|
|
61
99
|
this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
|
|
62
100
|
}
|
|
63
|
-
this.
|
|
101
|
+
if (this.dynamicFieldsInput != null) {
|
|
102
|
+
this.dynamicFields = this.dynamicFieldsInput;
|
|
103
|
+
}
|
|
104
|
+
if (this.drawerTitle != null && this.drawerTitle !== '') {
|
|
105
|
+
this.drawerTitleValue = this.drawerTitle;
|
|
106
|
+
}
|
|
107
|
+
this.buildFormFromDynamicFields();
|
|
64
108
|
this.cdr.detectChanges();
|
|
65
109
|
}
|
|
66
110
|
}
|
|
67
|
-
|
|
68
|
-
this.stepType = getStepDetailsStepType(this.step);
|
|
69
|
-
this.visibleFields = this.stepType ? STEP_DETAILS_FIELDS_BY_TYPE[this.stepType] : [];
|
|
70
|
-
this.buildFormFromStep();
|
|
71
|
-
}
|
|
72
|
-
buildFormFromStep() {
|
|
111
|
+
buildFormFromDynamicFields() {
|
|
73
112
|
const group = {};
|
|
74
|
-
for (const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (!(key in group))
|
|
81
|
-
group[key] = [this.getStepValue(key)];
|
|
113
|
+
for (const field of this.dynamicFields) {
|
|
114
|
+
const raw = this.getStepValue(field.key);
|
|
115
|
+
const value = (raw === undefined || raw === '') && field.defaultValue !== undefined
|
|
116
|
+
? field.defaultValue
|
|
117
|
+
: raw;
|
|
118
|
+
group[field.key] = [value];
|
|
82
119
|
}
|
|
83
120
|
this.form = this.fb.group(group);
|
|
121
|
+
this.selectConfigCache = {};
|
|
84
122
|
}
|
|
123
|
+
/** Read value from step by key. No step-type logic; step is a generic key-value bag. */
|
|
85
124
|
getStepValue(key) {
|
|
86
125
|
const step = this.step;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
if (key === 'metadata') {
|
|
93
|
-
const params = this.step.parameters;
|
|
94
|
-
return params?.[1]?.value ?? '';
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (isApiStepConfig(this.step)) {
|
|
98
|
-
const api = this.step;
|
|
99
|
-
if (key === 'method')
|
|
100
|
-
return api.method ?? 'GET';
|
|
101
|
-
if (key === 'url')
|
|
102
|
-
return api.baseUrl ? `${api.baseUrl}${api.endpoint || ''}` : api.endpoint ?? '';
|
|
103
|
-
if (key === 'headers')
|
|
104
|
-
return api.headers ? JSON.stringify(api.headers, null, 2) : '';
|
|
105
|
-
if (key === 'body')
|
|
106
|
-
return api.requestBody ?? '';
|
|
107
|
-
if (key === 'saveOutputAsVariable')
|
|
108
|
-
return api.saveTo ?? '';
|
|
109
|
-
}
|
|
110
|
-
if (isAiAgentStepConfig(this.step)) {
|
|
111
|
-
const ai = this.step;
|
|
112
|
-
if (key === 'agentTask')
|
|
113
|
-
return ai.instructions ?? '';
|
|
114
|
-
if (key === 'description')
|
|
115
|
-
return ai.description ?? '';
|
|
116
|
-
if (key === 'metadata')
|
|
117
|
-
return step.metadata ?? '';
|
|
118
|
-
}
|
|
119
|
-
if (key === 'onlyUseAttachedContext' ||
|
|
120
|
-
key === 'takeScreenshotsWhenVerifying' ||
|
|
121
|
-
key === 'continueOnError' ||
|
|
122
|
-
key === 'disabled') {
|
|
123
|
-
return step[key] === true;
|
|
124
|
-
}
|
|
125
|
-
return step[key] ?? '';
|
|
126
|
+
const raw = step[key];
|
|
127
|
+
if (raw === undefined || raw === null)
|
|
128
|
+
return '';
|
|
129
|
+
return raw;
|
|
126
130
|
}
|
|
131
|
+
/** Write value to step by key. No step-type logic; step is a generic key-value bag. */
|
|
127
132
|
setStepValue(key, value) {
|
|
128
133
|
const step = this.step;
|
|
129
|
-
if (isNormalStepConfig(this.step) && this.step.eventType === 'custom') {
|
|
130
|
-
if (key === 'description') {
|
|
131
|
-
const params = this.step.parameters;
|
|
132
|
-
if (params?.[0])
|
|
133
|
-
params[0].value = String(value);
|
|
134
|
-
else
|
|
135
|
-
this.step.description = String(value);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
if (key === 'metadata') {
|
|
139
|
-
const params = this.step.parameters;
|
|
140
|
-
if (params?.[1])
|
|
141
|
-
params[1].value = String(value);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (isApiStepConfig(this.step)) {
|
|
146
|
-
const api = this.step;
|
|
147
|
-
if (key === 'method') {
|
|
148
|
-
api.method = value;
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
if (key === 'url') {
|
|
152
|
-
api.endpoint = String(value);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
if (key === 'headers') {
|
|
156
|
-
try {
|
|
157
|
-
api.headers = JSON.parse(String(value) || '{}');
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
api.headers = {};
|
|
161
|
-
}
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
if (key === 'body') {
|
|
165
|
-
api.requestBody = String(value);
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (key === 'saveOutputAsVariable') {
|
|
169
|
-
api.saveTo = String(value);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (isAiAgentStepConfig(this.step)) {
|
|
174
|
-
const ai = this.step;
|
|
175
|
-
if (key === 'agentTask') {
|
|
176
|
-
ai.instructions = String(value);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (key === 'description') {
|
|
180
|
-
ai.description = String(value);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
if (key === 'metadata') {
|
|
184
|
-
step.metadata = value;
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
134
|
step[key] = value;
|
|
189
135
|
}
|
|
190
136
|
onBack() {
|
|
@@ -210,65 +156,36 @@ export class StepDetailsDrawerComponent {
|
|
|
210
156
|
this.ref.close({ action: 'saveChanges', step: this.step });
|
|
211
157
|
}
|
|
212
158
|
applyFormToStep() {
|
|
213
|
-
for (const
|
|
214
|
-
if (key
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
this.setStepValue(key, this.form.get(key)?.value);
|
|
218
|
-
}
|
|
219
|
-
for (const key of ADVANCED_TOGGLE_KEYS) {
|
|
220
|
-
if (this.form.contains(key))
|
|
221
|
-
this.setStepValue(key, this.form.get(key)?.value);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
/** Build cached map of select configs from field meta (stable refs to prevent CD loops). */
|
|
225
|
-
buildSelectConfigMap() {
|
|
226
|
-
const map = {};
|
|
227
|
-
const keys = Object.keys(STEP_DETAILS_FIELD_META);
|
|
228
|
-
for (const key of keys) {
|
|
229
|
-
const meta = STEP_DETAILS_FIELD_META[key];
|
|
230
|
-
if (!meta || meta.controlType !== 'dropdown' || !meta.options?.length)
|
|
231
|
-
continue;
|
|
232
|
-
const options = meta.options.map((o) => ({ value: o.value, label: o.label }));
|
|
233
|
-
map[key] = {
|
|
234
|
-
key: meta.key,
|
|
235
|
-
placeholder: meta.placeholder ?? meta.label,
|
|
236
|
-
options,
|
|
237
|
-
};
|
|
159
|
+
for (const field of this.dynamicFields) {
|
|
160
|
+
if (this.form.contains(field.key)) {
|
|
161
|
+
this.setStepValue(field.key, this.form.get(field.key)?.value);
|
|
162
|
+
}
|
|
238
163
|
}
|
|
239
|
-
return map;
|
|
240
164
|
}
|
|
241
|
-
/**
|
|
242
|
-
getSelectConfig(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if (this.stepType === 'custom')
|
|
259
|
-
return 'Custom Step Details';
|
|
260
|
-
if (this.stepType === 'api')
|
|
261
|
-
return 'API Step Details';
|
|
262
|
-
if (this.stepType === 'aiAgent')
|
|
263
|
-
return 'AI Agent Step Details';
|
|
264
|
-
return 'Step Details';
|
|
165
|
+
/** Build select config for dropdown field (cached per key). */
|
|
166
|
+
getSelectConfig(field) {
|
|
167
|
+
if (field.type !== 'dropdown' || !field.options?.length)
|
|
168
|
+
return null;
|
|
169
|
+
if (this.selectConfigCache[field.key])
|
|
170
|
+
return this.selectConfigCache[field.key];
|
|
171
|
+
const options = field.options.map((o) => ({ value: o.value, label: o.label }));
|
|
172
|
+
this.selectConfigCache[field.key] = {
|
|
173
|
+
key: field.key,
|
|
174
|
+
placeholder: field.placeholder ?? field.label,
|
|
175
|
+
options,
|
|
176
|
+
};
|
|
177
|
+
return this.selectConfigCache[field.key];
|
|
178
|
+
}
|
|
179
|
+
/** Resolved header title for template: @Input drawerTitle > injected data.title > default. */
|
|
180
|
+
get displayTitle() {
|
|
181
|
+
return this.drawerTitleValue;
|
|
265
182
|
}
|
|
266
183
|
}
|
|
267
184
|
StepDetailsDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, deps: [{ token: STEP_DETAILS_DRAWER_REF }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: STEP_DETAILS_DRAWER_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
268
|
-
StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
185
|
+
StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput", dynamicFieldsInput: "dynamicFieldsInput", drawerTitle: "drawerTitle" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
269
186
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, decorators: [{
|
|
270
187
|
type: Component,
|
|
271
|
-
args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
|
|
188
|
+
args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
|
|
272
189
|
}], ctorParameters: function () { return [{ type: i9.StepDetailsDrawerRef, decorators: [{
|
|
273
190
|
type: Inject,
|
|
274
191
|
args: [STEP_DETAILS_DRAWER_REF]
|
|
@@ -287,5 +204,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
287
204
|
type: Input
|
|
288
205
|
}], stepNumberInput: [{
|
|
289
206
|
type: Input
|
|
207
|
+
}], dynamicFieldsInput: [{
|
|
208
|
+
type: Input
|
|
209
|
+
}], drawerTitle: [{
|
|
210
|
+
type: Input
|
|
290
211
|
}] } });
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxzQkFBc0IsRUFJdEIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUF3QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RixPQUFPLEVBS0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixtQkFBbUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7QUFNbEM7Ozs7R0FJRztBQU9ILE1BQU0sT0FBTywwQkFBMEI7SUEyQnJDLFlBQzJDLEdBQXlCLEVBQzFELEVBQWUsRUFDZixHQUFzQixFQUNnQixJQUE0QjtRQUhqQyxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQUMxRCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3QnRCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDckQsV0FBTSxHQUFH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QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEI1QyxNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBRzlCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsd0JBQXdCOzRDQTlCcEMsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZEtleSxcbiAgU3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZFNlY3Rpb24sXG4gIFNURVBfREVUQUlMU19GSUVMRFNfQllfVFlQRSxcbiAgU1RFUF9ERVRBSUxTX0ZJRUxEX01FVEEsXG4gIEFEVkFOQ0VEX1RPR0dMRV9LRVlTLFxuICBBRFZBTkNFRF9TVUJGSUVMRFNfQllfVFlQRSxcbn0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWZpZWxkLmNvbmZpZyc7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiwgU3RlcERldGFpbHNEcmF3ZXJSZWYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VTdGVwQ29uZmlnLFxuICBOb3JtYWxTdGVwQ29uZmlnLFxuICBBcGlTdGVwQ29uZmlnLFxuICBBaUFnZW50U3RlcENvbmZpZyxcbiAgaXNOb3JtYWxTdGVwQ29uZmlnLFxuICBpc0FwaVN0ZXBDb25maWcsXG4gIGlzQWlBZ2VudFN0ZXBDb25maWcsXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogU2luZ2xlIHJldXNhYmxlIGNvbXBvbmVudDsgZm9ybSBpcyBkeW5hbWljIGJ5IFN0ZXAgVHlwZSB2aWEgY29uZmlndXJhdGlvbi5cbiAqIE5vIFByaW9yaXR5IHNlY3Rpb24uIFVzZXMgQ1FBIGNvbXBvbmVudHMgb25seS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgc2F2ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVBc1RlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG5cbiAgLyoqIE9wdGlvbmFsOiB3aGVuIHByb3ZpZGVkIChlLmcuIGZyb20gU3Rvcnlib29rIENvbnRyb2xzKSwgdXNlIGluc3RlYWQgb2YgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLiAqL1xuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0ZXBUeXBlOiBTdGVwRGV0YWlsc1N0ZXBUeXBlIHwgbnVsbCA9IG51bGw7XG4gIHZpc2libGVGaWVsZHM6IFN0ZXBEZXRhaWxzRmllbGRLZXlbXSA9IFtdO1xuICBmaWVsZE1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQTtcbiAgYWR2YW5jZWRUb2dnbGVLZXlzID0gQURWQU5DRURfVE9HR0xFX0tFWVM7XG4gIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgYWdlbnRUYXNrRXhwYW5kZWQgPSB0cnVlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZmVyZW5jZXMgcGVyIGtleSkgdG8gYXZvaWQgaW5maW5pdGUgY2hhbmdlIGRldGVjdGlvbiBpbiB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0Q29uZmlnTWFwOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gdGhpcy5idWlsZFNlbGVjdENvbmZpZ01hcCgpO1xuXG4gIC8qKiBTdWJmaWVsZHMgdG8gc2hvdyBpbnNpZGUgQWR2YW5jZWQgc2VjdGlvbiBmb3IgY3VycmVudCBzdGVwIHR5cGUuICovXG4gIGdldCBhZHZhbmNlZFN1YmZpZWxkcygpOiBTdGVwRGV0YWlsc0ZpZWxkS2V5W10ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBUeXBlID8gQURWQU5DRURfU1VCRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYpIHByaXZhdGUgcmVmOiBTdGVwRGV0YWlsc0RyYXdlclJlZixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEpIGRhdGE/OiBTdGVwRGV0YWlsc0RyYXdlckRhdGFcbiAgKSB7XG4gICAgdGhpcy5zdGVwID0gZGF0YT8uc3RlcCA/PyAoe30gYXMgVGVzdENhc2VTdGVwQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBOdW1iZXIgPSBkYXRhPy5zdGVwTnVtYmVyID8/IDE7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5zeW5jU3RlcFR5cGVBbmRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGVwRGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVySW5wdXQgPz8gKHRoaXMuc3RlcERhdGEgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgICB0aGlzLnN5bmNTdGVwVHlwZUFuZEZvcm0oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RlcERhdGEnXSB8fCBjaGFuZ2VzWydzdGVwTnVtYmVySW5wdXQnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1N0ZXBUeXBlQW5kRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1N0ZXBUeXBlQW5kRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBUeXBlID0gZ2V0U3RlcERldGFpbHNTdGVwVHlwZSh0aGlzLnN0ZXApO1xuICAgIHRoaXMudmlzaWJsZUZpZWxkcyA9IHRoaXMuc3RlcFR5cGUgPyBTVEVQX0RFVEFJTFNfRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgICB0aGlzLmJ1aWxkRm9ybUZyb21TdGVwKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybUZyb21TdGVwKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMudmlzaWJsZUZpZWxkcykge1xuICAgICAgaWYgKGtleSA9PT0gJ2FkdmFuY2VkJykgY29udGludWU7XG4gICAgICBncm91cFtrZXldID0gW3RoaXMuZ2V0U3RlcFZhbHVlKGtleSldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBBRFZBTkNFRF9UT0dHTEVfS0VZUykge1xuICAgICAgaWYgKCEoa2V5IGluIGdyb3VwKSkgZ3JvdXBba2V5XSA9IFt0aGlzLmdldFN0ZXBWYWx1ZShrZXkpXTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChncm91cCk7XG4gIH1cblxuICBnZXRTdGVwVmFsdWUoa2V5OiBTdGVwRGV0YWlsc0ZpZWxkS2V5KTogdW5rbm93biB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc05vcm1hbFN0ZXBDb25maWcodGhpcy5zdGVwKSAmJiAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmV2ZW50VHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gKHRoaXMuc3RlcCBhcyBOb3JtYWxTdGVwQ29uZmlnKS5wYXJhbWV0ZXJzO1xuICAgICAgICByZXR1cm4gcGFyYW1zPy5bMF0/LnZhbHVlID8/ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykucGFyYW1ldGVycztcbiAgICAgICAgcmV0dXJuIHBhcmFtcz8uWzFdPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQXBpU3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhcGkgPSB0aGlzLnN0ZXAgYXMgQXBpU3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdtZXRob2QnKSByZXR1cm4gYXBpLm1ldGhvZCA/PyAnR0VUJztcbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSByZXR1cm4gYXBpLmJhc2VVcmwgPyBgJHthcGkuYmFzZVVybH0ke2FwaS5lbmRwb2ludCB8fCAnJ31gIDogYXBpLmVuZHBvaW50ID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSByZXR1cm4gYXBpLmhlYWRlcnMgPyBKU09OLnN0cmluZ2lmeShhcGkuaGVhZGVycywgbnVsbCwgMikgOiAnJztcbiAgICAgIGlmIChrZXkgPT09ICdib2R5JykgcmV0dXJuIGFwaS5yZXF1ZXN0Qm9keSA/PyAnJztcbiAgICAgIGlmIChrZXkgPT09ICdzYXZlT3V0cHV0QXNWYXJpYWJsZScpIHJldHVybiBhcGkuc2F2ZVRvID8/ICcnO1xuICAgIH1cbiAgICBpZiAoaXNBaUFnZW50U3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhaSA9IHRoaXMuc3RlcCBhcyBBaUFnZW50U3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdhZ2VudFRhc2snKSByZXR1cm4gYWkuaW5zdHJ1Y3Rpb25zID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykgcmV0dXJuIChhaSBhcyBhbnkpLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykgcmV0dXJuIChzdGVwIGFzIGFueSkubWV0YWRhdGEgPz8gJyc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGtleSA9PT0gJ29ubHlVc2VBdHRhY2hlZENvbnRleHQnIHx8XG4gICAgICBrZXkgPT09ICd0YWtlU2NyZWVuc2hvdHNXaGVuVmVyaWZ5aW5nJyB8fFxuICAgICAga2V5ID09PSAnY29udGludWVPbkVycm9yJyB8fFxuICAgICAga2V5ID09PSAnZGlzYWJsZWQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID8/ICcnO1xuICB9XG5cbiAgc2V0U3RlcFZhbHVlKGtleTogU3RlcERldGFpbHNGaWVsZEtleSwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzTm9ybWFsU3RlcENvbmZpZyh0aGlzLnN0ZXApICYmICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZXZlbnRUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlswXSkgcGFyYW1zWzBdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZWxzZSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmRlc2NyaXB0aW9uID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlsxXSkgcGFyYW1zWzFdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNBcGlTdGVwQ29uZmlnKHRoaXMuc3RlcCkpIHtcbiAgICAgIGNvbnN0IGFwaSA9IHRoaXMuc3RlcCBhcyBBcGlTdGVwQ29uZmlnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGhvZCcpIHsgYXBpLm1ldGhvZCA9IHZhbHVlIGFzIEFwaVN0ZXBDb25maWdbJ21ldGhvZCddOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSB7IGFwaS5lbmRwb2ludCA9IFN0cmluZyh2YWx1ZSk7IHJldHVybjsgfVxuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSB7XG4gICAgICAgIHRyeSB7IGFwaS5oZWFkZXJzID0gSlNPTi5wYXJzZShTdHJpbmcodmFsdWUpIHx8ICd7fScpOyB9IGNhdGNoIHsgYXBpLmhlYWRlcnMgPSB7fTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnYm9keScpIHsgYXBpLnJlcXVlc3RCb2R5ID0gU3RyaW5nKHZhbHVlKTsgcmV0dXJuOyB9XG4gICAgICBpZiAoa2V5ID09PSAnc2F2ZU91dHB1dEFzVmFyaWFibGUnKSB7IGFwaS5zYXZlVG8gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICB9XG4gICAgaWYgKGlzQWlBZ2VudFN0ZXBDb25maWcodGhpcy5zdGVwKSkge1xuICAgICAgY29uc3QgYWkgPSB0aGlzLnN0ZXAgYXMgQWlBZ2VudFN0ZXBDb25maWc7XG4gICAgICBpZiAoa2V5ID09PSAnYWdlbnRUYXNrJykgeyBhaS5pbnN0cnVjdGlvbnMgPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHsgKGFpIGFzIGFueSkuZGVzY3JpcHRpb24gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdtZXRhZGF0YScpIHsgKHN0ZXAgYXMgYW55KS5tZXRhZGF0YSA9IHZhbHVlOyByZXR1cm47IH1cbiAgICB9XG4gICAgKHN0ZXAgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvblNhdmVBc1RlbXBsYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlGb3JtVG9TdGVwKCk7XG4gICAgdGhpcy5zYXZlQXNUZW1wbGF0ZS5lbWl0KHRoaXMuc3RlcCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlQXNUZW1wbGF0ZScsIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVDaGFuZ2VzLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVDaGFuZ2VzJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1Ub1N0ZXAoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy52aXNpYmxlRmllbGRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQURWQU5DRURfVE9HR0xFX0tFWVMpIHtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY2FjaGVkIG1hcCBvZiBzZWxlY3QgY29uZmlncyBmcm9tIGZpZWxkIG1ldGEgKHN0YWJsZSByZWZzIHRvIHByZXZlbnQgQ0QgbG9vcHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlnTWFwKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTVEVQX0RFVEFJTFNfRklFTERfTUVUQSkgYXMgU3RlcERldGFpbHNGaWVsZEtleVtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQVtrZXldO1xuICAgICAgaWYgKCFtZXRhIHx8IG1ldGEuY29udHJvbFR5cGUgIT09ICdkcm9wZG93bicgfHwgIW1ldGEub3B0aW9ucz8ubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gbWV0YS5vcHRpb25zLm1hcCgobykgPT4gKHsgdmFsdWU6IG8udmFsdWUsIGxhYmVsOiBvLmxhYmVsIH0pKTtcbiAgICAgIG1hcFtrZXldID0ge1xuICAgICAgICBrZXk6IG1ldGEua2V5LFxuICAgICAgICBwbGFjZWhvbGRlcjogbWV0YS5wbGFjZWhvbGRlciA/PyBtZXRhLmxhYmVsLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGVkIHNlbGVjdCBjb25maWcgZm9yIGtleSAoZm9yIHRlbXBsYXRlIHVzZTsgc2FtZSByZWZlcmVuY2UgZXZlcnkgdGltZSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdNYXBba2V5XSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBrZXkgaXMgdGhlIGZpcnN0IGluIGl0cyBzZWN0aW9uIChmb3Igc2hvd2luZyBzZWN0aW9uIGhlYWRpbmdzKS4gKi9cbiAgaXNGaXJzdEluU2VjdGlvbihrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXksIHNlY3Rpb246IFN0ZXBEZXRhaWxzRmllbGRTZWN0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW2tleV07XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuc2VjdGlvbiAhPT0gc2VjdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMudmlzaWJsZUZpZWxkcy5pbmRleE9mKGtleSk7XG4gICAgaWYgKGlkeCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2TWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW3RoaXMudmlzaWJsZUZpZWxkc1tpZHggLSAxXV07XG4gICAgcmV0dXJuICFwcmV2TWV0YSB8fCBwcmV2TWV0YS5zZWN0aW9uICE9PSBzZWN0aW9uO1xuICB9XG5cbiAgLyoqIER5bmFtaWMgZHJhd2VyIHRpdGxlIGJ5IHN0ZXAgdHlwZSAoZS5nLiBcIkFJIEFnZW50IFN0ZXAgRGV0YWlsc1wiKS4gKi9cbiAgZ2V0IGRyYXdlclRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RlcFR5cGUgPT09ICdjdXN0b20nKSByZXR1cm4gJ0N1c3RvbSBTdGVwIERldGFpbHMnO1xuICAgIGlmICh0aGlzLnN0ZXBUeXBlID09PSAnYXBpJykgcmV0dXJuICdBUEkgU3RlcCBEZXRhaWxzJztcbiAgICBpZiAodGhpcy5zdGVwVHlwZSA9PT0gJ2FpQWdlbnQnKSByZXR1cm4gJ0FJIEFnZW50IFN0ZXAgRGV0YWlscyc7XG4gICAgcmV0dXJuICdTdGVwIERldGFpbHMnO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIE5vIFByaW9yaXR5LiBGdWxseSBjb25maWctZHJpdmVuLiAtLT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNDgwcHhdIGNxYS1ib3gtYm9yZGVyXCI+XG4gIDwhLS0gSGVhZGVyOiBiYWNrIGNoZXZyb24sIGR5bmFtaWMgdGl0bGUsIFN0ZXAgTiBwaWxsLCBjbG9zZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLXQtWzEycHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkJhY2soKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQmFja1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCI+Y2hldnJvbl9sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZmxleC0xXCI+XG4gICAgICAgIHt7IGRyYXdlclRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgU3RlcCB7eyBzdGVwTnVtYmVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogQXR0cmlidXRlcyArIGR5bmFtaWMgZmllbGRzIGZyb20gY29uZmlnIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwVHlwZVwiPlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMyBjcWEtbXQtMFwiPkF0dHJpYnV0ZXM8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiB2aXNpYmxlRmllbGRzXCI+XG4gICAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRpbmc6IENvbnN0cmFpbnRzIChmaXJzdCBjb25zdHJhaW50cyBmaWVsZCBvbmx5KSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwia2V5ICE9PSAnYWR2YW5jZWQnICYmIGlzRmlyc3RJblNlY3Rpb24oa2V5LCAnY29uc3RyYWludHMnKVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMiBjcWEtbXQtMFwiPkNvbnN0cmFpbnRzPC9wPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSBzZWN0aW9uIHdpdGggY29uZmlnLWRyaXZlbiB0b2dnbGVzICsgc3ViZmllbGRzIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgPT09ICdhZHZhbmNlZCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1bI0U1RTdFQl1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB0LTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBBZHZhbmNlZCB0b2dnbGVzIGZyb20gY29uZmlnIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0b2dnbGVLZXkgb2YgYWR2YW5jZWRUb2dnbGVLZXlzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgKm5nSWY9XCJmaWVsZE1ldGFbdG9nZ2xlS2V5XVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KHRvZ2dsZUtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQodG9nZ2xlS2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNzM3MzczXVwiPnt7IGZpZWxkTWV0YVt0b2dnbGVLZXldLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzBBMEEwQV1cIiAqbmdJZj1cImZpZWxkTWV0YVt0b2dnbGVLZXldLnN1YkxhYmVsXCI+e3sgZmllbGRNZXRhW3RvZ2dsZUtleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gQWR2YW5jZWQgc3ViZmllbGRzIChlLmcuIFJldHJ5IENvdW50LCBJZnJhbWUgbG9jYXRvciwgT3RoZXIgTG9jYXRvcnMgZm9yIGFpQWdlbnQpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJLZXkgb2YgYWR2YW5jZWRTdWJmaWVsZHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXNlbGVjdFwiICpuZ0lmPVwiZmllbGRNZXRhW3N1YktleV0/LmNvbnRyb2xUeXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhzdWJLZXkpICYmIGZvcm0uY29udGFpbnMoc3ViS2V5KVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFbc3ViS2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhzdWJLZXkpIVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNraXA6IGFkdmFuY2VkIGtleSAoYWxyZWFkeSByZW5kZXJlZCkgYW5kIGZpZWxkcyB0aGF0IGFyZSByZW5kZXJlZCBpbnNpZGUgYWR2YW5jZWQgZm9yIHRoaXMgc3RlcCB0eXBlIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgIT09ICdhZHZhbmNlZCcgJiYgIShzdGVwVHlwZSA9PT0gJ2FpQWdlbnQnICYmIGFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSkpXCI+XG4gICAgICAgICAgICA8IS0tIHRleHQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGRNZXRhW2tleV0/LmNvbnRyb2xUeXBlID09PSAndGV4dCdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGRNZXRhW2tleV0ucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSB0ZXh0YXJlYSAoaW5jbHVkaW5nIGFnZW50VGFzayB3aXRoIG9wdGlvbmFsIHJlcXVpcmVkICsgdGlwKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnJlcXVpcmVkXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJrZXkgPT09ICdhZ2VudFRhc2snXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTBcIj5XaGF0IHNob3VsZCB0aGUgYWdlbnQgYWNoaWV2ZT88L3A+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkTWV0YVtrZXldLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoa2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiZmllbGRNZXRhW2tleV0ucm93cyB8fCA0XCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnRpcFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wXCI+e3sgZmllbGRNZXRhW2tleV0udGlwIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gY29kZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZE1ldGFba2V5XS5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIHJlc2l6ZT1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZHJvcGRvd24gKG1haW4gKyBjb25zdHJhaW50czsgYWR2YW5jZWQtb25seSBkcm9wZG93bnMgcmVuZGVyZWQgaW5zaWRlIEFkdmFuY2VkIHNlY3Rpb24pIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBmb3JtLmNvbnRhaW5zKGtleSkgJiYgZ2V0U2VsZWN0Q29uZmlnKGtleSkgJiYgIWFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFba2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKGtleSkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gdG9nZ2xlIChlLmcuIG9ubHlVc2VBdHRhY2hlZENvbnRleHQsIHRha2VTY3JlZW5zaG90c1doZW5WZXJpZnlpbmcpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ3RvZ2dsZSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9wPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGRNZXRhW2tleV0uc3ViTGFiZWxcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cIiFzdGVwVHlwZVwiIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlRoaXMgc3RlcCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGRyYXdlci48L3A+XG4gIDwvZGl2PlxuPGRpdiBjbGFzcz1cImNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XVwiPiA8L2Rpdj5cbiAgPCEtLSBGb290ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1nYXAtMiBjcWEtcHgtNCBjcWEtcHktNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJnLVsjRjVGNUY1NERdXCI+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cInRleHRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS10ZXh0LVsjMzc0MTUxXSdcIj48L2NxYS1idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj48L2Rpdj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInU2F2ZSBhcyBUZW1wbGF0ZSdcIiAoY2xpY2tlZCk9XCJvblNhdmVBc1RlbXBsYXRlKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgQ2hhbmdlcydcIiAoY2xpY2tlZCk9XCJvblNhdmVDaGFuZ2VzKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1iZy1bIzNGNDNFRV0gY3FhLWJvcmRlci1bIzNGNDNFRV0nXCI+PC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT2pIOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBMkRyQyxZQUMyQyxHQUF5QixFQUMxRCxFQUFlLEVBQ2YsR0FBc0IsRUFDZ0IsSUFBNEI7UUFIakMsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFDMUQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0R0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFekQsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0Msb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQ3hELDZGQUE2RjtRQUNwRix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hFLHdFQUF3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QWdCLENBQUM7SUFDL0IsQ0FBQzs7dUhBMUxVLDBCQUEwQixrQkE0RDNCLHVCQUF1Qix5RUFHWCx3QkFBd0I7MkdBL0RuQywwQkFBMEIsc1dDakN2Qyx1L1VBa0xBOzJGRGpKYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UseUJBQXlCLFFBRTdCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzswQkE4RDVDLE1BQU07MkJBQUMsdUJBQXVCOzswQkFHOUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx3QkFBd0I7NENBOURwQyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiwgU3RlcERldGFpbHNEcmF3ZXJSZWYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhLCBEeW5hbWljRmllbGRDb25maWcgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItZGF0YSc7XG5pbXBvcnQgeyBUZXN0Q2FzZVN0ZXBDb25maWcgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHR5cGUge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuLyoqXG4gKiBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKS5cbiAqIFJlbmRlcnMgb25seSBmcm9tIHRoZSBwcm92aWRlZCBEeW5hbWljRmllbGRDb25maWdbXTsgbm8gZmlsdGVyaW5nIG9yIHN0ZXAtdHlwZS1iYXNlZCBmaWVsZCBsb2dpYy5cbiAqIEVhY2ggc3RlcCBpbnN0YW5jZSByZWNlaXZlcyBpdHMgb3duIGNvbXBsZXRlIGZpZWxkIGNvbmZpZ3VyYXRpb24uIEdlbmVyaWMga2V5LWJhc2VkIHN0ZXAgcmVhZC93cml0ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgc2F2ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVBc1RlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG5cbiAgQElucHV0KCkgc3RlcERhdGE6IFRlc3RDYXNlU3RlcENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzdGVwTnVtYmVySW5wdXQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBwcm92aWRlZCAoZS5nLiBTdG9yeWJvb2spLCB1c2UgaW5zdGVhZCBvZiBTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEuZHluYW1pY0ZpZWxkcy4gKi9cbiAgQElucHV0KCkgZHluYW1pY0ZpZWxkc0lucHV0OiBEeW5hbWljRmllbGRDb25maWdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlIGFzIGRyYXdlciBoZWFkZXIgdGl0bGUgKG92ZXJyaWRlcyBkYXRhLnRpdGxlKS4gKi9cbiAgQElucHV0KCkgZHJhd2VyVGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZztcbiAgc3RlcE51bWJlcjogbnVtYmVyIHwgc3RyaW5nO1xuICBkeW5hbWljRmllbGRzOiBEeW5hbWljRmllbGRDb25maWdbXSA9IFtdO1xuICBkcmF3ZXJUaXRsZVZhbHVlID0gJ1N0ZXAgRGV0YWlscyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgZm9ybTogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgcGVyIGZpZWxkIGtleSAoc3RhYmxlIHJlZnMgZm9yIGNoYW5nZSBkZXRlY3Rpb24pLiAqL1xuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0ge307XG5cbiAgLyoqIEFsbCBmaWVsZHMgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgKHNhbWUgcmVmZXJlbmNlOyB1c2VkIGZvciBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIHRlbXBsYXRlKS4gKi9cbiAgZ2V0IGFsbEZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcztcbiAgfVxuXG4gIC8qKiBGaWVsZHMgaW4gbWFpbiBzZWN0aW9uIChzZWN0aW9uID09PSAnbWFpbicgb3IgdW5kZWZpbmVkKS4gKi9cbiAgZ2V0IG1haW5GaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHMuZmlsdGVyKChmKSA9PiAoZi5zZWN0aW9uID8/ICdtYWluJykgPT09ICdtYWluJyk7XG4gIH1cblxuICAvKiogRmllbGRzIGluIGNvbnN0cmFpbnRzIHNlY3Rpb24uICovXG4gIGdldCBjb25zdHJhaW50c0ZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcy5maWx0ZXIoKGYpID0+IGYuc2VjdGlvbiA9PT0gJ2NvbnN0cmFpbnRzJyk7XG4gIH1cblxuICAvKiogRmllbGRzIGluIGFkdmFuY2VkIHNlY3Rpb24gKGluc2lkZSBleHBhbmRhYmxlIGJsb2NrKS4gKi9cbiAgZ2V0IGFkdmFuY2VkRmllbGRzKCk6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRmllbGRzLmZpbHRlcigoZikgPT4gZi5zZWN0aW9uID09PSAnYWR2YW5jZWQnKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGZpZWxkIGF0IGluZGV4IGlzIHRoZSBmaXJzdCBpbiBpdHMgc2VjdGlvbiAoZm9yIHNob3dpbmcgc2VjdGlvbiBoZWFkZXJzKS4gKi9cbiAgaXNGaXJzdEluU2VjdGlvbihpbmRleDogbnVtYmVyLCBzZWN0aW9uOiAnbWFpbicgfCAnY29uc3RyYWludHMnIHwgJ2FkdmFuY2VkJyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXhdO1xuICAgIGlmICghZikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGZTZWN0aW9uID0gZi5zZWN0aW9uID8/ICdtYWluJztcbiAgICBpZiAoZlNlY3Rpb24gIT09IHNlY3Rpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXggLSAxXTtcbiAgICByZXR1cm4gKHByZXY/LnNlY3Rpb24gPz8gJ21haW4nKSAhPT0gc2VjdGlvbjtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGZpZWxkIGF0IGluZGV4IGlzIG5vdCBpbiB0aGUgYWR2YW5jZWQgc2VjdGlvbiAocmVuZGVyIGluIG1haW4gZmxvdykuICovXG4gIGlzTm9uQWR2YW5jZWRGaWVsZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZiA9IHRoaXMuZHluYW1pY0ZpZWxkc1tpbmRleF07XG4gICAgcmV0dXJuIGYgIT0gbnVsbCAmJiAoZi5zZWN0aW9uID8/ICdtYWluJykgIT09ICdhZHZhbmNlZCc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFNURVBfREVUQUlMU19EUkFXRVJfUkVGKSBwcml2YXRlIHJlZjogU3RlcERldGFpbHNEcmF3ZXJSZWYsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBKSBkYXRhPzogU3RlcERldGFpbHNEcmF3ZXJEYXRhXG4gICkge1xuICAgIHRoaXMuc3RlcCA9IGRhdGE/LnN0ZXAgPz8gKHt9IGFzIFRlc3RDYXNlU3RlcENvbmZpZyk7XG4gICAgdGhpcy5zdGVwTnVtYmVyID0gZGF0YT8uc3RlcE51bWJlciA/PyAxO1xuICAgIHRoaXMuZHluYW1pY0ZpZWxkcyA9IGRhdGE/LmR5bmFtaWNGaWVsZHMgPz8gW107XG4gICAgdGhpcy5kcmF3ZXJUaXRsZVZhbHVlID0gZGF0YT8udGl0bGUgPz8gJ1N0ZXAgRGV0YWlscyc7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCB8fCB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsIHx8IHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY0ZpZWxkcyA9IHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCAmJiB0aGlzLmRyYXdlclRpdGxlICE9PSAnJykge1xuICAgICAgICB0aGlzLmRyYXdlclRpdGxlVmFsdWUgPSB0aGlzLmRyYXdlclRpdGxlO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGVwRGF0YSddIHx8IGNoYW5nZXNbJ3N0ZXBOdW1iZXJJbnB1dCddIHx8IGNoYW5nZXNbJ2R5bmFtaWNGaWVsZHNJbnB1dCddIHx8IGNoYW5nZXNbJ2RyYXdlclRpdGxlJ10pIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBEYXRhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGVwID0gdGhpcy5zdGVwRGF0YTtcbiAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVySW5wdXQgPz8gKHRoaXMuc3RlcERhdGEgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5keW5hbWljRmllbGRzSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmR5bmFtaWNGaWVsZHMgPSB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRyYXdlclRpdGxlICE9IG51bGwgJiYgdGhpcy5kcmF3ZXJUaXRsZSAhPT0gJycpIHtcbiAgICAgICAgdGhpcy5kcmF3ZXJUaXRsZVZhbHVlID0gdGhpcy5kcmF3ZXJUaXRsZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRGb3JtRnJvbUR5bmFtaWNGaWVsZHMoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5keW5hbWljRmllbGRzKSB7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmdldFN0ZXBWYWx1ZShmaWVsZC5rZXkpO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgJiYgZmllbGQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGZpZWxkLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgIDogcmF3O1xuICAgICAgZ3JvdXBbZmllbGQua2V5XSA9IFt2YWx1ZV07XG4gICAgfVxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXApO1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKiBSZWFkIHZhbHVlIGZyb20gc3RlcCBieSBrZXkuIE5vIHN0ZXAtdHlwZSBsb2dpYzsgc3RlcCBpcyBhIGdlbmVyaWMga2V5LXZhbHVlIGJhZy4gKi9cbiAgZ2V0U3RlcFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJhdyA9IHN0ZXBba2V5XTtcbiAgICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuXG4gIC8qKiBXcml0ZSB2YWx1ZSB0byBzdGVwIGJ5IGtleS4gTm8gc3RlcC10eXBlIGxvZ2ljOyBzdGVwIGlzIGEgZ2VuZXJpYyBrZXktdmFsdWUgYmFnLiAqL1xuICBzZXRTdGVwVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0ZXBba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25TYXZlQXNUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5Rm9ybVRvU3RlcCgpO1xuICAgIHRoaXMuc2F2ZUFzVGVtcGxhdGUuZW1pdCh0aGlzLnN0ZXApO1xuICAgIHRoaXMucmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZUFzVGVtcGxhdGUnLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gIH1cblxuICBvblNhdmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlGb3JtVG9TdGVwKCk7XG4gICAgdGhpcy5zYXZlQ2hhbmdlcy5lbWl0KHRoaXMuc3RlcCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlQ2hhbmdlcycsIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGb3JtVG9TdGVwKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5keW5hbWljRmllbGRzKSB7XG4gICAgICBpZiAodGhpcy5mb3JtLmNvbnRhaW5zKGZpZWxkLmtleSkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGVwVmFsdWUoZmllbGQua2V5LCB0aGlzLmZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZyBmb3IgZHJvcGRvd24gZmllbGQgKGNhY2hlZCBwZXIga2V5KS4gKi9cbiAgZ2V0U2VsZWN0Q29uZmlnKGZpZWxkOiBEeW5hbWljRmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2Ryb3Bkb3duJyB8fCAhZmllbGQub3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldKSByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldO1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gZmllbGQub3B0aW9ucy5tYXAoKG8pID0+ICh7IHZhbHVlOiBvLnZhbHVlLCBsYWJlbDogby5sYWJlbCB9KSk7XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZVtmaWVsZC5rZXldID0ge1xuICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICBwbGFjZWhvbGRlcjogZmllbGQucGxhY2Vob2xkZXIgPz8gZmllbGQubGFiZWwsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlZCBoZWFkZXIgdGl0bGUgZm9yIHRlbXBsYXRlOiBASW5wdXQgZHJhd2VyVGl0bGUgPiBpbmplY3RlZCBkYXRhLnRpdGxlID4gZGVmYXVsdC4gKi9cbiAgZ2V0IGRpc3BsYXlUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRyYXdlclRpdGxlVmFsdWU7XG4gIH1cbn1cbiIsIjwhLS0gU3RlcCBEZXRhaWxzIERyYXdlciDigJMgRWRpdCBJbiBEZXB0aC4gRnVsbHkgZHluYW1pYyBmcm9tIER5bmFtaWNGaWVsZENvbmZpZ1tdLiAtLT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNDgwcHhdIGNxYS1ib3gtYm9yZGVyXCI+XG4gIDwhLS0gSGVhZGVyOiBiYWNrIGNoZXZyb24sIHRpdGxlLCBTdGVwIE4gcGlsbCwgY2xvc2UgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS1weC00IGNxYS1weS00IGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC10LVsxMnB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25CYWNrKClcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkJhY2tcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsyMHB4XVwiPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZsZXgtMVwiPlxuICAgICAgICB7eyBkaXNwbGF5VGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRURFOUZFXSBjcWEtdGV4dC1bIzdDM0FFRF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bVwiPlxuICAgICAgICBTdGVwIHt7IHN0ZXBOdW1iZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1pbi1oLVsyOHB4XSBjcWEtbWluLXctWzI4cHhdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsyMHB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj4gPC9kaXY+XG5cbiAgPCEtLSBDb250ZW50OiBhbGwgZmllbGRzIGZyb20gZHluYW1pY0ZpZWxkcyBhcnJheSAobWFpbiArIGNvbnN0cmFpbnRzIGluIG9yZGVyLCB0aGVuIGFkdmFuY2VkIGdyb3VwZWQpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkeW5hbWljRmllbGRzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgIDwhLS0gQWxsIG5vbi1hZHZhbmNlZCBmaWVsZHMgaW4gYXJyYXkgb3JkZXIgd2l0aCBzZWN0aW9uIGhlYWRlcnMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGR5bmFtaWNGaWVsZHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOb25BZHZhbmNlZEZpZWxkKGkpXCI+XG4gICAgICAgICAgICA8cCAqbmdJZj1cImlzRmlyc3RJblNlY3Rpb24oaSwgJ21haW4nKVwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1iLTMgY3FhLW10LTBcIj5BdHRyaWJ1dGVzPC9wPlxuICAgICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdjb25zdHJhaW50cycpXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMiBjcWEtbXQtMFwiPkNvbnN0cmFpbnRzPC9wPlxuXG4gICAgICAgICAgICA8IS0tIHN0cmluZyAvIHVuZGVmaW5lZCDihpIgdGV4dCBpbnB1dCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gbnVtYmVyIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gdGV4dGFyZWEgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ3RleHRhcmVhJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGRUUyRTJdIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtXCI+UmVxdWlyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cImZpZWxkLnJvd3MgfHwgNFwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtcC0yIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMjBweF1cIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaWVsZC50aXBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMFwiPnt7IGZpZWxkLnRpcCB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGNvZGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2NvZGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiOFwiXG4gICAgICAgICAgICAgICAgcmVzaXplPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLXAtMiBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBib29sZWFuIOKGkiB0b2dnbGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Jvb2xlYW4nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj57eyBmaWVsZC5sYWJlbCB9fTwvcD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnN1YkxhYmVsXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLnN1YkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGRyb3Bkb3duIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdkcm9wZG93bicgJiYgZ2V0U2VsZWN0Q29uZmlnKGZpZWxkKSAmJiBmb3JtLmNvbnRhaW5zKGZpZWxkLmtleSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKGZpZWxkKSFcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSAoYWxsIGFkdmFuY2VkIGZpZWxkcyBmcm9tIGFycmF5KSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkdmFuY2VkRmllbGRzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1weS0yIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3Bhbj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsyMHB4XSBjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB0LTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGFkdmFuY2VkRmllbGRzXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdib29sZWFuJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M11cIj57eyBmaWVsZC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMEEwQTBBXVwiICpuZ0lmPVwiZmllbGQuc3ViTGFiZWxcIj57eyBmaWVsZC5zdWJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cImR5bmFtaWNGaWVsZHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+Tm8gZmllbGRzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc3RlcC48L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuICA8IS0tIEZvb3RlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtYmctWyNGNUY1RjU0RF1cIj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwidGV4dFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLXRleHQtWyMzNzQxNTFdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPjwvZGl2PlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidTYXZlIGFzIFRlbXBsYXRlJ1wiIChjbGlja2VkKT1cIm9uU2F2ZUFzVGVtcGxhdGUoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCI+PC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiIChjbGlja2VkKT1cIm9uU2F2ZUNoYW5nZXMoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJnLVsjM0Y0M0VFXSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|