@rangertechnologies/ngnxt 2.1.83 → 2.1.85

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.
@@ -0,0 +1,480 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common/http";
4
+ import * as i2 from "../../../services/form-builder.service";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "@angular/forms";
7
+ export class PropertiesComponent {
8
+ http;
9
+ formBuilderService;
10
+ // selectedElement: any;
11
+ colorWheel;
12
+ ctx;
13
+ selectedOption = '';
14
+ selectedElementIndex = -1;
15
+ // @Input() selectedElement: any;
16
+ selectedElementType = '';
17
+ selectedAlign = 'align-left'; // Add this property
18
+ selectedStyles = []; // Using array since multiple styles can be selected
19
+ errorMessage = '';
20
+ selectedElement = null; // Receive the selected element
21
+ onToggleChange(property, event) {
22
+ const value = event.target.checked;
23
+ if (this.selectedElement) {
24
+ const update = { [property]: value };
25
+ this.formBuilderService.updateElement(this.selectedElementIndex, update);
26
+ // Update the selected element directly for immediate UI feedback
27
+ this.selectedElement[property] = value;
28
+ }
29
+ }
30
+ updateProperties(elementType) {
31
+ // Reset alignment and styles if switching elements
32
+ this.selectedAlign = 'align-left';
33
+ this.selectedStyles = [];
34
+ // Fetch the properties of the selected element type
35
+ const properties = this.getProperties();
36
+ if (properties) {
37
+ // Make sure the properties are dynamically updated
38
+ }
39
+ }
40
+ onAlignSelect(value) {
41
+ if (this.selectedElement) {
42
+ this.selectedElement.textAlign = value;
43
+ console.log(`Selected alignment: ${value}`);
44
+ }
45
+ }
46
+ onStyleSelect(value) {
47
+ if (!this.selectedElement)
48
+ return;
49
+ // Initialize styles array if it doesn't exist
50
+ this.selectedElement.styles = this.selectedElement.styles || [];
51
+ // Ensure only one style is selected at a time
52
+ this.selectedElement.styles = [value];
53
+ console.log('Updated styles:', this.selectedElement.styles);
54
+ }
55
+ isStyleActive(value) {
56
+ return this.selectedElement?.styles?.includes(value) || false;
57
+ }
58
+ elementProperties = {
59
+ // Add other element types here similarly
60
+ 'Text': {
61
+ elementProps: [
62
+ // questionText - Label-follow all element properties
63
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
64
+ // question - Placeholder-follow all element properties
65
+ { label: 'placeholder', placeholder: 'Enter Text', type: 'text', key: 'question' },
66
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
67
+ { label: '', type: 'toggleGroup' },
68
+ // errorMessage - Error Msg-follow all element properties
69
+ { label: 'Error Msg', placeholder: 'Enter Text ', type: 'text', key: 'errorMsg' },
70
+ { label: 'Font', type: 'select', key: 'font',
71
+ options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto'] },
72
+ { label: 'Weight', type: 'select', key: 'fontWeight',
73
+ options: [
74
+ { value: '400', label: '400-Normal' },
75
+ { value: '500', label: '500-Medium' },
76
+ { value: '600', label: '600-Semi Bold' },
77
+ { value: '700', label: '700-Bold' }
78
+ ] },
79
+ // { label: 'Size', unit: 'PX', type: 'number', key: 'size' },
80
+ { label: 'Align', type: 'align', key: 'textAlign',
81
+ options: [
82
+ { value: 'left', icon: 'textalign-left' },
83
+ { value: 'center', icon: 'align-center' },
84
+ { value: 'right', icon: 'align-right' },
85
+ { value: 'justifyleft', icon: 'align-justifyleft' },
86
+ { value: 'justifyright', icon: 'align-justifyright' }
87
+ ] },
88
+ { label: 'Style', type: 'style', key: 'styles',
89
+ options: [
90
+ { value: 'italic', icon: 'italic' },
91
+ { value: 'bold', icon: 'bold' },
92
+ { value: 'underline', icon: 'underline' },
93
+ { value: 'texticon', icon: 'texticon' },
94
+ { value: 'capitalize', icon: 'capitalize' },
95
+ { value: 'resize', icon: 'resize' }
96
+ ] },
97
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' }
98
+ ],
99
+ fieldProps: [
100
+ { label: 'Field Required', type: 'radio' },
101
+ { label: 'Default Value', placeholder: 'Enter Text ', type: 'text', key: 'defaultValue' },
102
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
103
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
104
+ { label: 'Sub Text', placeholder: 'Enter Text ', type: 'text' }
105
+ ]
106
+ },
107
+ 'CheckBox': {
108
+ elementProps: [
109
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
110
+ { label: 'Place Holder', placeholder: 'Enter Text ', type: 'text', key: 'question' },
111
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
112
+ { label: '', type: 'toggleGroup' },
113
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
114
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
115
+ ],
116
+ fieldProps: [
117
+ { label: 'Field Required', type: 'radio' },
118
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
119
+ {
120
+ label: 'Chk Options',
121
+ type: 'optionsGroup',
122
+ key: 'chkOptions',
123
+ options: [
124
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
125
+ ],
126
+ addOptionLabel: 'Add Variant', // Text for the plus icon
127
+ icon: 'plus' // Icon for adding options
128
+ },
129
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
130
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
131
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
132
+ ]
133
+ },
134
+ 'Calendar': {
135
+ elementProps: [
136
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
137
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
138
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
139
+ { label: '', type: 'toggleGroup' },
140
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
141
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
142
+ ],
143
+ fieldProps: [
144
+ { label: 'Field Required', type: 'radio' },
145
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
146
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
147
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
148
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
149
+ ]
150
+ },
151
+ 'Time': {
152
+ elementProps: [
153
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'label' },
154
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'placeholder' },
155
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
156
+ { label: '', type: 'toggleGroup' },
157
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
158
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
159
+ ],
160
+ fieldProps: [
161
+ { label: 'Field Required', type: 'radio' },
162
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
163
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
164
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
165
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
166
+ ]
167
+ },
168
+ 'Email': {
169
+ elementProps: [
170
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
171
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
172
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
173
+ { label: '', type: 'toggleGroup' },
174
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
175
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
176
+ ],
177
+ fieldProps: [
178
+ { label: 'Field Required', type: 'radio' },
179
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
180
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
181
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
182
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
183
+ ]
184
+ },
185
+ 'File': {
186
+ elementProps: [
187
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
188
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
189
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
190
+ { label: 'Support Type', type: 'select', key: 'supportType', options: [
191
+ { label: 'Images (JPEG, PNG, GIF)', value: 'image/*', extensions: ['.jpg', '.jpeg', '.png', '.gif'] },
192
+ { label: 'Audio (MP3, WAV, AIFF)', value: 'audio/*', extensions: ['.mp3', '.wav', '.aiff'] },
193
+ { label: 'Video (MP4, AVI, HEVC)', value: 'video/*', extensions: ['.mp4', '.avi', '.hevc'] },
194
+ { label: 'Documents (DOC, DOCX, PPT, PDF)', value: 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-powerpoint', extensions: ['.doc', '.docx', '.ppt', '.pdf'] },
195
+ { label: 'Executables (EXE, BAD, SH)', value: 'application/x-msdownload,application/x-sh', extensions: ['.exe', '.bad', '.sh'] },
196
+ { label: 'Archives (ZIP, RAR, Git-hub)', value: 'application/zip,application/x-rar-compressed,application/x-git', extensions: ['.zip', '.rar', '.git'] }
197
+ ] },
198
+ { label: '', type: 'toggleGroup' },
199
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
200
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
201
+ ],
202
+ fieldProps: [
203
+ { label: 'Field Required', type: 'radio' },
204
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
205
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
206
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
207
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
208
+ ]
209
+ },
210
+ 'List': {
211
+ elementProps: [
212
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
213
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
214
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
215
+ { label: '', type: 'toggleGroup' },
216
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
217
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
218
+ ],
219
+ fieldProps: [
220
+ { label: 'Field Required', type: 'radio' },
221
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
222
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
223
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
224
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
225
+ ]
226
+ }, 'TextArea': {
227
+ elementProps: [
228
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
229
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
230
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
231
+ { label: '', type: 'toggleGroup' },
232
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
233
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
234
+ ],
235
+ fieldProps: [
236
+ { label: 'Field Required', type: 'radio', key: 'required' },
237
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text', key: 'defaultValue' },
238
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
239
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
240
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
241
+ ]
242
+ }, 'Numbers': {
243
+ elementProps: [
244
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
245
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
246
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
247
+ { label: '', type: 'toggleGroup' },
248
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
249
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
250
+ ],
251
+ fieldProps: [
252
+ { label: 'Field Required', type: 'radio' },
253
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
254
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
255
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
256
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
257
+ ]
258
+ }, 'Dropdown': {
259
+ elementProps: [
260
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
261
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
262
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
263
+ { label: '', type: 'toggleGroup' },
264
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
265
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
266
+ ],
267
+ fieldProps: [
268
+ { label: 'Field Required', type: 'radio' },
269
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
270
+ {
271
+ label: 'Chk Options',
272
+ type: 'optionsGroup',
273
+ key: 'chkOptions',
274
+ options: [
275
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
276
+ ],
277
+ addOptionLabel: 'Add Variant', // Text for the plus icon
278
+ icon: 'plus' // Icon for adding options
279
+ },
280
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
281
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
282
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' },
283
+ ]
284
+ }, 'Image': {
285
+ elementProps: [
286
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
287
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
288
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
289
+ { label: '', type: 'toggleGroup' },
290
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
291
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
292
+ ],
293
+ fieldProps: [
294
+ { label: 'Field Required', type: 'radio' },
295
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
296
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
297
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
298
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
299
+ ]
300
+ }, 'Radio': {
301
+ elementProps: [
302
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
303
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
304
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
305
+ { label: '', type: 'toggleGroup' },
306
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
307
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
308
+ ],
309
+ fieldProps: [
310
+ { label: 'Field Required', type: 'radio' },
311
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
312
+ {
313
+ label: 'Radio Options', // Updated label to reflect radio context
314
+ type: 'optionsGroup',
315
+ key: 'radioOptions', // Updated key for radio context
316
+ options: [
317
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
318
+ { label: 'Option 2', value: '', type: 'text', key: 'option2' },
319
+ ],
320
+ addOptionLabel: 'Add Option', // Updated label for add button
321
+ icon: 'plus', // Icon for adding options
322
+ },
323
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
324
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
325
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' },
326
+ ]
327
+ },
328
+ 'Book': {
329
+ elementProps: [
330
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
331
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
332
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
333
+ { label: '', type: 'toggleGroup' },
334
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
335
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
336
+ ],
337
+ fieldProps: [
338
+ { label: 'Field Required', type: 'radio' },
339
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
340
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
341
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
342
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
343
+ ]
344
+ }, 'Button': {
345
+ elementProps: [
346
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
347
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
348
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
349
+ { label: '', type: 'toggleGroup' },
350
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
351
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
352
+ ],
353
+ fieldProps: [
354
+ { label: 'Field Required', type: 'radio' },
355
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
356
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
357
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
358
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
359
+ ]
360
+ },
361
+ };
362
+ constructor(http, formBuilderService) {
363
+ this.http = http;
364
+ this.formBuilderService = formBuilderService;
365
+ }
366
+ ngOnInit() {
367
+ this.formBuilderService.selectedElement$.subscribe(index => {
368
+ this.selectedElementIndex = index;
369
+ if (index >= 0) {
370
+ const elements = this.formBuilderService.getElements();
371
+ console.log('Selected element:', elements);
372
+ this.selectedElement = elements[index];
373
+ }
374
+ });
375
+ }
376
+ validateInput(value, type) {
377
+ if (type === 'label' || type === 'placeholder') {
378
+ const regex = /^[a-zA-Z0-9\s]*$/;
379
+ if (!regex.test(value)) {
380
+ this.errorMessage = 'Only letters and numbers are allowed';
381
+ return false;
382
+ }
383
+ }
384
+ this.errorMessage = '';
385
+ return true;
386
+ }
387
+ updateProperty(key, value) {
388
+ if (this.selectedElementIndex >= 0) {
389
+ if (key === 'questionText' || key === 'question') {
390
+ if (!this.validateInput(value, key)) {
391
+ return;
392
+ }
393
+ }
394
+ if (key === 'fontWeight') {
395
+ // Extract just the number value from the option
396
+ value = value.split('-')[0];
397
+ }
398
+ if (key === 'styles') {
399
+ const currentStyles = this.selectedElement.styles || [];
400
+ if (value === 'capitalize' || value === 'lowercase') {
401
+ // Remove the opposite case if it exists
402
+ const oppositeStyle = value === 'capitalize' ? 'lowercase' : 'capitalize';
403
+ const filteredStyles = currentStyles.filter(s => s !== oppositeStyle);
404
+ value = currentStyles.includes(value)
405
+ ? filteredStyles.filter(s => s !== value)
406
+ : [...filteredStyles, value];
407
+ }
408
+ else {
409
+ // Toggle other styles
410
+ value = currentStyles.includes(value)
411
+ ? currentStyles.filter(s => s !== value)
412
+ : [...currentStyles, value];
413
+ }
414
+ }
415
+ const update = { [key]: value };
416
+ this.formBuilderService.updateElement(this.selectedElementIndex, update);
417
+ // Special handling for font and font weight
418
+ if (key === 'font') {
419
+ this.selectedElement.font = value; // Directly update the selected element's font property
420
+ }
421
+ }
422
+ }
423
+ onRequiredChange(value) {
424
+ if (this.selectedElement) {
425
+ // Remove any existing asterisks first
426
+ let label = this.selectedElement.label.replace(/\s*\*+$/, '');
427
+ if (value) {
428
+ label = `${label} *`; // Add single asterisk
429
+ }
430
+ this.updateProperty('label', label);
431
+ this.updateProperty('required', value);
432
+ }
433
+ }
434
+ getProperties() {
435
+ if (!this.selectedElement)
436
+ return null;
437
+ return this.elementProperties[this.selectedElement.type];
438
+ }
439
+ // openColorPicker(propertyKey: string) {
440
+ // // If you want to use the browser's native color picker:
441
+ // const input = document.createElement('input');
442
+ // input.type = 'color';
443
+ // input.value = this.selectedElement[propertyKey];
444
+ // input.addEventListener('change', (e: any) => {
445
+ // this.updateProperty(propertyKey, e.target.value);
446
+ // });
447
+ // input.click();
448
+ // }
449
+ // Function to add a new option to prop options
450
+ addOption(options) {
451
+ options.push({ label: '', value: '' });
452
+ }
453
+ // Function to remove an option from prop options
454
+ removeOption(options, index) {
455
+ options.splice(index, 1);
456
+ }
457
+ download() {
458
+ console.log('Question Book:', this.formBuilderService.downloadElement());
459
+ }
460
+ save() {
461
+ const apiURL = 'https://dev-api.rangerfusion.com/nxt/';
462
+ this.http.post(apiURL, this.formBuilderService.downloadElement()).subscribe((response) => {
463
+ console.log('Response:', response);
464
+ }, (error) => {
465
+ console.error('Error:', error);
466
+ });
467
+ }
468
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, deps: [{ token: i1.HttpClient }, { token: i2.FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
469
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PropertiesComponent, selector: "app-properties", inputs: { selectedElementType: "selectedElementType" }, viewQueries: [{ propertyName: "colorWheel", first: true, predicate: ["colorWheel"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\r\n<!-- properties.component.html -->\r\n<div class=\"container\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n<!-- Design Header Section -->\r\n<div class=\"design-header\">\r\n <h1 class=\"header-title\">Element Properties</h1>\r\n <div class=\"menu-container\">\r\n <div class=\"menu-item\" (click)=\"download()\">\r\n <span >Download</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Start</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Path</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Clone</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- properties.component.html -->\r\n<div class=\"all-properties\">\r\n <div *ngIf=\"errorMessage\" class=\"error-message\">\r\n {{ errorMessage }}\r\n </div>\r\n <!-- Element Properties -->\r\n <details class=\"first-properties\" open>\r\n <summary class=\"text-sm \">Elements Properties</summary>\r\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\r\n <div class=\"flex-items-center\">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"label-properties\">\r\n <!-- Text Input -->\r\n <input *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [class.read-only]=\"selectedElement.readOnly\"\r\n [readonly]=\"selectedElement.readOnly\"\r\n class=\"text-sm1 \"\r\n />\r\n <div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">\r\n {{ selectedElement.helpText }}\r\n </div>\r\n\r\n\r\n <!-- Font Selection -->\r\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'font'\"\r\n class=\"font-selection1\"\r\n [value]=\"selectedElement?.font\"\r\n (change)=\"updateProperty('font', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\r\n {{ option }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n<!-- file -->\r\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\r\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\"\r\n class=\"file \"\r\n[value]=\"selectedElement[prop.key]\"\r\n(change)=\"updateProperty(prop.key, $event.target.value)\">\r\n<option value=\"\">Select file category</option>\r\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n{{ option.label }}\r\n</option>\r\n</select>\r\n\r\n<!-- Font Weight Selection -->\r\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\"\r\n class=\"font-weight1 \"\r\n [value]=\"selectedElement?.fontWeight\"\r\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n <!-- Number Input with Unit -->\r\n <div *ngIf=\"prop.type === 'number'\" class=\"size-controls\">\r\n <div class=\"size-input-group\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [min]=\"prop.min || 1\"\r\n [max]=\"prop.max || 999999\"\r\n class=\"size-value\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle Group -->\r\n<!-- Toggle Group -->\r\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\r\n<div class=\"toggle-item1\">\r\n <span class=\"toggle-label\">Read Only</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.readOnly\"\r\n (change)=\"onToggleChange('readOnly', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n\r\n<div class=\"toggle-item2\">\r\n <span class=\"toggle-label\">Is Hide</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.isHide\"\r\n (change)=\"onToggleChange('isHide', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n</div>\r\n\r\n <!-- Text Align Buttons -->\r\n <div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onAlignSelect(option.value)\"\r\n [class.active]=\"selectedElement?.textAlign === option.value\"\r\n class=\"align-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.key === 'size'\" class=\"size-controls\">\r\n <label>{{ prop.label }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onStyleSelect(option.value)\"\r\n [class.active]=\"isStyleActive(option.value)\"\r\n class=\"style-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n<!-- Field Size Controls -->\r\n<div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Width</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.width\"\r\n (input)=\"updateProperty('width', $event.target.value)\"\r\n class=\"size-input\"\r\n\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Height</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.height\"\r\n (input)=\"updateProperty('height', $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </details>\r\n\r\n <!-- Field Elements Properties -->\r\n<details class=\"second-property\">\r\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\r\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\r\n <div class=\"flex-items-center \">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"input-box-field\">\r\n <!-- Input Box -->\r\n <input\r\n *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n class=\"field-input\"\r\n />\r\n <!-- Radio Group -->\r\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\r\n\r\n\r\n <div class=\"sizes\">\r\n <div class=\"flex-gap\">\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"selectedElement.required\"\r\n (change)=\"onRequiredChange(true)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-label\"\r\n >\r\n Required\r\n </label>\r\n </div>\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"!selectedElement.required\"\r\n (change)=\"onRequiredChange(false)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-sm text-gray-400\"\r\n >\r\n Not Required\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n <!-- Chk Options Group -->\r\n <div *ngIf=\"prop.type === 'optionsGroup'\" class=\"options-container\">\r\n <div\r\n *ngFor=\"let option of prop.options; let i = index\"\r\n class=\"option-items\"\r\n >\r\n <!-- Option Input -->\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].label\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n class=\"options\"\r\n />\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].value\"\r\n placeholder=\"Value\"\r\n class=\"values\"\r\n />\r\n <!-- Remove Button -->\r\n <div class=\"remove\">\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(prop.options, i)\"></div>\r\n </div>\r\n <!-- Add Button -->\r\n <button\r\n type=\"button\"\r\n class=\"add-btn\"\r\n (click)=\"addOption(prop.options)\"\r\n >\r\n <div class=\"add-varient\">\r\n <span class=\"text-lg\">+</span>\r\n <span>Add Variants</span></div>\r\n </button>\r\n</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"design-footer\">\r\n <button class=\"btn\">Cancel</button>\r\n <button class=\"btn\" (click)=\"save()\">Save</button>\r\n </div>\r\n</details>\r\n</div>\r\n\r\n\r\n</div>\r\n", styles: [".container{position:absolute;right:0;top:0;width:25%}.all-properties{padding:0;margin:-32px -13px 0 0;background-color:#f8fafc;position:relative;top:3px;max-height:549px;overflow-y:auto}.first-properties{padding-top:16px;padding-left:15px}details summary{font-weight:700;color:#1b1b43;cursor:pointer}details[open] summary{padding-bottom:5px;margin-bottom:1rem}label{flex:0 0 120px;color:#b8b8b8;font-size:.875rem;font-weight:500;margin:0;padding:0}input,select{flex:1;background-color:#eaedf1;color:#bebfbf;border-radius:.375rem;padding:.5rem;font-size:.875rem;width:100%;box-sizing:border-box;transition:border-color .2s}input:focus,select:focus{border-color:#1b1b43;outline:none}button{background-color:#eaedf1;color:#6b7280;border:1px solid #D1D5DB;border-radius:.375rem;padding:.5rem;cursor:pointer;transition:all .2s}button:hover{background-color:#e5e7eb}button.selected{background-color:#0b1f34;color:#fff;border-color:#1e90ff}.color-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:50px;height:50px;background-color:transparent;border:none;cursor:pointer}.color-input::-webkit-color-swatch,.color-input::-moz-color-swatch{border-radius:5px;border:none}.inner-content{position:relative;left:30px;width:90%}.label-properties{position:relative;top:-12px;left:-37px}.required-indicator{color:red;margin-left:4px}.toggle-item1{position:relative;left:-94px;width:124px;color:#b8b8b8}.toggle-item2{width:100px;position:relative;top:-24px;left:84px;color:#b8b8b8}.flex-gap-1{display:flex;grid-template-columns:repeat(4,auto)}.help-text,.error-message{font-size:12px;margin-top:4px}.help-text{color:#666}.error-message{color:#ef4444}.read-only{background-color:#f5f5f5;cursor:not-allowed}.font-selection,.font-weight{width:190px}.design-header{padding:17px;background-color:#fff;margin-bottom:2rem}.header-title{font-size:16px;font-weight:500;text-align:center;margin:0 0 20px 5px}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px}.menu-item{flex:1;text-align:center;padding:7px;cursor:pointer;transition:all .3s ease;border-right:2px solid #e9ecef}.menu-item span{color:#656f7b;font-size:1rem}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px;padding:.5rem}.menu-item{flex:1;text-align:center;padding:m;cursor:pointer;transition:all .3s ease;border-right:1px solid #e9ecef}.menu-item:last-child{border-right:none}.menu-item:hover{background-color:#e9ecef;border-radius:4px}.menu-item span{color:#495057;font-size:1rem}.switch{position:relative;display:inline-block;width:40px;height:24px;right:-20px;margin:0 8px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:4px;bottom:4px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(16px)}.font-align{display:flex;gap:2px}.align-btn,.style-btn{width:36px;height:36px;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:4px;cursor:pointer;transition:all .2s}.align-btn:hover,.style-btn:hover{background:#e5e7eb}.align-btn.active,.style-btn.active{background:#202e3a;color:#fff;border-color:#4b5563}.align-btn.active img,.style-btn.active img{filter:brightness(0) invert(1)}.icon-size{width:16px;height:16px}.button-group{display:flex;gap:4px;padding:4px;background:#f9fafb;border-radius:6px}.field-size-controls{display:flex;flex-direction:row;position:relative;gap:13px;font-family:Arial,sans-serif}.size-group{display:flex;align-items:center}.size-label{font-size:15px;color:#000}.value-container{display:flex;height:43px;align-items:center;background-color:#f5f5f5;border-radius:11px;position:relative;right:74px}.font-style{display:flex;gap:1px}.size-input{font-size:15px;border:none;background:transparent;width:46px;text-align:center;outline:none}.size-input:focus{outline:none}.unit{font-size:13px;width:22px;color:#00000080}.file-upload-container{position:relative;margin-bottom:1rem}.file-upload-container input[type=file]{margin-top:.5rem}.text-font-medium{padding-left:15px;padding-bottom:20px}.options-container{display:flex;flex-direction:column;gap:.5rem}.option-item{display:flex;align-items:center;gap:1rem}.option-items{display:flex;gap:20px}.options{width:69px}.values{width:49px}.remove{width:34px;border-radius:50px;height:35px;background-color:#f7eff0}.remove img{position:relative;top:6px;left:9px}.add-btn{background:none;border:none;font-size:1rem;cursor:pointer;display:flex;align-items:center;width:328px;position:relative;right:123px;background-color:#f1f4f7}.add-btn:hover{color:#3182ce}.text-lg{border:1px solid gray;width:22px;border-radius:5px}.add-varient{display:flex;gap:13px;position:relative;left:101px}input{border:1px solid #ccc;padding:.5rem;border-radius:.25rem;width:100%}.space-y-4{position:relative;left:28px}.flex-items-center{display:flex;position:relative;top:2px;margin-bottom:28px}.input-box-field{width:207px}.text-sm{height:30px}.radio-item{position:relative;left:-5px}.flex-gap{display:flex;gap:18px}.design-footer{display:flex;justify-content:center;gap:30px;background-color:#f1f4f7}.btn{width:110px;color:#fff;margin-top:20px;margin-bottom:20px;background-color:#a5adbc}.btn:hover{background-color:#2196f3;color:#fff}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
470
+ }
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, decorators: [{
472
+ type: Component,
473
+ args: [{ selector: 'app-properties', template: "<!-- AP 22JAN25 - Field and Element Properties -->\r\n<!-- properties.component.html -->\r\n<div class=\"container\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n<!-- Design Header Section -->\r\n<div class=\"design-header\">\r\n <h1 class=\"header-title\">Element Properties</h1>\r\n <div class=\"menu-container\">\r\n <div class=\"menu-item\" (click)=\"download()\">\r\n <span >Download</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Start</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Path</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Clone</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- properties.component.html -->\r\n<div class=\"all-properties\">\r\n <div *ngIf=\"errorMessage\" class=\"error-message\">\r\n {{ errorMessage }}\r\n </div>\r\n <!-- Element Properties -->\r\n <details class=\"first-properties\" open>\r\n <summary class=\"text-sm \">Elements Properties</summary>\r\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\r\n <div class=\"flex-items-center\">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"label-properties\">\r\n <!-- Text Input -->\r\n <input *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [class.read-only]=\"selectedElement.readOnly\"\r\n [readonly]=\"selectedElement.readOnly\"\r\n class=\"text-sm1 \"\r\n />\r\n <div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">\r\n {{ selectedElement.helpText }}\r\n </div>\r\n\r\n\r\n <!-- Font Selection -->\r\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'font'\"\r\n class=\"font-selection1\"\r\n [value]=\"selectedElement?.font\"\r\n (change)=\"updateProperty('font', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\r\n {{ option }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n<!-- file -->\r\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\r\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\"\r\n class=\"file \"\r\n[value]=\"selectedElement[prop.key]\"\r\n(change)=\"updateProperty(prop.key, $event.target.value)\">\r\n<option value=\"\">Select file category</option>\r\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n{{ option.label }}\r\n</option>\r\n</select>\r\n\r\n<!-- Font Weight Selection -->\r\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\"\r\n class=\"font-weight1 \"\r\n [value]=\"selectedElement?.fontWeight\"\r\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n <!-- Number Input with Unit -->\r\n <div *ngIf=\"prop.type === 'number'\" class=\"size-controls\">\r\n <div class=\"size-input-group\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [min]=\"prop.min || 1\"\r\n [max]=\"prop.max || 999999\"\r\n class=\"size-value\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle Group -->\r\n<!-- Toggle Group -->\r\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\r\n<div class=\"toggle-item1\">\r\n <span class=\"toggle-label\">Read Only</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.readOnly\"\r\n (change)=\"onToggleChange('readOnly', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n\r\n<div class=\"toggle-item2\">\r\n <span class=\"toggle-label\">Is Hide</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.isHide\"\r\n (change)=\"onToggleChange('isHide', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n</div>\r\n\r\n <!-- Text Align Buttons -->\r\n <div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onAlignSelect(option.value)\"\r\n [class.active]=\"selectedElement?.textAlign === option.value\"\r\n class=\"align-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.key === 'size'\" class=\"size-controls\">\r\n <label>{{ prop.label }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onStyleSelect(option.value)\"\r\n [class.active]=\"isStyleActive(option.value)\"\r\n class=\"style-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n<!-- Field Size Controls -->\r\n<div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Width</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.width\"\r\n (input)=\"updateProperty('width', $event.target.value)\"\r\n class=\"size-input\"\r\n\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Height</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.height\"\r\n (input)=\"updateProperty('height', $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </details>\r\n\r\n <!-- Field Elements Properties -->\r\n<details class=\"second-property\">\r\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\r\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\r\n <div class=\"flex-items-center \">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"input-box-field\">\r\n <!-- Input Box -->\r\n <input\r\n *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n class=\"field-input\"\r\n />\r\n <!-- Radio Group -->\r\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\r\n\r\n\r\n <div class=\"sizes\">\r\n <div class=\"flex-gap\">\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"selectedElement.required\"\r\n (change)=\"onRequiredChange(true)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-label\"\r\n >\r\n Required\r\n </label>\r\n </div>\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"!selectedElement.required\"\r\n (change)=\"onRequiredChange(false)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-sm text-gray-400\"\r\n >\r\n Not Required\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n <!-- Chk Options Group -->\r\n <div *ngIf=\"prop.type === 'optionsGroup'\" class=\"options-container\">\r\n <div\r\n *ngFor=\"let option of prop.options; let i = index\"\r\n class=\"option-items\"\r\n >\r\n <!-- Option Input -->\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].label\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n class=\"options\"\r\n />\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].value\"\r\n placeholder=\"Value\"\r\n class=\"values\"\r\n />\r\n <!-- Remove Button -->\r\n <div class=\"remove\">\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(prop.options, i)\"></div>\r\n </div>\r\n <!-- Add Button -->\r\n <button\r\n type=\"button\"\r\n class=\"add-btn\"\r\n (click)=\"addOption(prop.options)\"\r\n >\r\n <div class=\"add-varient\">\r\n <span class=\"text-lg\">+</span>\r\n <span>Add Variants</span></div>\r\n </button>\r\n</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"design-footer\">\r\n <button class=\"btn\">Cancel</button>\r\n <button class=\"btn\" (click)=\"save()\">Save</button>\r\n </div>\r\n</details>\r\n</div>\r\n\r\n\r\n</div>\r\n", styles: [".container{position:absolute;right:0;top:0;width:25%}.all-properties{padding:0;margin:-32px -13px 0 0;background-color:#f8fafc;position:relative;top:3px;max-height:549px;overflow-y:auto}.first-properties{padding-top:16px;padding-left:15px}details summary{font-weight:700;color:#1b1b43;cursor:pointer}details[open] summary{padding-bottom:5px;margin-bottom:1rem}label{flex:0 0 120px;color:#b8b8b8;font-size:.875rem;font-weight:500;margin:0;padding:0}input,select{flex:1;background-color:#eaedf1;color:#bebfbf;border-radius:.375rem;padding:.5rem;font-size:.875rem;width:100%;box-sizing:border-box;transition:border-color .2s}input:focus,select:focus{border-color:#1b1b43;outline:none}button{background-color:#eaedf1;color:#6b7280;border:1px solid #D1D5DB;border-radius:.375rem;padding:.5rem;cursor:pointer;transition:all .2s}button:hover{background-color:#e5e7eb}button.selected{background-color:#0b1f34;color:#fff;border-color:#1e90ff}.color-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:50px;height:50px;background-color:transparent;border:none;cursor:pointer}.color-input::-webkit-color-swatch,.color-input::-moz-color-swatch{border-radius:5px;border:none}.inner-content{position:relative;left:30px;width:90%}.label-properties{position:relative;top:-12px;left:-37px}.required-indicator{color:red;margin-left:4px}.toggle-item1{position:relative;left:-94px;width:124px;color:#b8b8b8}.toggle-item2{width:100px;position:relative;top:-24px;left:84px;color:#b8b8b8}.flex-gap-1{display:flex;grid-template-columns:repeat(4,auto)}.help-text,.error-message{font-size:12px;margin-top:4px}.help-text{color:#666}.error-message{color:#ef4444}.read-only{background-color:#f5f5f5;cursor:not-allowed}.font-selection,.font-weight{width:190px}.design-header{padding:17px;background-color:#fff;margin-bottom:2rem}.header-title{font-size:16px;font-weight:500;text-align:center;margin:0 0 20px 5px}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px}.menu-item{flex:1;text-align:center;padding:7px;cursor:pointer;transition:all .3s ease;border-right:2px solid #e9ecef}.menu-item span{color:#656f7b;font-size:1rem}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px;padding:.5rem}.menu-item{flex:1;text-align:center;padding:m;cursor:pointer;transition:all .3s ease;border-right:1px solid #e9ecef}.menu-item:last-child{border-right:none}.menu-item:hover{background-color:#e9ecef;border-radius:4px}.menu-item span{color:#495057;font-size:1rem}.switch{position:relative;display:inline-block;width:40px;height:24px;right:-20px;margin:0 8px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:4px;bottom:4px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(16px)}.font-align{display:flex;gap:2px}.align-btn,.style-btn{width:36px;height:36px;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:4px;cursor:pointer;transition:all .2s}.align-btn:hover,.style-btn:hover{background:#e5e7eb}.align-btn.active,.style-btn.active{background:#202e3a;color:#fff;border-color:#4b5563}.align-btn.active img,.style-btn.active img{filter:brightness(0) invert(1)}.icon-size{width:16px;height:16px}.button-group{display:flex;gap:4px;padding:4px;background:#f9fafb;border-radius:6px}.field-size-controls{display:flex;flex-direction:row;position:relative;gap:13px;font-family:Arial,sans-serif}.size-group{display:flex;align-items:center}.size-label{font-size:15px;color:#000}.value-container{display:flex;height:43px;align-items:center;background-color:#f5f5f5;border-radius:11px;position:relative;right:74px}.font-style{display:flex;gap:1px}.size-input{font-size:15px;border:none;background:transparent;width:46px;text-align:center;outline:none}.size-input:focus{outline:none}.unit{font-size:13px;width:22px;color:#00000080}.file-upload-container{position:relative;margin-bottom:1rem}.file-upload-container input[type=file]{margin-top:.5rem}.text-font-medium{padding-left:15px;padding-bottom:20px}.options-container{display:flex;flex-direction:column;gap:.5rem}.option-item{display:flex;align-items:center;gap:1rem}.option-items{display:flex;gap:20px}.options{width:69px}.values{width:49px}.remove{width:34px;border-radius:50px;height:35px;background-color:#f7eff0}.remove img{position:relative;top:6px;left:9px}.add-btn{background:none;border:none;font-size:1rem;cursor:pointer;display:flex;align-items:center;width:328px;position:relative;right:123px;background-color:#f1f4f7}.add-btn:hover{color:#3182ce}.text-lg{border:1px solid gray;width:22px;border-radius:5px}.add-varient{display:flex;gap:13px;position:relative;left:101px}input{border:1px solid #ccc;padding:.5rem;border-radius:.25rem;width:100%}.space-y-4{position:relative;left:28px}.flex-items-center{display:flex;position:relative;top:2px;margin-bottom:28px}.input-box-field{width:207px}.text-sm{height:30px}.radio-item{position:relative;left:-5px}.flex-gap{display:flex;gap:18px}.design-footer{display:flex;justify-content:center;gap:30px;background-color:#f1f4f7}.btn{width:110px;color:#fff;margin-top:20px;margin-bottom:20px;background-color:#a5adbc}.btn:hover{background-color:#2196f3;color:#fff}\n"] }]
474
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.FormBuilderService }], propDecorators: { colorWheel: [{
475
+ type: ViewChild,
476
+ args: ['colorWheel']
477
+ }], selectedElementType: [{
478
+ type: Input
479
+ }] } });
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxTQUFTLEVBQTRCLEtBQUssRUFBaUMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFRckgsTUFBTSxPQUFPLG1CQUFtQjtJQWlZVjtJQUF5QjtJQWhZN0Msd0JBQXdCO0lBQ0MsVUFBVSxDQUFnQztJQUMzRCxHQUFHLENBQTJCO0lBRXRDLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFFNUIsb0JBQW9CLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDbEMsaUNBQWlDO0lBQ3hCLG1CQUFtQixHQUFXLEVBQUUsQ0FBQztJQUMxQyxhQUFhLEdBQVcsWUFBWSxDQUFDLENBQUUsb0JBQW9CO0lBQzNELGNBQWMsR0FBYSxFQUFFLENBQUMsQ0FBRSxvREFBb0Q7SUFDcEYsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUUxQixlQUFlLEdBQVEsSUFBSSxDQUFDLENBQUUsK0JBQStCO0lBSTdELGNBQWMsQ0FBQyxRQUFnQixFQUFFLEtBQVU7UUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMs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O1FBQ3JDLENBQUMsRUFDRCxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7d0dBcGZVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHdOQ1ZoQyxrOVVBNFRBOzs0RkRsVGEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQjtnSEFNRCxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBT2QsbUJBQW1CO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVAgMjJKQU4yNVxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0tYnVpbGRlci5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXByb3BlcnRpZXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvcGVydGllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gc2VsZWN0ZWRFbGVtZW50OiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnY29sb3JXaGVlbCcpIGNvbG9yV2hlZWw6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcblxyXG4gIHNlbGVjdGVkT3B0aW9uOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgc2VsZWN0ZWRFbGVtZW50SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIC8vIEBJbnB1dCgpIHNlbGVjdGVkRWxlbWVudDogYW55O1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkRWxlbWVudFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkQWxpZ246IHN0cmluZyA9ICdhbGlnbi1sZWZ0JzsgIC8vIEFkZCB0aGlzIHByb3BlcnR5XHJcbiAgc2VsZWN0ZWRTdHlsZXM6IHN0cmluZ1tdID0gW107ICAvLyBVc2luZyBhcnJheSBzaW5jZSBtdWx0aXBsZSBzdHlsZXMgY2FuIGJlIHNlbGVjdGVkXHJcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgc2VsZWN0ZWRFbGVtZW50OiBhbnkgPSBudWxsOyAgLy8gUmVjZWl2ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudFxyXG5cclxuXHJcblxyXG4gIG9uVG9nZ2xlQ2hhbmdlKHByb3BlcnR5OiBzdHJpbmcsIGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgY29uc3QgdXBkYXRlID0geyBbcHJvcGVydHldOiB2YWx1ZSB9O1xyXG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgsIHVwZGF0ZSk7XHJcblxyXG4gICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgZGlyZWN0bHkgZm9yIGltbWVkaWF0ZSBVSSBmZWVkYmFja1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFtwcm9wZXJ0eV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVQcm9wZXJ0aWVzKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFJlc2V0IGFsaWdubWVudCBhbmQgc3R5bGVzIGlmIHN3aXRjaGluZyBlbGVtZW50c1xyXG4gICAgdGhpcy5zZWxlY3RlZEFsaWduID0gJ2FsaWduLWxlZnQnO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0eWxlcyA9IFtdO1xyXG5cclxuICAgIC8vIEZldGNoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IHR5cGVcclxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoKTtcclxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVydGllcyBhcmUgZHluYW1pY2FsbHkgdXBkYXRlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25BbGlnblNlbGVjdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudGV4dEFsaWduID0gdmFsdWU7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBTZWxlY3RlZCBhbGlnbm1lbnQ6ICR7dmFsdWV9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb25TdHlsZVNlbGVjdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBzdHlsZXMgYXJyYXkgaWYgaXQgZG9lc24ndCBleGlzdFxyXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzIHx8IFtdO1xyXG5cclxuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdHlsZSBpcyBzZWxlY3RlZCBhdCBhIHRpbWVcclxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlcyA9IFt2YWx1ZV07XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgc3R5bGVzOicsIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlcyk7XHJcbn1cclxuXHJcblxyXG4gIGlzU3R5bGVBY3RpdmUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50Py5zdHlsZXM/LmluY2x1ZGVzKHZhbHVlKSB8fCBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBlbGVtZW50UHJvcGVydGllcyA9IHtcclxuXHJcbiAgICAgICAgLy8gQWRkIG90aGVyIGVsZW1lbnQgdHlwZXMgaGVyZSBzaW1pbGFybHlcclxuICAgJ1RleHQnOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG5cclxuICAgICAgICAvLyBxdWVzdGlvblRleHQgLSBMYWJlbC1mb2xsb3cgYWxsIGVsZW1lbnQgcHJvcGVydGllc1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxyXG5cclxuICAgICAgICAvLyBxdWVzdGlvbiAtIFBsYWNlaG9sZGVyLWZvbGxvdyBhbGwgZWxlbWVudCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgeyBsYWJlbDogJ3BsYWNlaG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG5cclxuICAgICAgICAvLyBlcnJvck1lc3NhZ2UgLSBFcnJvciBNc2ctZm9sbG93IGFsbCBlbGVtZW50IHByb3BlcnRpZXNcclxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1zZycgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRm9udCcsIHR5cGU6ICdzZWxlY3QnLCAga2V5OiAnZm9udCcgLFxyXG4gICAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ10gfSxcclxuICAgICAgICB7IGxhYmVsOiAnV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsa2V5OiAnZm9udFdlaWdodCcsXHJcbiAgICAgICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XHJcbiAgICAgICAgICBdIH0sXHJcbiAgICAgICAgLy8geyBsYWJlbDogJ1NpemUnLCB1bml0OiAnUFgnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAnc2l6ZScgIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0FsaWduJywgdHlwZTogJ2FsaWduJywga2V5OiAndGV4dEFsaWduJyxcclxuICAgICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgICAgeyB2YWx1ZTogJ2xlZnQnLCBpY29uOiAndGV4dGFsaWduLWxlZnQnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICdjZW50ZXInLCBpY29uOiAnYWxpZ24tY2VudGVyJyB9LFxyXG4gICAgICAgICAgICB7IHZhbHVlOiAncmlnaHQnLCBpY29uOiAnYWxpZ24tcmlnaHQnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICdqdXN0aWZ5bGVmdCcsIGljb246ICdhbGlnbi1qdXN0aWZ5bGVmdCcgfSxcclxuICAgICAgICAgICAgeyB2YWx1ZTogJ2p1c3RpZnlyaWdodCcsIGljb246ICdhbGlnbi1qdXN0aWZ5cmlnaHQnIH1cclxuXHJcbiAgICAgICAgICBdIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgdHlwZTogJ3N0eWxlJyxrZXk6ICdzdHlsZXMnLFxyXG5cclxuICAgICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgICAgeyB2YWx1ZTogJ2l0YWxpYycsIGljb246ICdpdGFsaWMnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICdib2xkJywgaWNvbjogJ2JvbGQnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICd1bmRlcmxpbmUnLCBpY29uOiAndW5kZXJsaW5lJyB9LFxyXG4gICAgICAgICAgICB7IHZhbHVlOiAndGV4dGljb24nLCBpY29uOiAndGV4dGljb24nIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICdjYXBpdGFsaXplJywgaWNvbjogJ2NhcGl0YWxpemUnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICdyZXNpemUnLCBpY29uOiAncmVzaXplJyB9XHJcblxyXG5cclxuICAgICAgICAgIF0gfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfVxyXG5cclxuICAgICAgXSxcclxuICAgICAgZmllbGRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsa2V5OiAnZGVmYXVsdFZhbHVlJyAgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgICcsIHR5cGU6ICd0ZXh0JyB9XHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICAnQ2hlY2tCb3gnOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTXNnJyB9LFxyXG4gICAgICBdLFxyXG4gICAgICBmaWVsZFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6ICdDaGsgT3B0aW9ucycsXHJcbiAgICAgICAgICB0eXBlOiAnb3B0aW9uc0dyb3VwJyxcclxuICAgICAgICAgIGtleTogJ2Noa09wdGlvbnMnLFxyXG4gICAgICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiAnT3B0aW9uIDEnLCB2YWx1ZTogJycsIHR5cGU6ICd0ZXh0Jywga2V5OiAnb3B0aW9uMScgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBhZGRPcHRpb25MYWJlbDogJ0FkZCBWYXJpYW50JywgLy8gVGV4dCBmb3IgdGhlIHBsdXMgaWNvblxyXG4gICAgICAgICAgaWNvbjogJ3BsdXMnIC8vIEljb24gZm9yIGFkZGluZyBvcHRpb25zXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICBdXHJcbiAgICB9LFxyXG5cclxuICAgICdDYWxlbmRhcic6IHtcclxuICAgICAgZWxlbWVudFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpZWxkUHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAgJ1RpbWUnOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdsYWJlbCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncGxhY2Vob2xkZXInfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpZWxkUHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAgJ0VtYWlsJzoge1xyXG4gICAgICBlbGVtZW50UHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnaGVscFRleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdmaWVsZFNpemUnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1zZycgfSxcclxuICAgICAgXSxcclxuICAgICAgZmllbGRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9XHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICAgICdGaWxlJzoge1xyXG4gICAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvblRleHQnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2hlbHBUZXh0JyB9LFxyXG5cclxuICAgICAgICAgIHsgbGFiZWw6ICdTdXBwb3J0IFR5cGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnc3VwcG9ydFR5cGUnLCBvcHRpb25zOiBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJbWFnZXMgKEpQRUcsIFBORywgR0lGKScsIHZhbHVlOiAnaW1hZ2UvKicsIGV4dGVuc2lvbnM6IFsnLmpwZycsJy5qcGVnJywnLnBuZycsJy5naWYnXSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiAnQXVkaW8gKE1QMywgV0FWLCBBSUZGKScsIHZhbHVlOiAnYXVkaW8vKicsIGV4dGVuc2lvbnM6IFsnLm1wMycsJy53YXYnLCcuYWlmZiddIH0sXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdWaWRlbyAoTVA0LCBBVkksIEhFVkMpJywgdmFsdWU6ICd2aWRlby8qJywgZXh0ZW5zaW9uczogWycubXA0JywnLmF2aScsJy5oZXZjJ10gfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogJ0RvY3VtZW50cyAoRE9DLCBET0NYLCBQUFQsIFBERiknLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL3BkZixhcHBsaWNhdGlvbi9tc3dvcmQsYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQsYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLCBleHRlbnNpb25zOiBbJy5kb2MnLCcuZG9jeCcsJy5wcHQnLCcucGRmJ10gfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogJ0V4ZWN1dGFibGVzIChFWEUsIEJBRCwgU0gpJywgdmFsdWU6ICdhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQsYXBwbGljYXRpb24veC1zaCcsIGV4dGVuc2lvbnM6IFsnLmV4ZScsJy5iYWQnLCcuc2gnXSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiAnQXJjaGl2ZXMgKFpJUCwgUkFSLCBHaXQtaHViKScsIHZhbHVlOiAnYXBwbGljYXRpb24vemlwLGFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQsYXBwbGljYXRpb24veC1naXQnLCBleHRlbnNpb25zOiBbJy56aXAnLCcucmFyJywnLmdpdCddIH1cclxuICAgICAgICAgIF19LFxyXG4gICAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2Vycm9yTXNnJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZmllbGRQcm9wczogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxyXG4gICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgJ0xpc3QnOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyAsIGtleTogJ3F1ZXN0aW9uJ30sXHJcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTXNnJyB9LFxyXG4gICAgICBdLFxyXG4gICAgICBmaWVsZFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH1cclxuICAgICAgXVxyXG4gICAgfSwgJ1RleHRBcmVhJzoge1xyXG4gICAgICBlbGVtZW50UHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnaGVscFRleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdmaWVsZFNpemUnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1zZycgfSxcclxuICAgICAgXSxcclxuICAgICAgZmllbGRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycsIGtleTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdkZWZhdWx0VmFsdWUnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH1cclxuICAgICAgXVxyXG4gICAgfSwnTnVtYmVycyc6IHtcclxuICAgICAgZWxlbWVudFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpZWxkUHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICBdXHJcbiAgICB9LCdEcm9wZG93bic6IHtcclxuICAgICAgZWxlbWVudFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpZWxkUHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsYWJlbDogJ0NoayBPcHRpb25zJyxcclxuICAgICAgICAgIHR5cGU6ICdvcHRpb25zR3JvdXAnLFxyXG4gICAgICAgICAga2V5OiAnY2hrT3B0aW9ucycsXHJcbiAgICAgICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdPcHRpb24gMScsIHZhbHVlOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdvcHRpb24xJyB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIGFkZE9wdGlvbkxhYmVsOiAnQWRkIFZhcmlhbnQnLCAvLyBUZXh0IGZvciB0aGUgcGx1cyBpY29uXHJcbiAgICAgICAgICBpY29uOiAncGx1cycgLy8gSWNvbiBmb3IgYWRkaW5nIG9wdGlvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG5cclxuICAgICAgXVxyXG4gICAgfSwnSW1hZ2UnOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyAsIGtleTogJ3F1ZXN0aW9uJ30sXHJcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTXNnJyB9LFxyXG4gICAgICBdLFxyXG4gICAgICBmaWVsZFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH1cclxuICAgICAgXVxyXG4gICAgfSwnUmFkaW8nOiB7XHJcbiAgZWxlbWVudFByb3BzOiBbXHJcbiAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcclxuICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uJyB9LFxyXG4gICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnaGVscFRleHQnIH0sXHJcbiAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG4gICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgXSxcclxuICBmaWVsZFByb3BzOiBbXHJcbiAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ1JhZGlvIE9wdGlvbnMnLCAvLyBVcGRhdGVkIGxhYmVsIHRvIHJlZmxlY3QgcmFkaW8gY29udGV4dFxyXG4gICAgICB0eXBlOiAnb3B0aW9uc0dyb3VwJyxcclxuICAgICAga2V5OiAncmFkaW9PcHRpb25zJywgLy8gVXBkYXRlZCBrZXkgZm9yIHJhZGlvIGNvbnRleHRcclxuICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdPcHRpb24gMScsIHZhbHVlOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdvcHRpb24xJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdPcHRpb24gMicsIHZhbHVlOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdvcHRpb24yJyB9LFxyXG4gICAgICBdLFxyXG4gICAgICBhZGRPcHRpb25MYWJlbDogJ0FkZCBPcHRpb24nLCAvLyBVcGRhdGVkIGxhYmVsIGZvciBhZGQgYnV0dG9uXHJcbiAgICAgIGljb246ICdwbHVzJywgLy8gSWNvbiBmb3IgYWRkaW5nIG9wdGlvbnNcclxuICAgIH0sXHJcbiAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgXVxyXG59XHJcbiwnQm9vayc6IHtcclxuICAgICAgZWxlbWVudFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcclxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnZmllbGRTaXplJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNc2cnIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpZWxkUHJvcHM6IFtcclxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfVxyXG4gICAgICBdXHJcbiAgICB9LCdCdXR0b24nOiB7XHJcbiAgICAgIGVsZW1lbnRQcm9wczogW1xyXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyAsIGtleTogJ3F1ZXN0aW9uJ30sXHJcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ2ZpZWxkU2l6ZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTXNnJyB9LFxyXG4gICAgICBdLFxyXG4gICAgICBmaWVsZFByb3BzOiBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH1cclxuICAgICAgXVxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQscHJpdmF0ZSBmb3JtQnVpbGRlclNlcnZpY2U6IEZvcm1CdWlsZGVyU2VydmljZSkge31cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2VsZWN0ZWRFbGVtZW50JC5zdWJzY3JpYmUoaW5kZXggPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4ID0gaW5kZXg7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBlbGVtZW50OicsIGVsZW1lbnRzKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgdmFsaWRhdGVJbnB1dCh2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlID09PSAnbGFiZWwnIHx8IHR5cGUgPT09ICdwbGFjZWhvbGRlcicpIHtcclxuICAgICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTlcXHNdKiQvO1xyXG4gICAgICBpZiAoIXJlZ2V4LnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnT25seSBsZXR0ZXJzIGFuZCBudW1iZXJzIGFyZSBhbGxvd2VkJztcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCA+PSAwKSB7XHJcbiAgICAgIGlmIChrZXkgPT09ICdxdWVzdGlvblRleHQnIHx8IGtleSA9PT0gJ3F1ZXN0aW9uJykge1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZUlucHV0KHZhbHVlLCBrZXkpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoa2V5ID09PSAnZm9udFdlaWdodCcpIHtcclxuICAgICAgICAvLyBFeHRyYWN0IGp1c3QgdGhlIG51bWJlciB2YWx1ZSBmcm9tIHRoZSBvcHRpb25cclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCctJylbMF07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGtleSA9PT0gJ3N0eWxlcycpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50U3R5bGVzID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzIHx8IFtdO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ2NhcGl0YWxpemUnIHx8IHZhbHVlID09PSAnbG93ZXJjYXNlJykge1xyXG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvcHBvc2l0ZSBjYXNlIGlmIGl0IGV4aXN0c1xyXG4gICAgICAgICAgY29uc3Qgb3Bwb3NpdGVTdHlsZSA9IHZhbHVlID09PSAnY2FwaXRhbGl6ZScgPyAnbG93ZXJjYXNlJyA6ICdjYXBpdGFsaXplJztcclxuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkU3R5bGVzID0gY3VycmVudFN0eWxlcy5maWx0ZXIocyA9PiBzICE9PSBvcHBvc2l0ZVN0eWxlKTtcclxuICAgICAgICAgIHZhbHVlID0gY3VycmVudFN0eWxlcy5pbmNsdWRlcyh2YWx1ZSlcclxuICAgICAgICAgICAgPyBmaWx0ZXJlZFN0eWxlcy5maWx0ZXIocyA9PiBzICE9PSB2YWx1ZSlcclxuICAgICAgICAgICAgOiBbLi4uZmlsdGVyZWRTdHlsZXMsIHZhbHVlXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gVG9nZ2xlIG90aGVyIHN0eWxlc1xyXG4gICAgICAgICAgdmFsdWUgPSBjdXJyZW50U3R5bGVzLmluY2x1ZGVzKHZhbHVlKVxyXG4gICAgICAgICAgICA/IGN1cnJlbnRTdHlsZXMuZmlsdGVyKHMgPT4gcyAhPT0gdmFsdWUpXHJcbiAgICAgICAgICAgIDogWy4uLmN1cnJlbnRTdHlsZXMsIHZhbHVlXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgW2tleV06IHZhbHVlIH07XHJcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCwgdXBkYXRlKTtcclxuXHJcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZvbnQgYW5kIGZvbnQgd2VpZ2h0XHJcbiAgICAgIGlmIChrZXkgPT09ICdmb250Jykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmZvbnQgPSB2YWx1ZTsgLy8gRGlyZWN0bHkgdXBkYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50J3MgZm9udCBwcm9wZXJ0eVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb25SZXF1aXJlZENoYW5nZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XHJcbiAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgYXN0ZXJpc2tzIGZpcnN0XHJcbiAgICAgIGxldCBsYWJlbCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50LmxhYmVsLnJlcGxhY2UoL1xccypcXCorJC8sICcnKTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgbGFiZWwgPSBgJHtsYWJlbH0gKmA7IC8vIEFkZCBzaW5nbGUgYXN0ZXJpc2tcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5KCdsYWJlbCcsIGxhYmVsKTtcclxuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgncmVxdWlyZWQnLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50KSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzW3RoaXMuc2VsZWN0ZWRFbGVtZW50LnR5cGVdO1xyXG4gIH1cclxuXHJcbiAgLy8gb3BlbkNvbG9yUGlja2VyKHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcclxuICAvLyAgIC8vIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgYnJvd3NlcidzIG5hdGl2ZSBjb2xvciBwaWNrZXI6XHJcbiAgLy8gICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgLy8gICBpbnB1dC50eXBlID0gJ2NvbG9yJztcclxuICAvLyAgIGlucHV0LnZhbHVlID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRbcHJvcGVydHlLZXldO1xyXG4gIC8vICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGU6IGFueSkgPT4ge1xyXG4gIC8vICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5KHByb3BlcnR5S2V5LCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIGlucHV0LmNsaWNrKCk7XHJcbiAgLy8gfVxyXG4gICAvLyBGdW5jdGlvbiB0byBhZGQgYSBuZXcgb3B0aW9uIHRvIHByb3Agb3B0aW9uc1xyXG4gICBhZGRPcHRpb24ob3B0aW9uczogYW55W10pIHtcclxuICAgIG9wdGlvbnMucHVzaCh7IGxhYmVsOiAnJywgdmFsdWU6ICcnIH0pO1xyXG4gIH1cclxuLy8gRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBmcm9tIHByb3Agb3B0aW9uc1xyXG5yZW1vdmVPcHRpb24ob3B0aW9uczogYW55W10sIGluZGV4OiBudW1iZXIpIHtcclxuICAgIG9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcbiAgZG93bmxvYWQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnUXVlc3Rpb24gQm9vazonLCB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XHJcblxyXG4gIH1cclxuICBzYXZlKCkge1xyXG4gICAgY29uc3QgYXBpVVJMID0gJ2h0dHBzOi8vZGV2LWFwaS5yYW5nZXJmdXNpb24uY29tL254dC8nO1xyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpVVJMLCB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnUmVzcG9uc2U6JywgcmVzcG9uc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPCEtLSBBUCAyMkpBTjI1IC0gRmllbGQgYW5kIEVsZW1lbnQgUHJvcGVydGllcyAtLT5cclxuPCEtLSBwcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIC0tPlxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86MzAwLDQwMCw1MDAmZGlzcGxheT1zd2FwXCIgcmVsPVwic3R5bGVzaGVldFwiPlxyXG48IS0tIERlc2lnbiBIZWFkZXIgU2VjdGlvbiAtLT5cclxuPGRpdiBjbGFzcz1cImRlc2lnbi1oZWFkZXJcIj5cclxuICA8aDEgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5FbGVtZW50IFByb3BlcnRpZXM8L2gxPlxyXG4gIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbVwiIChjbGljayk9XCJkb3dubG9hZCgpXCI+XHJcbiAgICAgIDxzcGFuID5Eb3dubG9hZDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbVwiPlxyXG4gICAgICA8c3Bhbj5TdGFydDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbVwiPlxyXG4gICAgICA8c3Bhbj5QYXRoPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCI+XHJcbiAgICAgIDxzcGFuPkNsb25lPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBwcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIC0tPlxyXG48ZGl2IGNsYXNzPVwiYWxsLXByb3BlcnRpZXNcIj5cclxuICA8ZGl2ICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XHJcbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPCEtLSBFbGVtZW50IFByb3BlcnRpZXMgLS0+XHJcbiAgPGRldGFpbHMgY2xhc3M9XCJmaXJzdC1wcm9wZXJ0aWVzXCIgb3Blbj5cclxuICAgIDxzdW1tYXJ5IGNsYXNzPVwidGV4dC1zbSBcIj5FbGVtZW50cyBQcm9wZXJ0aWVzPC9zdW1tYXJ5PlxyXG4gICAgPGRpdiBjbGFzcz1cImlubmVyLWNvbnRlbnRcIiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKS5lbGVtZW50UHJvcHNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1wcm9wZXJ0aWVzXCI+XHJcbiAgICAgICAgICAgIDwhLS0gVGV4dCBJbnB1dCAtLT5cclxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlUHJvcGVydHkocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJlYWQtb25seV09XCJzZWxlY3RlZEVsZW1lbnQucmVhZE9ubHlcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic2VsZWN0ZWRFbGVtZW50LnJlYWRPbmx5XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtMSBcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2hlbHBUZXh0JyAmJiBzZWxlY3RlZEVsZW1lbnQuaGVscFRleHRcIiBjbGFzcz1cImhlbHAtdGV4dFwiPlxyXG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkRWxlbWVudC5oZWxwVGV4dCB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICA8IS0tIEZvbnQgU2VsZWN0aW9uIC0tPlxyXG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdmb250J1wiIGNsYXNzPVwiZm9udC1zZWxlY3Rpb25cIj5cclxuICA8IS0tIDxsYWJlbD57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD4gLS0+XHJcbiAgPHNlbGVjdFxyXG4gICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wLmtleSA9PT0gJ2ZvbnQnXCJcclxuICAgIGNsYXNzPVwiZm9udC1zZWxlY3Rpb24xXCJcclxuICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmZvbnRcIlxyXG4gICAgKGNoYW5nZSk9XCJ1cGRhdGVQcm9wZXJ0eSgnZm9udCcsICRldmVudC50YXJnZXQudmFsdWUpXCI+XHJcbiAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxyXG4gICAgICB7eyBvcHRpb24gfX1cclxuICAgIDwvb3B0aW9uPlxyXG4gIDwvc2VsZWN0PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gZmlsZSAtLT5cclxuPCEtLSBBZGQgdGhpcyBpbnNpZGUgdGhlIGVsZW1lbnRQcm9wcyBsb29wIHdoZXJlIG90aGVyIGlucHV0cyBhcmUgcmVuZGVyZWQgLS0+XHJcbjxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnICYmIHByb3Aua2V5ID09PSAnc3VwcG9ydFR5cGUnXCJcclxuIGNsYXNzPVwiZmlsZSBcIlxyXG5bdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiXHJcbihjaGFuZ2UpPVwidXBkYXRlUHJvcGVydHkocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XHJcbjxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgZmlsZSBjYXRlZ29yeTwvb3B0aW9uPlxyXG48b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG57eyBvcHRpb24ubGFiZWwgfX1cclxuPC9vcHRpb24+XHJcbjwvc2VsZWN0PlxyXG5cclxuPCEtLSBGb250IFdlaWdodCBTZWxlY3Rpb24gLS0+XHJcbjxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRXZWlnaHQnXCIgY2xhc3M9XCJmb250LXdlaWdodFwiPlxyXG4gIDwhLS0gPGxhYmVsPnt7IHByb3AubGFiZWwgfX08L2xhYmVsPiAtLT5cclxuICA8c2VsZWN0XHJcbiAgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnICYmIHByb3Aua2V5ID09PSAnZm9udFdlaWdodCdcIlxyXG4gICAgY2xhc3M9XCJmb250LXdlaWdodDEgXCJcclxuICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmZvbnRXZWlnaHRcIlxyXG4gICAgKGNoYW5nZSk9XCJ1cGRhdGVQcm9wZXJ0eSgnZm9udFdlaWdodCcsICRldmVudC50YXJnZXQudmFsdWUpXCI+XHJcbiAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgIDwvb3B0aW9uPlxyXG4gIDwvc2VsZWN0PlxyXG48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IHdpdGggVW5pdCAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ251bWJlcidcIiBjbGFzcz1cInNpemUtY29udHJvbHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2l6ZS1pbnB1dC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVByb3BlcnR5KHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5dPVwicHJvcC5taW4gfHwgMVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhdPVwicHJvcC5tYXggfHwgOTk5OTk5XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaXplLXZhbHVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpemUtdW5pdFwiPnt7IHByb3AudW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgIDwhLS0gVG9nZ2xlIEdyb3VwIC0tPlxyXG48IS0tIFRvZ2dsZSBHcm91cCAtLT5cclxuPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RvZ2dsZUdyb3VwJ1wiIGNsYXNzPVwidG9nZ2xlLWdyb3VwXCI+XHJcbjxkaXYgY2xhc3M9XCJ0b2dnbGUtaXRlbTFcIj5cclxuICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPlJlYWQgT25seTwvc3Bhbj5cclxuICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2hcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQ/LnJlYWRPbmx5XCJcclxuICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZUNoYW5nZSgncmVhZE9ubHknLCAkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNsaWRlclwiPjwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0b2dnbGUtaXRlbTJcIj5cclxuICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPklzIEhpZGU8L3NwYW4+XHJcbiAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50Py5pc0hpZGVcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlQ2hhbmdlKCdpc0hpZGUnLCAkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNsaWRlclwiPjwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRleHQgQWxpZ24gQnV0dG9ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2FsaWduJ1wiY2xhc3M9XCJmb250LWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWxpZ25TZWxlY3Qob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkRWxlbWVudD8udGV4dEFsaWduID09PSBvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhbGlnbi1idG5cIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cIicuLi9hc3NldHMvaWNvbnMvJyArIG9wdGlvbi5pY29uICsgJy5zdmcnXCJcclxuICAgICAgICAgICAgICAgICAgW2FsdF09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tc2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdzaXplJ1wiIGNsYXNzPVwic2l6ZS1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIlxyXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVByb3BlcnR5KHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNpemUtaW5wdXRcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaXplLXVuaXRcIj57eyBwcm9wLnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdHlsZSdcIiAgY2xhc3M9XCJmb250LXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3R5bGVTZWxlY3Qob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzU3R5bGVBY3RpdmUob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN0eWxlLWJ0blwiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwib3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiJy4uL2Fzc2V0cy9pY29ucy8nICsgb3B0aW9uLmljb24gKyAnLnN2ZydcIlxyXG4gICAgICAgICAgICAgICAgICBbYWx0XT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1zaXplXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuPCEtLSBGaWVsZCBTaXplIENvbnRyb2xzIC0tPlxyXG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdmaWVsZFNpemUnXCIgY2xhc3M9XCJmaWVsZC1zaXplLWNvbnRyb2xzXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNpemUtZ3JvdXBcIj5cclxuICAgIDxsYWJlbCAgY2xhc3M9XCJzaXplLWxhYmVsXCI+V2lkdGg8L2xhYmVsPlxyXG4gICAgPGRpdiBjbGFzcz1cInZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py53aWR0aFwiXHJcbiAgICAgIChpbnB1dCk9XCJ1cGRhdGVQcm9wZXJ0eSgnd2lkdGgnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgIGNsYXNzPVwic2l6ZS1pbnB1dFwiXHJcblxyXG4gICAgLz5cclxuICAgIDxzcGFuIGNsYXNzPVwidW5pdFwiPlBYPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdmaWVsZFNpemUnXCIgY2xhc3M9XCJmaWVsZC1zaXplLWNvbnRyb2xzXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2l6ZS1ncm91cFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJzaXplLWxhYmVsXCI+SGVpZ2h0PC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py5oZWlnaHRcIlxyXG4gICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVByb3BlcnR5KCdoZWlnaHQnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cInNpemUtaW5wdXRcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ1bml0XCI+UFg8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2RldGFpbHM+XHJcblxyXG4gIDwhLS0gRmllbGQgRWxlbWVudHMgUHJvcGVydGllcyAtLT5cclxuPGRldGFpbHMgY2xhc3M9XCJzZWNvbmQtcHJvcGVydHlcIj5cclxuICA8c3VtbWFyeSBjbGFzcz1cInRleHQtZm9udC1tZWRpdW1cIj5GaWVsZCBFbGVtZW50cyBQcm9wZXJ0aWVzPC9zdW1tYXJ5PlxyXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTRcIiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcCBvZiBnZXRQcm9wZXJ0aWVzKCkuZmllbGRQcm9wc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC1pdGVtcy1jZW50ZXIgXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWwgfX08L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ib3gtZmllbGRcIj5cclxuICAgICAgICAgIDwhLS0gSW5wdXQgQm94IC0tPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPCEtLSBSYWRpbyBHcm91cCAtLT5cclxuPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiIGNsYXNzPVwicmFkaW8taXRlbVwiPlxyXG5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzaXplc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ2FwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1pdGVtc1wiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInJhZGlvXCJcclxuICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50LnJlcXVpcmVkXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJlcXVpcmVkQ2hhbmdlKHRydWUpXCJcclxuICAgICAgbmFtZT1cInJlcXVpcmVkXCJcclxuICAgICAgY2xhc3M9XCJyYWRpby1pbnB1dFwiXHJcbiAgICAvPlxyXG4gICAgICA8bGFiZWxcclxuICAgICAgICBjbGFzcz1cInRleHQtbGFiZWxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgUmVxdWlyZWRcclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtaXRlbXNcIj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgIFtjaGVja2VkXT1cIiFzZWxlY3RlZEVsZW1lbnQucmVxdWlyZWRcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uUmVxdWlyZWRDaGFuZ2UoZmFsc2UpXCJcclxuICAgICAgbmFtZT1cInJlcXVpcmVkXCJcclxuICAgICAgY2xhc3M9XCJyYWRpby1pbnB1dFwiXHJcbiAgICAvPlxyXG4gICAgICA8bGFiZWxcclxuICAgICAgICBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTQwMFwiXHJcbiAgICAgID5cclxuICAgICAgICBOb3QgUmVxdWlyZWRcclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPC9kaXY+XHJcbiA8IS0tIENoayBPcHRpb25zIEdyb3VwIC0tPlxyXG4gPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ29wdGlvbnNHcm91cCdcIiBjbGFzcz1cIm9wdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgPGRpdlxyXG4gICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgY2xhc3M9XCJvcHRpb24taXRlbXNcIlxyXG4gID5cclxuICAgIDwhLS0gT3B0aW9uIElucHV0IC0tPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgWyhuZ01vZGVsKV09XCJwcm9wLm9wdGlvbnNbaV0ubGFiZWxcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbiB7eyBpICsgMSB9fVwiXHJcbiAgICAgIGNsYXNzPVwib3B0aW9uc1wiXHJcbiAgICAvPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgWyhuZ01vZGVsKV09XCJwcm9wLm9wdGlvbnNbaV0udmFsdWVcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIlZhbHVlXCJcclxuICAgICAgY2xhc3M9XCJ2YWx1ZXNcIlxyXG4gICAgLz5cclxuICAgIDwhLS0gUmVtb3ZlIEJ1dHRvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJyZW1vdmVcIj5cclxuICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24ocHJvcC5vcHRpb25zLCBpKVwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gQWRkIEJ1dHRvbiAtLT5cclxuICA8YnV0dG9uXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIGNsYXNzPVwiYWRkLWJ0blwiXHJcbiAgICAoY2xpY2spPVwiYWRkT3B0aW9uKHByb3Aub3B0aW9ucylcIlxyXG4gID5cclxuICA8ZGl2IGNsYXNzPVwiYWRkLXZhcmllbnRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZ1wiPis8L3NwYW4+XHJcbiAgICA8c3Bhbj5BZGQgVmFyaWFudHM8L3NwYW4+PC9kaXY+XHJcbiAgPC9idXR0b24+XHJcbjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkZXNpZ24tZm9vdGVyXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cInNhdmUoKVwiPlNhdmU8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kZXRhaWxzPlxyXG48L2Rpdj5cclxuXHJcblxyXG48L2Rpdj5cclxuIl19