@fovestta2/web-angular 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2022/lib/add-update-form/add-update-form.component.mjs +1044 -0
  2. package/esm2022/lib/fv-controls.module.mjs +16 -4
  3. package/esm2022/lib/fv-dropdown/fv-dropdown.component.mjs +116 -17
  4. package/esm2022/lib/fv-entry-field/fv-entry-field.component.mjs +29 -3
  5. package/esm2022/lib/fv-esi-field/fv-esi-field.component.mjs +63 -0
  6. package/esm2022/lib/fv-iban-field/fv-iban-field.component.mjs +63 -0
  7. package/esm2022/lib/fv-ifsc-field/fv-ifsc-field.component.mjs +63 -0
  8. package/esm2022/lib/fv-micr-field/fv-micr-field.component.mjs +63 -0
  9. package/esm2022/lib/fv-name-code/fv-name-code.component.mjs +273 -0
  10. package/esm2022/lib/fv-pf-field/fv-pf-field.component.mjs +63 -0
  11. package/esm2022/lib/fv-phone-field/fv-phone-field.component.mjs +105 -0
  12. package/esm2022/lib/fv-radio-group/fv-radio-group.component.mjs +3 -3
  13. package/esm2022/lib/fv-uan-field/fv-uan-field.component.mjs +65 -0
  14. package/esm2022/lib/query-form/query-form.component.mjs +569 -0
  15. package/esm2022/public-api.mjs +15 -5
  16. package/fesm2022/fovestta2-web-angular.mjs +2492 -88
  17. package/fesm2022/fovestta2-web-angular.mjs.map +1 -1
  18. package/lib/add-update-form/add-update-form.component.d.ts +102 -0
  19. package/lib/fv-controls.module.d.ts +3 -1
  20. package/lib/fv-dropdown/fv-dropdown.component.d.ts +14 -2
  21. package/lib/fv-entry-field/fv-entry-field.component.d.ts +4 -1
  22. package/lib/fv-esi-field/fv-esi-field.component.d.ts +21 -0
  23. package/lib/fv-iban-field/fv-iban-field.component.d.ts +21 -0
  24. package/lib/fv-ifsc-field/fv-ifsc-field.component.d.ts +21 -0
  25. package/lib/fv-micr-field/fv-micr-field.component.d.ts +21 -0
  26. package/lib/fv-name-code/fv-name-code.component.d.ts +41 -0
  27. package/lib/fv-pf-field/fv-pf-field.component.d.ts +21 -0
  28. package/lib/fv-phone-field/fv-phone-field.component.d.ts +25 -0
  29. package/lib/fv-uan-field/fv-uan-field.component.d.ts +21 -0
  30. package/lib/query-form/query-form.component.d.ts +53 -0
  31. package/package.json +2 -2
  32. package/public-api.d.ts +14 -4
@@ -0,0 +1,569 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ReactiveFormsModule, FormControl, Validators, } from '@angular/forms';
4
+ // Import Fovestta Components
5
+ import { FvEntryFieldComponent } from '../fv-entry-field/fv-entry-field.component';
6
+ import { FvDropdownComponent } from '../fv-dropdown/fv-dropdown.component';
7
+ import { FvNumberFieldComponent } from '../fv-number-field/fv-number-field.component';
8
+ import { FvDateFieldComponent } from '../fv-date-field/fv-date-field.component';
9
+ import { FvMonthYearFieldComponent } from '../fv-month-year-field/fv-month-year-field.component';
10
+ import { FvFileSelectorComponent } from '../fv-file-selector/fv-file-selector.component';
11
+ import { FvNameCodeComponent } from '../fv-name-code/fv-name-code.component';
12
+ import { FvPhoneFieldComponent } from '../fv-phone-field/fv-phone-field.component';
13
+ import { FvUanFieldComponent } from '../fv-uan-field/fv-uan-field.component';
14
+ import { FvPfFieldComponent } from '../fv-pf-field/fv-pf-field.component';
15
+ import { FvEsiFieldComponent } from '../fv-esi-field/fv-esi-field.component';
16
+ import { FvIfscFieldComponent } from '../fv-ifsc-field/fv-ifsc-field.component';
17
+ import { FvMicrFieldComponent } from '../fv-micr-field/fv-micr-field.component';
18
+ import { FvIbanFieldComponent } from '../fv-iban-field/fv-iban-field.component';
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "@angular/forms";
21
+ import * as i2 from "@angular/common";
22
+ export class QueryFormComponent {
23
+ fb;
24
+ config;
25
+ onSubmit = new EventEmitter();
26
+ onExport = new EventEmitter();
27
+ onBack = new EventEmitter();
28
+ form;
29
+ showExportMenu = false;
30
+ showValidationError = false;
31
+ subs = [];
32
+ constructor(fb) {
33
+ this.fb = fb;
34
+ }
35
+ ngOnInit() {
36
+ const group = {};
37
+ if (this.config && this.config.rows) {
38
+ this.config.rows.forEach((row) => {
39
+ row.columns.forEach((col) => {
40
+ const validators = [];
41
+ if (col.required) {
42
+ validators.push(Validators.required);
43
+ }
44
+ group[col.key] = new FormControl({ value: '', disabled: col.readonly || false }, validators);
45
+ });
46
+ });
47
+ }
48
+ this.form = this.fb.group(group);
49
+ // Subscribe to value changes to trigger onChange callbacks
50
+ this.subs.push(this.form.valueChanges.subscribe((value) => {
51
+ this.config.rows.forEach((row) => {
52
+ row.columns.forEach((col) => {
53
+ if (col.onChange) {
54
+ // Verify if this specific control changed?
55
+ // For simplicity, we can pass value[col.key] but strictly we should check diff.
56
+ // However, simple approach:
57
+ // This runs on every change, might be noisy but acceptable for now.
58
+ // A better approach would be subscribing to individual controls if performance matters.
59
+ }
60
+ });
61
+ });
62
+ }));
63
+ // Subscribe individually to support onChange
64
+ this.config.rows.forEach((row) => {
65
+ row.columns.forEach((col) => {
66
+ if (col.onChange) {
67
+ const control = this.form.get(col.key);
68
+ if (control) {
69
+ this.subs.push(control.valueChanges.subscribe(val => {
70
+ col.onChange(val);
71
+ }));
72
+ }
73
+ }
74
+ });
75
+ });
76
+ }
77
+ ngOnDestroy() {
78
+ this.subs.forEach((s) => s.unsubscribe());
79
+ }
80
+ getControl(key) {
81
+ return this.form.get(key);
82
+ }
83
+ getSchema(column) {
84
+ // Generate a simple schema based on column definition
85
+ const rules = [];
86
+ const errorPriority = [];
87
+ if (column.required) {
88
+ rules.push({ name: 'required', params: { enabled: true }, errorKey: 'ERR_REQUIRED' });
89
+ errorPriority.push('required');
90
+ }
91
+ return {
92
+ controlType: this.mapType(column.type),
93
+ rules: rules,
94
+ errorPriority: errorPriority
95
+ };
96
+ }
97
+ mapType(type) {
98
+ switch (type) {
99
+ case 'text': return 'EntryField';
100
+ case 'number': return 'NumberField';
101
+ case 'date': return 'DateField';
102
+ case 'dropdown': return 'Dropdown';
103
+ case 'month': return 'MonthYearField';
104
+ case 'file': return 'FileSelector';
105
+ case 'name-code': return 'Dropdown';
106
+ case 'phone': return 'PhoneField';
107
+ case 'uan': return 'UanField';
108
+ case 'pf': return 'PfField';
109
+ case 'esi': return 'EsiField';
110
+ case 'ifsc': return 'IfscField';
111
+ case 'micr': return 'MicrField';
112
+ case 'iban': return 'IbanField';
113
+ default: return 'EntryField';
114
+ }
115
+ }
116
+ mapSearchOptions(options) {
117
+ return options.map(opt => ({
118
+ code: opt.code || opt.value,
119
+ name: opt.name || opt.label || opt.value,
120
+ value: opt.value
121
+ }));
122
+ }
123
+ triggerFileUpload(columnKey) {
124
+ // FvFileSelector handles this internally, but if we needed external trigger...
125
+ }
126
+ toggleExportMenu(event) {
127
+ event.stopPropagation();
128
+ this.showExportMenu = !this.showExportMenu;
129
+ }
130
+ clickOutside(event) {
131
+ if (this.showExportMenu) {
132
+ this.showExportMenu = false;
133
+ }
134
+ }
135
+ exportToFormat(format) {
136
+ this.onExport.emit(format);
137
+ this.showExportMenu = false;
138
+ }
139
+ onButtonClick() {
140
+ if (this.form.valid) {
141
+ this.showValidationError = false;
142
+ this.onSubmit.emit(this.form.value);
143
+ }
144
+ else {
145
+ this.showValidationError = true;
146
+ this.form.markAllAsTouched();
147
+ }
148
+ }
149
+ onBackClick() {
150
+ this.onBack.emit();
151
+ }
152
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryFormComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
153
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: QueryFormComponent, isStandalone: true, selector: "lib-query-form", inputs: { config: "config" }, outputs: { onSubmit: "onSubmit", onExport: "onExport", onBack: "onBack" }, host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: `
154
+ <div class="query-form-container">
155
+ <div class="d-flex cont">
156
+ <h2 class="form-title">{{ config.title }}</h2>
157
+
158
+ <div
159
+ class="export-buttons"
160
+ *ngIf="
161
+ config.showExportButton &&
162
+ config.exportFormats &&
163
+ config.exportFormats.length > 0
164
+ "
165
+ >
166
+ <div class="export-menu-container">
167
+ <button
168
+ type="button"
169
+ class="export-btn menu-trigger"
170
+ (click)="toggleExportMenu($event)"
171
+ title="Toggle export options"
172
+ >
173
+ <i class="material-icons">file_download</i>
174
+ <i class="material-icons arrow">arrow_drop_down</i>
175
+ </button>
176
+ <div class="export-menu" *ngIf="showExportMenu">
177
+ <button
178
+ type="button"
179
+ *ngFor="let format of config.exportFormats"
180
+ class="menu-item"
181
+ (click)="exportToFormat(format)"
182
+ [attr.title]="'Export as ' + format.toUpperCase()"
183
+ >
184
+ Export as {{ format.toUpperCase() }}
185
+ </button>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+
191
+ <!-- Validation Error Message -->
192
+ <div *ngIf="showValidationError" class="validation-message">
193
+ <i class="material-icons">error</i>
194
+ Please fill all required fields
195
+ </div>
196
+
197
+ <div class="form-content">
198
+ <form [formGroup]="form">
199
+ <div
200
+ *ngFor="let row of config.rows; let rowIndex = index"
201
+ class="form-row"
202
+ >
203
+ <div *ngFor="let column of row.columns" class="form-field">
204
+
205
+ <!-- Dropdown -->
206
+ <ng-container *ngIf="column.type === 'dropdown'">
207
+ <fv-dropdown
208
+ [label]="column.label"
209
+ [placeholder]="column.placeholder || 'Select option'"
210
+ [options]="column.options || []"
211
+ [control]="getControl(column.key)"
212
+ [schema]="getSchema(column)"
213
+ [disabled]="column.readonly || false"
214
+ >
215
+ </fv-dropdown>
216
+ </ng-container>
217
+
218
+ <!-- Text Input -->
219
+ <ng-container *ngIf="column.type === 'text'">
220
+ <fv-entry-field
221
+ [label]="column.label"
222
+ [placeholder]="column.placeholder || ''"
223
+ type="text"
224
+ [control]="getControl(column.key)"
225
+ [schema]="getSchema(column)"
226
+ [disabled]="column.readonly || false"
227
+ >
228
+ </fv-entry-field>
229
+ </ng-container>
230
+
231
+ <!-- Number Input -->
232
+ <ng-container *ngIf="column.type === 'number'">
233
+ <fv-number-field
234
+ [label]="column.label"
235
+ [placeholder]="column.placeholder || ''"
236
+ [control]="getControl(column.key)"
237
+ [schema]="getSchema(column)"
238
+ [disabled]="column.readonly || false"
239
+ >
240
+ </fv-number-field>
241
+ </ng-container>
242
+
243
+ <!-- Date Input -->
244
+ <ng-container *ngIf="column.type === 'date'">
245
+ <fv-date-field
246
+ [label]="column.label"
247
+ [control]="getControl(column.key)"
248
+ [schema]="getSchema(column)"
249
+ [disabled]="column.readonly || false"
250
+ >
251
+ </fv-date-field>
252
+ </ng-container>
253
+
254
+ <!-- Month/Year Input -->
255
+ <ng-container *ngIf="column.type === 'month'">
256
+ <fv-month-year-field
257
+ [label]="column.label"
258
+ [control]="getControl(column.key)"
259
+ [schema]="getSchema(column)"
260
+ [disabled]="column.readonly || false"
261
+ >
262
+ </fv-month-year-field>
263
+ </ng-container>
264
+
265
+ <!-- File Upload -->
266
+ <ng-container *ngIf="column.type === 'file'">
267
+ <fv-file-selector
268
+ [label]="column.label"
269
+ [placeholder]="column.placeholder || 'Select file'"
270
+ [accept]="column.accept || '*/*'"
271
+ [control]="getControl(column.key)"
272
+ [schema]="getSchema(column)"
273
+ [disabled]="column.readonly || false"
274
+ >
275
+ </fv-file-selector>
276
+ </ng-container>
277
+
278
+ <!-- Name Code Field -->
279
+ <ng-container *ngIf="column.type === 'name-code'">
280
+ <fv-name-code
281
+ [label]="column.label"
282
+ [placeholder]="column.placeholder || 'Search by Code or Name'"
283
+ [options]="mapSearchOptions(column.options || [])"
284
+ [control]="getControl(column.key)"
285
+ [schema]="getSchema(column)"
286
+ [disabled]="column.readonly || false"
287
+ >
288
+ </fv-name-code>
289
+ </ng-container>
290
+
291
+ <ng-container *ngIf="column.type === 'phone'">
292
+ <fv-phone-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-phone-field>
293
+ </ng-container>
294
+
295
+ <ng-container *ngIf="column.type === 'uan'">
296
+ <fv-uan-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-uan-field>
297
+ </ng-container>
298
+
299
+ <ng-container *ngIf="column.type === 'pf'">
300
+ <fv-pf-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-pf-field>
301
+ </ng-container>
302
+
303
+ <ng-container *ngIf="column.type === 'esi'">
304
+ <fv-esi-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-esi-field>
305
+ </ng-container>
306
+
307
+ <ng-container *ngIf="column.type === 'ifsc'">
308
+ <fv-ifsc-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-ifsc-field>
309
+ </ng-container>
310
+
311
+ <ng-container *ngIf="column.type === 'micr'">
312
+ <fv-micr-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-micr-field>
313
+ </ng-container>
314
+
315
+ <ng-container *ngIf="column.type === 'iban'">
316
+ <fv-iban-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-iban-field>
317
+ </ng-container>
318
+ </div>
319
+ </div>
320
+
321
+ <!-- Buttons Row -->
322
+ <div class="button-row">
323
+ <button
324
+ type="button"
325
+ class="view-button"
326
+ (click)="onButtonClick()"
327
+ [attr.title]="config.buttonText || 'View'"
328
+ >
329
+ {{ config.buttonText || 'View' }}
330
+ </button>
331
+ <button
332
+ *ngIf="config.showBackButton"
333
+ type="button"
334
+ class="back-button"
335
+ (click)="onBackClick()"
336
+ [attr.title]="config.backButtonText || 'Back'"
337
+ >
338
+ {{ config.backButtonText || 'Back' }}
339
+ </button>
340
+ </div>
341
+ </form>
342
+ </div>
343
+ </div>
344
+ `, isInline: true, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins}.material-icons{font-family:Material Icons!important;font-size:22px;display:inline-block}.cont{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.validation-message{background-color:#fee;color:#c33;padding:12px 16px;border-radius:8px;margin:10px 0;display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;border:1px solid #fcc}.export-buttons{display:flex;gap:10px}.export-btn{cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .3s ease;border:none;padding:8px 16px;border-radius:7px;background:#006aff;color:#fff}.export-btn:hover{background:#0045a6;box-shadow:0 4px 8px #00000026}.export-menu-container{position:relative;border-radius:7px}.export-menu{position:absolute;top:100%;right:0;background:#fff;border-radius:4px;box-shadow:0 4px 12px #00000026;margin-top:5px;min-width:180px;z-index:1000}.menu-item{width:100%;color:#000;text-align:left;background:#fff;border:none;cursor:pointer;font-size:14px;transition:background .2s;padding:12px 16px;display:flex;align-items:center;gap:10px}.menu-item:hover{background:#f5f5f5}.query-form-container{background:#f2f2f2;border-radius:8px;padding:10px;margin:auto;box-shadow:0 2px 5px #0000001a;margin-bottom:1rem;overflow:visible}.form-title{font-size:20px;font-weight:700;color:#303030;margin:0;font-family:Poppins}.form-content{display:flex;flex-direction:column;gap:5px;background-color:#fff;padding:10px;border:.5px solid #cfcfcf;border-radius:12px;overflow:visible}.form-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));justify-content:flex-start;gap:20px;align-items:end;margin-bottom:15px;overflow:visible}.form-field{display:flex;flex-direction:column;width:100%;position:relative;overflow:visible}.view-button{padding:8px 15px;background:#006aff;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.view-button:hover{background:#0045a6}.button-row{display:flex;justify-content:space-between;gap:10px;padding-top:5px;margin-top:10px;border-top:1px solid #eee}.back-button{padding:8px 15px;background-color:#303030;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.back-button:hover{background-color:#000}@media (max-width: 768px){.form-row{grid-template-columns:1fr}.button-row{justify-content:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FvEntryFieldComponent, selector: "fv-entry-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "type", "allowAlphabetsOnly", "maxLength"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDropdownComponent, selector: "fv-dropdown", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNumberFieldComponent, selector: "fv-number-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "min", "max", "step"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDateFieldComponent, selector: "fv-date-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvMonthYearFieldComponent, selector: "fv-month-year-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvFileSelectorComponent, selector: "fv-file-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "accept", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvNameCodeComponent, selector: "fv-name-code", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: FvPhoneFieldComponent, selector: "fv-phone-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvUanFieldComponent, selector: "fv-uan-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvPfFieldComponent, selector: "fv-pf-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvEsiFieldComponent, selector: "fv-esi-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIfscFieldComponent, selector: "fv-ifsc-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvMicrFieldComponent, selector: "fv-micr-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIbanFieldComponent, selector: "fv-iban-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }] });
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryFormComponent, decorators: [{
347
+ type: Component,
348
+ args: [{ selector: 'lib-query-form', standalone: true, imports: [
349
+ CommonModule,
350
+ ReactiveFormsModule,
351
+ FvEntryFieldComponent,
352
+ FvDropdownComponent,
353
+ FvNumberFieldComponent,
354
+ FvDateFieldComponent,
355
+ FvMonthYearFieldComponent,
356
+ FvFileSelectorComponent,
357
+ FvNameCodeComponent,
358
+ FvPhoneFieldComponent,
359
+ FvUanFieldComponent,
360
+ FvPfFieldComponent,
361
+ FvEsiFieldComponent,
362
+ FvIfscFieldComponent,
363
+ FvMicrFieldComponent,
364
+ FvIbanFieldComponent,
365
+ ], template: `
366
+ <div class="query-form-container">
367
+ <div class="d-flex cont">
368
+ <h2 class="form-title">{{ config.title }}</h2>
369
+
370
+ <div
371
+ class="export-buttons"
372
+ *ngIf="
373
+ config.showExportButton &&
374
+ config.exportFormats &&
375
+ config.exportFormats.length > 0
376
+ "
377
+ >
378
+ <div class="export-menu-container">
379
+ <button
380
+ type="button"
381
+ class="export-btn menu-trigger"
382
+ (click)="toggleExportMenu($event)"
383
+ title="Toggle export options"
384
+ >
385
+ <i class="material-icons">file_download</i>
386
+ <i class="material-icons arrow">arrow_drop_down</i>
387
+ </button>
388
+ <div class="export-menu" *ngIf="showExportMenu">
389
+ <button
390
+ type="button"
391
+ *ngFor="let format of config.exportFormats"
392
+ class="menu-item"
393
+ (click)="exportToFormat(format)"
394
+ [attr.title]="'Export as ' + format.toUpperCase()"
395
+ >
396
+ Export as {{ format.toUpperCase() }}
397
+ </button>
398
+ </div>
399
+ </div>
400
+ </div>
401
+ </div>
402
+
403
+ <!-- Validation Error Message -->
404
+ <div *ngIf="showValidationError" class="validation-message">
405
+ <i class="material-icons">error</i>
406
+ Please fill all required fields
407
+ </div>
408
+
409
+ <div class="form-content">
410
+ <form [formGroup]="form">
411
+ <div
412
+ *ngFor="let row of config.rows; let rowIndex = index"
413
+ class="form-row"
414
+ >
415
+ <div *ngFor="let column of row.columns" class="form-field">
416
+
417
+ <!-- Dropdown -->
418
+ <ng-container *ngIf="column.type === 'dropdown'">
419
+ <fv-dropdown
420
+ [label]="column.label"
421
+ [placeholder]="column.placeholder || 'Select option'"
422
+ [options]="column.options || []"
423
+ [control]="getControl(column.key)"
424
+ [schema]="getSchema(column)"
425
+ [disabled]="column.readonly || false"
426
+ >
427
+ </fv-dropdown>
428
+ </ng-container>
429
+
430
+ <!-- Text Input -->
431
+ <ng-container *ngIf="column.type === 'text'">
432
+ <fv-entry-field
433
+ [label]="column.label"
434
+ [placeholder]="column.placeholder || ''"
435
+ type="text"
436
+ [control]="getControl(column.key)"
437
+ [schema]="getSchema(column)"
438
+ [disabled]="column.readonly || false"
439
+ >
440
+ </fv-entry-field>
441
+ </ng-container>
442
+
443
+ <!-- Number Input -->
444
+ <ng-container *ngIf="column.type === 'number'">
445
+ <fv-number-field
446
+ [label]="column.label"
447
+ [placeholder]="column.placeholder || ''"
448
+ [control]="getControl(column.key)"
449
+ [schema]="getSchema(column)"
450
+ [disabled]="column.readonly || false"
451
+ >
452
+ </fv-number-field>
453
+ </ng-container>
454
+
455
+ <!-- Date Input -->
456
+ <ng-container *ngIf="column.type === 'date'">
457
+ <fv-date-field
458
+ [label]="column.label"
459
+ [control]="getControl(column.key)"
460
+ [schema]="getSchema(column)"
461
+ [disabled]="column.readonly || false"
462
+ >
463
+ </fv-date-field>
464
+ </ng-container>
465
+
466
+ <!-- Month/Year Input -->
467
+ <ng-container *ngIf="column.type === 'month'">
468
+ <fv-month-year-field
469
+ [label]="column.label"
470
+ [control]="getControl(column.key)"
471
+ [schema]="getSchema(column)"
472
+ [disabled]="column.readonly || false"
473
+ >
474
+ </fv-month-year-field>
475
+ </ng-container>
476
+
477
+ <!-- File Upload -->
478
+ <ng-container *ngIf="column.type === 'file'">
479
+ <fv-file-selector
480
+ [label]="column.label"
481
+ [placeholder]="column.placeholder || 'Select file'"
482
+ [accept]="column.accept || '*/*'"
483
+ [control]="getControl(column.key)"
484
+ [schema]="getSchema(column)"
485
+ [disabled]="column.readonly || false"
486
+ >
487
+ </fv-file-selector>
488
+ </ng-container>
489
+
490
+ <!-- Name Code Field -->
491
+ <ng-container *ngIf="column.type === 'name-code'">
492
+ <fv-name-code
493
+ [label]="column.label"
494
+ [placeholder]="column.placeholder || 'Search by Code or Name'"
495
+ [options]="mapSearchOptions(column.options || [])"
496
+ [control]="getControl(column.key)"
497
+ [schema]="getSchema(column)"
498
+ [disabled]="column.readonly || false"
499
+ >
500
+ </fv-name-code>
501
+ </ng-container>
502
+
503
+ <ng-container *ngIf="column.type === 'phone'">
504
+ <fv-phone-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-phone-field>
505
+ </ng-container>
506
+
507
+ <ng-container *ngIf="column.type === 'uan'">
508
+ <fv-uan-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-uan-field>
509
+ </ng-container>
510
+
511
+ <ng-container *ngIf="column.type === 'pf'">
512
+ <fv-pf-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-pf-field>
513
+ </ng-container>
514
+
515
+ <ng-container *ngIf="column.type === 'esi'">
516
+ <fv-esi-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-esi-field>
517
+ </ng-container>
518
+
519
+ <ng-container *ngIf="column.type === 'ifsc'">
520
+ <fv-ifsc-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-ifsc-field>
521
+ </ng-container>
522
+
523
+ <ng-container *ngIf="column.type === 'micr'">
524
+ <fv-micr-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-micr-field>
525
+ </ng-container>
526
+
527
+ <ng-container *ngIf="column.type === 'iban'">
528
+ <fv-iban-field [label]="column.label" [control]="getControl(column.key)" [schema]="getSchema(column)" [disabled]="column.readonly || false"></fv-iban-field>
529
+ </ng-container>
530
+ </div>
531
+ </div>
532
+
533
+ <!-- Buttons Row -->
534
+ <div class="button-row">
535
+ <button
536
+ type="button"
537
+ class="view-button"
538
+ (click)="onButtonClick()"
539
+ [attr.title]="config.buttonText || 'View'"
540
+ >
541
+ {{ config.buttonText || 'View' }}
542
+ </button>
543
+ <button
544
+ *ngIf="config.showBackButton"
545
+ type="button"
546
+ class="back-button"
547
+ (click)="onBackClick()"
548
+ [attr.title]="config.backButtonText || 'Back'"
549
+ >
550
+ {{ config.backButtonText || 'Back' }}
551
+ </button>
552
+ </div>
553
+ </form>
554
+ </div>
555
+ </div>
556
+ `, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins}.material-icons{font-family:Material Icons!important;font-size:22px;display:inline-block}.cont{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.validation-message{background-color:#fee;color:#c33;padding:12px 16px;border-radius:8px;margin:10px 0;display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;border:1px solid #fcc}.export-buttons{display:flex;gap:10px}.export-btn{cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .3s ease;border:none;padding:8px 16px;border-radius:7px;background:#006aff;color:#fff}.export-btn:hover{background:#0045a6;box-shadow:0 4px 8px #00000026}.export-menu-container{position:relative;border-radius:7px}.export-menu{position:absolute;top:100%;right:0;background:#fff;border-radius:4px;box-shadow:0 4px 12px #00000026;margin-top:5px;min-width:180px;z-index:1000}.menu-item{width:100%;color:#000;text-align:left;background:#fff;border:none;cursor:pointer;font-size:14px;transition:background .2s;padding:12px 16px;display:flex;align-items:center;gap:10px}.menu-item:hover{background:#f5f5f5}.query-form-container{background:#f2f2f2;border-radius:8px;padding:10px;margin:auto;box-shadow:0 2px 5px #0000001a;margin-bottom:1rem;overflow:visible}.form-title{font-size:20px;font-weight:700;color:#303030;margin:0;font-family:Poppins}.form-content{display:flex;flex-direction:column;gap:5px;background-color:#fff;padding:10px;border:.5px solid #cfcfcf;border-radius:12px;overflow:visible}.form-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));justify-content:flex-start;gap:20px;align-items:end;margin-bottom:15px;overflow:visible}.form-field{display:flex;flex-direction:column;width:100%;position:relative;overflow:visible}.view-button{padding:8px 15px;background:#006aff;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.view-button:hover{background:#0045a6}.button-row{display:flex;justify-content:space-between;gap:10px;padding-top:5px;margin-top:10px;border-top:1px solid #eee}.back-button{padding:8px 15px;background-color:#303030;color:#fff;border:none;border-radius:7px;font-size:14px;font-weight:600;cursor:pointer;transition:background-color .2s}.back-button:hover{background-color:#000}@media (max-width: 768px){.form-row{grid-template-columns:1fr}.button-row{justify-content:center}}\n"] }]
557
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { config: [{
558
+ type: Input
559
+ }], onSubmit: [{
560
+ type: Output
561
+ }], onExport: [{
562
+ type: Output
563
+ }], onBack: [{
564
+ type: Output
565
+ }], clickOutside: [{
566
+ type: HostListener,
567
+ args: ['document:click', ['$event']]
568
+ }] } });
569
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdi1jb250cm9scy9zcmMvbGliL3F1ZXJ5LWZvcm0vcXVlcnktZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxtQkFBbUIsRUFHbkIsV0FBVyxFQUNYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBSXhCLDZCQUE2QjtBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVB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ICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE9uSW5pdCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblNjaGVtYSB9IGZyb20gJ0Bmb3Zlc3R0YTIvdmFsaWRhdGlvbi1lbmdpbmUnO1xyXG5cclxuLy8gSW1wb3J0IEZvdmVzdHRhIENvbXBvbmVudHNcclxuaW1wb3J0IHsgRnZFbnRyeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZW50cnktZmllbGQvZnYtZW50cnktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRyb3Bkb3duL2Z2LWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2TnVtYmVyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1udW1iZXItZmllbGQvZnYtbnVtYmVyLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2RGF0ZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZGF0ZS1maWVsZC9mdi1kYXRlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2TW9udGhZZWFyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1tb250aC15ZWFyLWZpZWxkL2Z2LW1vbnRoLXllYXItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZGaWxlU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9mdi1maWxlLXNlbGVjdG9yL2Z2LWZpbGUtc2VsZWN0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOYW1lQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW5hbWUtY29kZS9mdi1uYW1lLWNvZGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQaG9uZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGhvbmUtZmllbGQvZnYtcGhvbmUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZVYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXVhbi1maWVsZC9mdi11YW4tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGYtZmllbGQvZnYtcGYtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZFc2lGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWVzaS1maWVsZC9mdi1lc2ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJZnNjRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pZnNjLWZpZWxkL2Z2LWlmc2MtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZNaWNyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1taWNyLWZpZWxkL2Z2LW1pY3ItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJYmFuRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pYmFuLWZpZWxkL2Z2LWliYW4tZmllbGQuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGb3JtQ29sdW1uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHR5cGU6ICdkcm9wZG93bicgfCAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICdtb250aCcgfCAnZmlsZScgfCAnbmFtZS1jb2RlJyB8ICdwaG9uZScgfCAndWFuJyB8ICdwZicgfCAnZXNpJyB8ICdpZnNjJyB8ICdtaWNyJyB8ICdpYmFuJztcclxuICBvcHRpb25zPzogYW55W107XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuICBhY2NlcHQ/OiBzdHJpbmc7XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZvcm1Sb3cge1xyXG4gIGNvbHVtbnM6IFF1ZXJ5Rm9ybUNvbHVtbltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybUNvbmZpZyB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICByb3dzOiBRdWVyeUZvcm1Sb3dbXTtcclxuICBidXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIHNob3dFeHBvcnRCdXR0b24/OiBib29sZWFuO1xyXG4gIGV4cG9ydEZvcm1hdHM/OiBzdHJpbmdbXTtcclxuICBzaG93QmFja0J1dHRvbj86IGJvb2xlYW47XHJcbiAgYmFja0J1dHRvblRleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXF1ZXJ5LWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIEZ2RW50cnlGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2RHJvcGRvd25Db21wb25lbnQsXHJcbiAgICBGdk51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZEYXRlRmllbGRDb21wb25lbnQsXHJcbiAgICBGdk1vbnRoWWVhckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZGaWxlU2VsZWN0b3JDb21wb25lbnQsXHJcbiAgICBGdk5hbWVDb2RlQ29tcG9uZW50LFxyXG4gICAgRnZQaG9uZUZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZVYW5GaWVsZENvbXBvbmVudCxcclxuICAgIEZ2UGZGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2RXNpRmllbGRDb21wb25lbnQsXHJcbiAgICBGdklmc2NGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2TWljckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZJYmFuRmllbGRDb21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29udFwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cImZvcm0tdGl0bGVcIj57eyBjb25maWcudGl0bGUgfX08L2gyPlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImV4cG9ydC1idXR0b25zXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIGNvbmZpZy5zaG93RXhwb3J0QnV0dG9uICYmXHJcbiAgICAgICAgICAgIGNvbmZpZy5leHBvcnRGb3JtYXRzICYmXHJcbiAgICAgICAgICAgIGNvbmZpZy5leHBvcnRGb3JtYXRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImV4cG9ydC1tZW51LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJleHBvcnQtYnRuIG1lbnUtdHJpZ2dlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cG9ydE1lbnUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZXhwb3J0IG9wdGlvbnNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmZpbGVfZG93bmxvYWQ8L2k+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBhcnJvd1wiPmFycm93X2Ryb3BfZG93bjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBvcnQtbWVudVwiICpuZ0lmPVwic2hvd0V4cG9ydE1lbnVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtYXQgb2YgY29uZmlnLmV4cG9ydEZvcm1hdHNcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZW51LWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvRm9ybWF0KGZvcm1hdClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ0V4cG9ydCBhcyAnICsgZm9ybWF0LnRvVXBwZXJDYXNlKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEV4cG9ydCBhcyB7eyBmb3JtYXQudG9VcHBlckNhc2UoKSB9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgIDwhLS0gVmFsaWRhdGlvbiBFcnJvciBNZXNzYWdlIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZhbGlkYXRpb25FcnJvclwiIGNsYXNzPVwidmFsaWRhdGlvbi1tZXNzYWdlXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmVycm9yPC9pPlxyXG4gICAgICAgIFBsZWFzZSBmaWxsIGFsbCByZXF1aXJlZCBmaWVsZHNcclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250ZW50XCI+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgY29uZmlnLnJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXJvd1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiByb3cuY29sdW1uc1wiIGNsYXNzPVwiZm9ybS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdkcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndGV4dCdcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1lbnRyeS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZnYtZW50cnktZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1udW1iZXItZmllbGRcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCJcclxuICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9mdi1udW1iZXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRGF0ZSBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZ2LWRhdGUtZmllbGRcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LWRhdGUtZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTW9udGgvWWVhciBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdtb250aCdcIj5cclxuICAgICAgICAgICAgICAgIDxmdi1tb250aC15ZWFyLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCJcclxuICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9mdi1tb250aC15ZWFyLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZnYtZmlsZS1zZWxlY3RvclxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgW2FjY2VwdF09XCJjb2x1bW4uYWNjZXB0IHx8ICcqLyonXCJcclxuICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZnYtZmlsZS1zZWxlY3Rvcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBOYW1lIENvZGUgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbmFtZS1jb2RlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZ2LW5hbWUtY29kZVxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VhcmNoIGJ5IENvZGUgb3IgTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJtYXBTZWFyY2hPcHRpb25zKGNvbHVtbi5vcHRpb25zIHx8IFtdKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2Z2LW5hbWUtY29kZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdwaG9uZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LXBob25lLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LXBob25lLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtdWFuLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LXVhbi1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3BmJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcGYtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtcGYtZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdlc2knXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1lc2ktZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtZXNpLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWZzYydcIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWlmc2MtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLmtleSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seSB8fCBmYWxzZVwiPjwvZnYtaWZzYy1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ21pY3InXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1taWNyLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5rZXkpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHkgfHwgZmFsc2VcIj48L2Z2LW1pY3ItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdpYmFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtaWJhbi1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ua2V5KVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5IHx8IGZhbHNlXCI+PC9mdi1pYmFuLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBCdXR0b25zIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tcm93XCI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInZpZXctYnV0dG9uXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGljaygpXCJcclxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb25maWcuYnV0dG9uVGV4dCB8fCAnVmlldydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgY29uZmlnLmJ1dHRvblRleHQgfHwgJ1ZpZXcnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuc2hvd0JhY2tCdXR0b25cIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmFjay1idXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkJhY2tDbGljaygpXCJcclxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb25maWcuYmFja0J1dHRvblRleHQgfHwgJ0JhY2snXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5iYWNrQnV0dG9uVGV4dCB8fCAnQmFjaycgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UG9wcGluczp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwJyk7XHJcbiAgICAgIEBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zJyk7XHJcblxyXG4gICAgICAqIHtcclxuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucztcclxuICAgICAgfVxyXG5cclxuICAgICAgLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJyAhaW1wb3J0YW50O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMjJweDtcclxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5jb250IHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52YWxpZGF0aW9uLW1lc3NhZ2Uge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWU7XHJcbiAgICAgICAgY29sb3I6ICNjMzM7XHJcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgICBtYXJnaW46IDEwcHggMDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZjYztcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1idXR0b25zIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGdhcDogMTBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1idG4ge1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiA1cHg7XHJcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDZhZmY7XHJcbiAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAuZXhwb3J0LWJ0bjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNDVhNjtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1tZW51LWNvbnRhaW5lciB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmV4cG9ydC1tZW51IHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgdG9wOiAxMDAlO1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogNXB4O1xyXG4gICAgICAgIG1pbi13aWR0aDogMTgwcHg7XHJcbiAgICAgICAgei1pbmRleDogMTAwMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLm1lbnUtaXRlbSB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgY29sb3I6IGJsYWNrO1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xyXG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiAxMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubWVudS1pdGVtOmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAucXVlcnktZm9ybS1jb250YWluZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tdGl0bGUge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICAgIGNvbG9yOiAjMzAzMDMwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucztcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tY29udGVudCB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgIGdhcDogNXB4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgICBib3JkZXI6IDAuNXB4IHNvbGlkICNjZmNmY2Y7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tcm93IHtcclxuICAgICAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDIwMHB4LCAxZnIpKTtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgICAgICAgZ2FwOiAyMHB4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBlbmQ7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmZvcm0tZmllbGQge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52aWV3LWJ1dHRvbiB7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNmFmZjtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC52aWV3LWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNDVhNjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmJ1dHRvbi1yb3cge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICAgIGdhcDogMTBweDtcclxuICAgICAgICBwYWRkaW5nLXRvcDogNXB4O1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5iYWNrLWJ1dHRvbiB7XHJcbiAgICAgICAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5iYWNrLWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgICAgICAgLmZvcm0tcm93IHtcclxuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG4gICAgICAgIH1cclxuICAgICAgICAuYnV0dG9uLXJvdyB7XHJcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGAsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFF1ZXJ5Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBjb25maWchOiBRdWVyeUZvcm1Db25maWc7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uRXhwb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQmFjayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBzaG93RXhwb3J0TWVudSA9IGZhbHNlO1xyXG4gIHNob3dWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICBwcml2YXRlIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zdCBncm91cDogYW55ID0ge307XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcucm93cykge1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yczogYW55W10gPSBbXTtcclxuICAgICAgICAgIGlmIChjb2wucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZ3JvdXBbY29sLmtleV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgIHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogY29sLnJlYWRvbmx5IHx8IGZhbHNlIH0sXHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChncm91cCk7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZXMgdG8gdHJpZ2dlciBvbkNoYW5nZSBjYWxsYmFja3NcclxuICAgIHRoaXMuc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgcm93LmNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub25DaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAvLyBWZXJpZnkgaWYgdGhpcyBzcGVjaWZpYyBjb250cm9sIGNoYW5nZWQ/IFxyXG4gICAgICAgICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB3ZSBjYW4gcGFzcyB2YWx1ZVtjb2wua2V5XSBidXQgc3RyaWN0bHkgd2Ugc2hvdWxkIGNoZWNrIGRpZmYuXHJcbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgc2ltcGxlIGFwcHJvYWNoOlxyXG4gICAgICAgICAgICAgIC8vIFRoaXMgcnVucyBvbiBldmVyeSBjaGFuZ2UsIG1pZ2h0IGJlIG5vaXN5IGJ1dCBhY2NlcHRhYmxlIGZvciBub3cuXHJcbiAgICAgICAgICAgICAgLy8gQSBiZXR0ZXIgYXBwcm9hY2ggd291bGQgYmUgc3Vic2NyaWJpbmcgdG8gaW5kaXZpZHVhbCBjb250cm9scyBpZiBwZXJmb3JtYW5jZSBtYXR0ZXJzLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIGluZGl2aWR1YWxseSB0byBzdXBwb3J0IG9uQ2hhbmdlXHJcbiAgICB0aGlzLmNvbmZpZy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgICAgICBpZiAoY29sLm9uQ2hhbmdlKSB7XHJcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChjb2wua2V5KTtcclxuICAgICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vicy5wdXNoKGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbC5vbkNoYW5nZSEodmFsKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udHJvbChrZXk6IHN0cmluZyk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KGtleSkgYXMgRm9ybUNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBnZXRTY2hlbWEoY29sdW1uOiBRdWVyeUZvcm1Db2x1bW4pOiBWYWxpZGF0aW9uU2NoZW1hIHtcclxuICAgIC8vIEdlbmVyYXRlIGEgc2ltcGxlIHNjaGVtYSBiYXNlZCBvbiBjb2x1bW4gZGVmaW5pdGlvblxyXG4gICAgY29uc3QgcnVsZXMgPSBbXTtcclxuICAgIGNvbnN0IGVycm9yUHJpb3JpdHkgPSBbXTtcclxuXHJcbiAgICBpZiAoY29sdW1uLnJlcXVpcmVkKSB7XHJcbiAgICAgIHJ1bGVzLnB1c2goeyBuYW1lOiAncmVxdWlyZWQnLCBwYXJhbXM6IHsgZW5hYmxlZDogdHJ1ZSB9LCBlcnJvcktleTogJ0VSUl9SRVFVSVJFRCcgfSk7XHJcbiAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgncmVxdWlyZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250cm9sVHlwZTogdGhpcy5tYXBUeXBlKGNvbHVtbi50eXBlKSxcclxuICAgICAgcnVsZXM6IHJ1bGVzLFxyXG4gICAgICBlcnJvclByaW9yaXR5OiBlcnJvclByaW9yaXR5XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbWFwVHlwZSh0eXBlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RleHQnOiByZXR1cm4gJ0VudHJ5RmllbGQnO1xyXG4gICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gJ051bWJlckZpZWxkJztcclxuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiAnRGF0ZUZpZWxkJztcclxuICAgICAgY2FzZSAnZHJvcGRvd24nOiByZXR1cm4gJ0Ryb3Bkb3duJztcclxuICAgICAgY2FzZSAnbW9udGgnOiByZXR1cm4gJ01vbnRoWWVhckZpZWxkJztcclxuICAgICAgY2FzZSAnZmlsZSc6IHJldHVybiAnRmlsZVNlbGVjdG9yJztcclxuICAgICAgY2FzZSAnbmFtZS1jb2RlJzogcmV0dXJuICdEcm9wZG93bic7XHJcbiAgICAgIGNhc2UgJ3Bob25lJzogcmV0dXJuICdQaG9uZUZpZWxkJztcclxuICAgICAgY2FzZSAndWFuJzogcmV0dXJuICdVYW5GaWVsZCc7XHJcbiAgICAgIGNhc2UgJ3BmJzogcmV0dXJuICdQZkZpZWxkJztcclxuICAgICAgY2FzZSAnZXNpJzogcmV0dXJuICdFc2lGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ2lmc2MnOiByZXR1cm4gJ0lmc2NGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ21pY3InOiByZXR1cm4gJ01pY3JGaWVsZCc7XHJcbiAgICAgIGNhc2UgJ2liYW4nOiByZXR1cm4gJ0liYW5GaWVsZCc7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnRW50cnlGaWVsZCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYXBTZWFyY2hPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdCA9PiAoe1xyXG4gICAgICBjb2RlOiBvcHQuY29kZSB8fCBvcHQudmFsdWUsXHJcbiAgICAgIG5hbWU6IG9wdC5uYW1lIHx8IG9wdC5sYWJlbCB8fCBvcHQudmFsdWUsXHJcbiAgICAgIHZhbHVlOiBvcHQudmFsdWVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHRyaWdnZXJGaWxlVXBsb2FkKGNvbHVtbktleTogc3RyaW5nKSB7XHJcbiAgICAvLyBGdkZpbGVTZWxlY3RvciBoYW5kbGVzIHRoaXMgaW50ZXJuYWxseSwgYnV0IGlmIHdlIG5lZWRlZCBleHRlcm5hbCB0cmlnZ2VyLi4uXHJcbiAgfVxyXG5cclxuICB0b2dnbGVFeHBvcnRNZW51KGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNob3dFeHBvcnRNZW51ID0gIXRoaXMuc2hvd0V4cG9ydE1lbnU7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgY2xpY2tPdXRzaWRlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNob3dFeHBvcnRNZW51KSB7XHJcbiAgICAgIHRoaXMuc2hvd0V4cG9ydE1lbnUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydFRvRm9ybWF0KGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm9uRXhwb3J0LmVtaXQoZm9ybWF0KTtcclxuICAgIHRoaXMuc2hvd0V4cG9ydE1lbnUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQnV0dG9uQ2xpY2soKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkJhY2tDbGljaygpIHtcclxuICAgIHRoaXMub25CYWNrLmVtaXQoKTtcclxuICB9XHJcbn1cclxuIl19