@muraai/mnl-form 0.0.1-alpha-32ca3fa → 0.0.1-alpha-11e96eb

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 (65) hide show
  1. package/README.md +5 -5
  2. package/fesm2022/muraai-mnl-form.mjs +152 -145
  3. package/fesm2022/muraai-mnl-form.mjs.map +1 -1
  4. package/lib/{formly-lib/formly-lib.component.d.ts → mnl-form/mnl-form.component.d.ts} +3 -3
  5. package/lib/types/upload-file.d.ts +1 -1
  6. package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
  7. package/lib/workflow-status/workflow-status.component.d.ts +1 -1
  8. package/package.json +4 -5
  9. package/public-api.d.ts +2 -2
  10. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
  11. package/esm2022/lib/formly-lib/formly-lib.component.mjs +0 -199
  12. package/esm2022/lib/formly-lib/formly-standalone.module.mjs +0 -155
  13. package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
  14. package/esm2022/lib/models/workflow-status.model.mjs +0 -2
  15. package/esm2022/lib/services/graphql.service.mjs +0 -30
  16. package/esm2022/lib/services/scoring.service.mjs +0 -103
  17. package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
  18. package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
  19. package/esm2022/lib/types/button.type.mjs +0 -72
  20. package/esm2022/lib/types/comments.type.mjs +0 -102
  21. package/esm2022/lib/types/country-code-input.type.mjs +0 -181
  22. package/esm2022/lib/types/custom-date.type.mjs +0 -20
  23. package/esm2022/lib/types/custom-input.component.mjs +0 -62
  24. package/esm2022/lib/types/date-format.type.mjs +0 -196
  25. package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
  26. package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
  27. package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
  28. package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
  29. package/esm2022/lib/types/grid.type.mjs +0 -125
  30. package/esm2022/lib/types/input.type.mjs +0 -43
  31. package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
  32. package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
  33. package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
  34. package/esm2022/lib/types/radio.type.mjs +0 -71
  35. package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
  36. package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
  37. package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
  38. package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
  39. package/esm2022/lib/types/stepper.type.mjs +0 -268
  40. package/esm2022/lib/types/table.types.mjs +0 -79
  41. package/esm2022/lib/types/tabs.types.mjs +0 -293
  42. package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
  43. package/esm2022/lib/types/tabular-form.type.mjs +0 -641
  44. package/esm2022/lib/types/upload-file.mjs +0 -524
  45. package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
  46. package/esm2022/lib/utils/formly.utils.mjs +0 -105
  47. package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
  48. package/esm2022/lib/validators/ein-validators.mjs +0 -11
  49. package/esm2022/lib/validators/gst-validator.mjs +0 -11
  50. package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
  51. package/esm2022/lib/validators/npi-validator.mjs +0 -11
  52. package/esm2022/lib/validators/pan-validator.mjs +0 -11
  53. package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
  54. package/esm2022/lib/validators/select-validator.mjs +0 -7
  55. package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
  56. package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
  57. package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
  58. package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
  59. package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
  60. package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
  61. package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
  62. package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
  63. package/esm2022/muraai-mnl-form.mjs +0 -5
  64. package/esm2022/public-api.mjs +0 -12
  65. /package/lib/{formly-lib/formly-standalone.module.d.ts → mnl-form/mnl-form-standalone.module.d.ts} +0 -0
@@ -1,331 +0,0 @@
1
- import { TextFieldModule } from '@angular/cdk/text-field';
2
- import { CommonModule } from '@angular/common';
3
- import { Component, ViewChild } from '@angular/core';
4
- import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
- import { MatNativeDateModule } from '@angular/material/core';
6
- import { MatDatepickerModule } from '@angular/material/datepicker';
7
- import { MatFormFieldModule } from '@angular/material/form-field';
8
- import { MatInputModule } from '@angular/material/input';
9
- import { MatSelectModule } from '@angular/material/select';
10
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
11
- import { FormlyModule, } from '@ngx-formly/core';
12
- import { FieldType } from '@ngx-formly/material';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/common";
15
- import * as i2 from "@angular/material/input";
16
- import * as i3 from "@angular/material/form-field";
17
- import * as i4 from "@angular/cdk/text-field";
18
- import * as i5 from "@ngx-formly/core";
19
- import * as i6 from "@angular/forms";
20
- import * as i7 from "@angular/material/slide-toggle";
21
- export class MnlFormHelperTextInputComponent extends FieldType {
22
- get helperLabel() {
23
- return this.to['helperProps']?.['helperLabel'] || 'Need help?';
24
- }
25
- get defaultHelperText() {
26
- return this.to['helperProps']?.['defaultHelperText'] || '';
27
- }
28
- // Get value from primary model (answers)
29
- get originalValue() {
30
- const fieldKey = this.field.key;
31
- return this.field.model?.[fieldKey];
32
- }
33
- // Get/Set value from secondary model (helper)
34
- get helperModel() {
35
- return (this.to['helperModel'] ||
36
- this.props['helperModel'] ||
37
- this.options?.formState?.['helperModel']);
38
- }
39
- get helperKey() {
40
- return this.to['helperKey'] || this.field.key;
41
- }
42
- get currentHelperValue() {
43
- if (this.helperModel && this.helperKey) {
44
- return this.helperModel[this.helperKey];
45
- }
46
- return '';
47
- }
48
- set currentHelperValue(value) {
49
- if (this.helperModel && this.helperKey) {
50
- this.helperModel[this.helperKey] = value;
51
- }
52
- }
53
- get readonly() {
54
- return this.to['readonly'] || this.props['readonly'] || false;
55
- }
56
- constructor(cdr) {
57
- super();
58
- this.cdr = cdr;
59
- this.checked = false;
60
- }
61
- ngOnInit() {
62
- // Initialize helper form control with value from helper model
63
- this.helperFormControl = new FormControl(this.currentHelperValue || '');
64
- // Subscribe to changes in helper form control and update helper model
65
- this.helperFormControl.valueChanges.subscribe((value) => {
66
- this.currentHelperValue = value;
67
- // Emit helper model change to parent component
68
- this.options?.formState?.['onHelperModelChange']?.(this.helperModel);
69
- });
70
- this.setupDefaultField();
71
- if (this.to['enableHelper']) {
72
- this.setCorrectValue();
73
- this.determineInitialState();
74
- }
75
- if (this.currentHelperValue && this.currentHelperValue.trim() !== '') {
76
- this.checked = true;
77
- }
78
- }
79
- ngAfterViewInit() {
80
- setTimeout(() => {
81
- this.cdr.detectChanges();
82
- this.autosize?.resizeToFitContent(true);
83
- });
84
- }
85
- resizeTextarea() {
86
- if (this.autosize) {
87
- this.cdr.detectChanges();
88
- setTimeout(() => this.autosize?.resizeToFitContent(true), 50);
89
- }
90
- }
91
- toggleSlide() {
92
- this.checked = !this.checked;
93
- if (this.checked) {
94
- // When toggle is opened, check if helper field is empty
95
- const currenthelper = this.helperFormControl.value;
96
- if (!currenthelper || currenthelper.trim() === '') {
97
- this.helperFormControl.setValue(this.defaultHelperText);
98
- }
99
- }
100
- else {
101
- this.helperFormControl.setValue('');
102
- }
103
- this.cdr.detectChanges();
104
- }
105
- setupDefaultField() {
106
- const fieldConfig = this.to['defaultFieldConfig'];
107
- if (fieldConfig) {
108
- // Get current value from model and sync with formControl
109
- const fieldKey = this.field.key;
110
- const modelValue = this.field.model?.[fieldKey];
111
- // Sync formControl value with model value if it exists
112
- if (modelValue !== undefined && modelValue !== null) {
113
- this.formControl.setValue(modelValue, { emitEvent: false });
114
- }
115
- // Create enhanced props with necessary fixes for production
116
- const enhancedProps = {
117
- ...fieldConfig.props,
118
- };
119
- // For select fields, add compareWith function to ensure proper value matching in production builds
120
- if (fieldConfig.type === 'select' && !enhancedProps['compareWith']) {
121
- enhancedProps['compareWith'] = (o1, o2) => o1 === o2;
122
- }
123
- this.defaultFieldConfig = {
124
- type: fieldConfig.type,
125
- key: this.field.key || fieldConfig.key || 'defaultKey',
126
- formControl: this.formControl,
127
- props: enhancedProps,
128
- wrappers: fieldConfig.wrappers || [],
129
- modelOptions: fieldConfig.modelOptions || this.field.modelOptions || {},
130
- validators: fieldConfig.validators || this.field.validators || {},
131
- asyncValidators: fieldConfig.asyncValidators || this.field.asyncValidators || {},
132
- hooks: fieldConfig.hooks || this.field.hooks || {},
133
- expressions: fieldConfig.expressions || this.field.expressions || {},
134
- hide: fieldConfig.hide !== undefined ? fieldConfig.hide : false,
135
- className: fieldConfig.className || this.field.className || '',
136
- fieldGroupClassName: fieldConfig.fieldGroupClassName ||
137
- this.field.fieldGroupClassName ||
138
- '',
139
- parent: this.field.parent,
140
- options: this.field.options,
141
- model: this.field.model,
142
- form: this.field.form,
143
- };
144
- }
145
- }
146
- determineInitialState() {
147
- // Auto-open helper based on scoring criteria
148
- switch (this.to['scoring']?.['criteria']) {
149
- case 'exactMatch':
150
- if (Array.isArray(this.to['scoring']?.['answer'])) {
151
- // Handle multiselect case where answer is also an array
152
- if (Array.isArray(this.originalValue)) {
153
- // Check if not empty AND all selected answers are in expected answers
154
- const isCorrect = this.originalValue.length > 0 &&
155
- this.originalValue.every(a => this.to['scoring']?.['answer'].includes(a));
156
- if (!isCorrect) {
157
- this.checked = true;
158
- }
159
- }
160
- else {
161
- // Single value case
162
- if (!this.to['scoring']?.['answer'].includes(this.originalValue)) {
163
- this.checked = true;
164
- }
165
- }
166
- }
167
- break;
168
- case 'range':
169
- const answer = this.originalValue;
170
- const num = typeof answer === 'number' ? answer : Number(answer);
171
- const correct = Number.isFinite(num) &&
172
- num >= this.to['scoring']?.['answer'].min &&
173
- num <= this.to['scoring']?.['answer'].max;
174
- if (!correct) {
175
- this.checked = true;
176
- }
177
- break;
178
- }
179
- }
180
- setCorrectValue() {
181
- const currentHelperValue = this.currentHelperValue;
182
- // If helper already has a value (user edited), don't override
183
- if (currentHelperValue && currentHelperValue.trim() !== '') {
184
- return;
185
- }
186
- switch (this.to['scoring']?.['criteria']) {
187
- case 'attempted':
188
- // For attempted, set defaultHelperText
189
- this.helperFormControl.setValue('');
190
- break;
191
- case 'exactMatch':
192
- if (Array.isArray(this.to['scoring']?.['answer'])) {
193
- // Handle multiselect case where answer is also an array
194
- if (Array.isArray(this.originalValue)) {
195
- // Check if not empty AND all selected answers are in expected answers
196
- const isCorrect = this.originalValue.length > 0 &&
197
- this.originalValue.every(a => this.to['scoring']?.['answer'].includes(a));
198
- if (isCorrect) {
199
- // Answer is correct - set empty value in helper
200
- this.helperFormControl.setValue('');
201
- }
202
- else {
203
- // Answer is incorrect - set defaultHelperText in helper
204
- this.helperFormControl.setValue(this.defaultHelperText);
205
- }
206
- }
207
- else {
208
- // Single value case
209
- if (this.to['scoring']?.['answer'].includes(this.originalValue)) {
210
- // Answer is correct - set empty value in helper
211
- this.helperFormControl.setValue('');
212
- }
213
- else {
214
- // Answer is incorrect - set defaultHelperText in helper
215
- this.helperFormControl.setValue(this.defaultHelperText);
216
- }
217
- }
218
- }
219
- break;
220
- case 'range':
221
- const answer = this.originalValue;
222
- const num = typeof answer === 'number' ? answer : Number(answer);
223
- const correct = Number.isFinite(num) &&
224
- num >= this.to['scoring']?.['answer'].min &&
225
- num <= this.to['scoring']?.['answer'].max;
226
- if (correct) {
227
- // Answer is correct - set empty value in helper
228
- this.helperFormControl.setValue('');
229
- }
230
- else {
231
- // Answer is incorrect - set defaultHelperText in helper
232
- this.helperFormControl.setValue(this.defaultHelperText);
233
- }
234
- break;
235
- default:
236
- break;
237
- }
238
- }
239
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MnlFormHelperTextInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
240
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MnlFormHelperTextInputComponent, isStandalone: true, selector: "mu-helper-text", viewQueries: [{ propertyName: "autosize", first: true, predicate: ["autosize"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
241
- <div class="helper-text-container">
242
- <!-- Helper Mode - Show toggle and conditional content -->
243
- <div *ngIf="to['enableHelper']">
244
- <mat-label>{{ to.label }}</mat-label>
245
- <div *ngIf="originalValue" class="flex-row">
246
- <span class="answer">{{ originalValue }}</span>
247
- <mat-slide-toggle
248
- [(ngModel)]="checked"
249
- (toggleChange)="toggleSlide()"
250
- [disabled]="field.form?.disabled"
251
- >{{ helperLabel }}</mat-slide-toggle
252
- >
253
- </div>
254
-
255
- <mat-form-field class="textarea" appearance="outline" *ngIf="checked">
256
- <textarea
257
- cdkTextareaAutosize
258
- #autosize="cdkTextareaAutosize"
259
- cdkAutosizeMinRows="2"
260
- rows="2"
261
- matInput
262
- [formControl]="helperFormControl"
263
- [readonly]="readonly || field.form?.disabled"
264
- [disabled]="field.form?.disabled"
265
- ></textarea>
266
- </mat-form-field>
267
- </div>
268
-
269
- <!-- Default Mode - Show field directly -->
270
- <div *ngIf="!to['enableHelper']">
271
- <formly-field *ngIf="defaultFieldConfig" [field]="defaultFieldConfig">
272
- </formly-field>
273
- </div>
274
- </div>
275
- `, isInline: true, styles: [".helper-text-container{display:flex;flex-direction:column}.answer{font-size:12px;width:85%;overflow-wrap:break-word;word-wrap:break-word}.textarea{margin:0!important;width:100%}.flex-row{display:flex;flex-direction:row;justify-content:space-between}.w-full{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i5.FormlyField, selector: "formly-field", inputs: ["field"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: TextFieldModule }] }); }
276
- }
277
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MnlFormHelperTextInputComponent, decorators: [{
278
- type: Component,
279
- args: [{ selector: 'mu-helper-text', standalone: true, imports: [
280
- CommonModule,
281
- MatInputModule,
282
- FormlyModule,
283
- ReactiveFormsModule,
284
- FormsModule,
285
- MatFormFieldModule,
286
- MatSlideToggleModule,
287
- MatSelectModule,
288
- MatDatepickerModule,
289
- MatNativeDateModule,
290
- TextFieldModule
291
- ], template: `
292
- <div class="helper-text-container">
293
- <!-- Helper Mode - Show toggle and conditional content -->
294
- <div *ngIf="to['enableHelper']">
295
- <mat-label>{{ to.label }}</mat-label>
296
- <div *ngIf="originalValue" class="flex-row">
297
- <span class="answer">{{ originalValue }}</span>
298
- <mat-slide-toggle
299
- [(ngModel)]="checked"
300
- (toggleChange)="toggleSlide()"
301
- [disabled]="field.form?.disabled"
302
- >{{ helperLabel }}</mat-slide-toggle
303
- >
304
- </div>
305
-
306
- <mat-form-field class="textarea" appearance="outline" *ngIf="checked">
307
- <textarea
308
- cdkTextareaAutosize
309
- #autosize="cdkTextareaAutosize"
310
- cdkAutosizeMinRows="2"
311
- rows="2"
312
- matInput
313
- [formControl]="helperFormControl"
314
- [readonly]="readonly || field.form?.disabled"
315
- [disabled]="field.form?.disabled"
316
- ></textarea>
317
- </mat-form-field>
318
- </div>
319
-
320
- <!-- Default Mode - Show field directly -->
321
- <div *ngIf="!to['enableHelper']">
322
- <formly-field *ngIf="defaultFieldConfig" [field]="defaultFieldConfig">
323
- </formly-field>
324
- </div>
325
- </div>
326
- `, styles: [".helper-text-container{display:flex;flex-direction:column}.answer{font-size:12px;width:85%;overflow-wrap:break-word;word-wrap:break-word}.textarea{margin:0!important;width:100%}.flex-row{display:flex;flex-direction:row;justify-content:space-between}.w-full{width:100%}\n"] }]
327
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { autosize: [{
328
- type: ViewChild,
329
- args: ['autosize']
330
- }] } });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXUtaGVscGVyLXRleHQudHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tbGliL3NyYy9saWIvdHlwZXMvbXUtaGVscGVyLXRleHQudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQW9DLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFHTCxZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQStFakQsTUFBTSxPQUFPLCtCQUNYLFNBQVEsU0FBMEI7SUFPbEMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElB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QUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTix3REFBd0Q7b0JBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzFELENBQUM7Z0JBQ0QsTUFBTTtZQUVSO2dCQUNFLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQzsrR0FoUVUsK0JBQStCO21HQUEvQiwrQkFBK0IsdU1BN0RoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ1QsdVZBL0NDLFlBQVksa0lBQ1osY0FBYyxxMUJBQ2QsWUFBWSx3SEFDWixtQkFBbUIseWtCQUNuQixXQUFXLHNQQUNYLGtCQUFrQiw4QkFDbEIsb0JBQW9CLHlYQUNwQixlQUFlLDhCQUNmLG1CQUFtQiw4QkFDbkIsbUJBQW1CLDhCQUNuQixlQUFlOzs0RkErRE4sK0JBQStCO2tCQTdFM0MsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixlQUFlO3FCQUNoQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DVDtzRkE4QnNCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1RleHRhcmVhQXV0b3NpemUsIFRleHRGaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90ZXh0LWZpZWxkJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQge1xuICBGaWVsZFR5cGVDb25maWcsXG4gIEZvcm1seUZpZWxkQ29uZmlnLFxuICBGb3JtbHlNb2R1bGUsXG59IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdS1oZWxwZXItdGV4dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgRm9ybWx5TW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsXG4gICAgVGV4dEZpZWxkTW9kdWxlIFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJoZWxwZXItdGV4dC1jb250YWluZXJcIj5cbiAgICAgIDwhLS0gSGVscGVyIE1vZGUgLSBTaG93IHRvZ2dsZSBhbmQgY29uZGl0aW9uYWwgY29udGVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJ0b1snZW5hYmxlSGVscGVyJ11cIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyB0by5sYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwib3JpZ2luYWxWYWx1ZVwiIGNsYXNzPVwiZmxleC1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImFuc3dlclwiPnt7IG9yaWdpbmFsVmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hlY2tlZFwiXG4gICAgICAgICAgICAodG9nZ2xlQ2hhbmdlKT1cInRvZ2dsZVNsaWRlKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmZvcm0/LmRpc2FibGVkXCJcbiAgICAgICAgICAgID57eyBoZWxwZXJMYWJlbCB9fTwvbWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGV4dGFyZWFcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiICpuZ0lmPVwiY2hlY2tlZFwiPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG4gICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIyXCJcbiAgICAgICAgICAgIHJvd3M9XCIyXCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaGVscGVyRm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IGZpZWxkLmZvcm0/LmRpc2FibGVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5mb3JtPy5kaXNhYmxlZFwiXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZWZhdWx0IE1vZGUgLSBTaG93IGZpZWxkIGRpcmVjdGx5IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiF0b1snZW5hYmxlSGVscGVyJ11cIj5cbiAgICAgICAgPGZvcm1seS1maWVsZCAqbmdJZj1cImRlZmF1bHRGaWVsZENvbmZpZ1wiIFtmaWVsZF09XCJkZWZhdWx0RmllbGRDb25maWdcIj5cbiAgICAgICAgPC9mb3JtbHktZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBgXG4gICAgIC5oZWxwZXItdGV4dC1jb250YWluZXJ7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgfVxuICAgICAuYW5zd2Vye1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgd2lkdGg6IDg1JTtcbiAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgIH1cbiAgICAgIC50ZXh0YXJlYXtcbiAgICAgIG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgfVxuICAgICAuZmxleC1yb3d7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgfVxuICAgICAudy1mdWxse1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgIH1cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTW5sRm9ybUhlbHBlclRleHRJbnB1dENvbXBvbmVudFxuICBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc+XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0XG57XG4gIEBWaWV3Q2hpbGQoJ2F1dG9zaXplJykgYXV0b3NpemU/OiBDZGtUZXh0YXJlYUF1dG9zaXplO1xuICBjaGVja2VkID0gZmFsc2U7XG4gIGhlbHBlckZvcm1Db250cm9sITogRm9ybUNvbnRyb2w7IC8vIFNlcGFyYXRlIGZvcm0gY29udHJvbCBmb3IgaGVscGVyIG1vZGVsXG5cbiAgZ2V0IGhlbHBlckxhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvWydoZWxwZXJQcm9wcyddPy5bJ2hlbHBlckxhYmVsJ10gfHwgJ05lZWQgaGVscD8nO1xuICB9XG4gIGdldCBkZWZhdWx0SGVscGVyVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy50b1snaGVscGVyUHJvcHMnXT8uWydkZWZhdWx0SGVscGVyVGV4dCddIHx8ICcnO1xuICB9XG5cbiAgLy8gR2V0IHZhbHVlIGZyb20gcHJpbWFyeSBtb2RlbCAoYW5zd2VycylcbiAgZ2V0IG9yaWdpbmFsVmFsdWUoKSB7XG4gICAgY29uc3QgZmllbGRLZXkgPSB0aGlzLmZpZWxkLmtleSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQubW9kZWw/LltmaWVsZEtleV07XG4gIH1cblxuICAvLyBHZXQvU2V0IHZhbHVlIGZyb20gc2Vjb25kYXJ5IG1vZGVsIChoZWxwZXIpXG4gIGdldCBoZWxwZXJNb2RlbCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy50b1snaGVscGVyTW9kZWwnXSB8fFxuICAgICAgdGhpcy5wcm9wc1snaGVscGVyTW9kZWwnXSB8fFxuICAgICAgdGhpcy5vcHRpb25zPy5mb3JtU3RhdGU/LlsnaGVscGVyTW9kZWwnXVxuICAgICk7XG4gIH1cblxuICBnZXQgaGVscGVyS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvWydoZWxwZXJLZXknXSB8fCB0aGlzLmZpZWxkLmtleTtcbiAgfVxuXG4gIGdldCBjdXJyZW50SGVscGVyVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaGVscGVyTW9kZWwgJiYgdGhpcy5oZWxwZXJLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlck1vZGVsW3RoaXMuaGVscGVyS2V5IGFzIHN0cmluZ107XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNldCBjdXJyZW50SGVscGVyVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmhlbHBlck1vZGVsICYmIHRoaXMuaGVscGVyS2V5KSB7XG4gICAgICB0aGlzLmhlbHBlck1vZGVsW3RoaXMuaGVscGVyS2V5IGFzIHN0cmluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9bJ3JlYWRvbmx5J10gfHwgdGhpcy5wcm9wc1sncmVhZG9ubHknXSB8fCBmYWxzZTtcbiAgfVxuXG4gIGRlZmF1bHRGaWVsZENvbmZpZz86IEZvcm1seUZpZWxkQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBJbml0aWFsaXplIGhlbHBlciBmb3JtIGNvbnRyb2wgd2l0aCB2YWx1ZSBmcm9tIGhlbHBlciBtb2RlbFxuICAgIHRoaXMuaGVscGVyRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5jdXJyZW50SGVscGVyVmFsdWUgfHwgJycpO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gaGVscGVyIGZvcm0gY29udHJvbCBhbmQgdXBkYXRlIGhlbHBlciBtb2RlbFxuICAgIHRoaXMuaGVscGVyRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudEhlbHBlclZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBFbWl0IGhlbHBlciBtb2RlbCBjaGFuZ2UgdG8gcGFyZW50IGNvbXBvbmVudFxuICAgICAgdGhpcy5vcHRpb25zPy5mb3JtU3RhdGU/Llsnb25IZWxwZXJNb2RlbENoYW5nZSddPy4odGhpcy5oZWxwZXJNb2RlbCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHVwRGVmYXVsdEZpZWxkKCk7XG5cbiAgICBpZiAodGhpcy50b1snZW5hYmxlSGVscGVyJ10pIHtcbiAgICAgIHRoaXMuc2V0Q29ycmVjdFZhbHVlKCk7XG4gICAgICB0aGlzLmRldGVybWluZUluaXRpYWxTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50SGVscGVyVmFsdWUgJiYgdGhpcy5jdXJyZW50SGVscGVyVmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmF1dG9zaXplPy5yZXNpemVUb0ZpdENvbnRlbnQodHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIHB1YmxpYyByZXNpemVUZXh0YXJlYSgpIHtcbiAgICBpZiAodGhpcy5hdXRvc2l6ZSkge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9zaXplPy5yZXNpemVUb0ZpdENvbnRlbnQodHJ1ZSksIDUwKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTbGlkZSgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgIC8vIFdoZW4gdG9nZ2xlIGlzIG9wZW5lZCwgY2hlY2sgaWYgaGVscGVyIGZpZWxkIGlzIGVtcHR5XG4gICAgICBjb25zdCBjdXJyZW50aGVscGVyID0gdGhpcy5oZWxwZXJGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgIGlmICghY3VycmVudGhlbHBlciB8fCBjdXJyZW50aGVscGVyLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgdGhpcy5oZWxwZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmRlZmF1bHRIZWxwZXJUZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNldHVwRGVmYXVsdEZpZWxkKCkge1xuICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy50b1snZGVmYXVsdEZpZWxkQ29uZmlnJ107XG4gICAgaWYgKGZpZWxkQ29uZmlnKSB7XG4gICAgICAvLyBHZXQgY3VycmVudCB2YWx1ZSBmcm9tIG1vZGVsIGFuZCBzeW5jIHdpdGggZm9ybUNvbnRyb2xcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gdGhpcy5maWVsZC5rZXkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMuZmllbGQubW9kZWw/LltmaWVsZEtleV07XG4gICAgICBcbiAgICAgIC8vIFN5bmMgZm9ybUNvbnRyb2wgdmFsdWUgd2l0aCBtb2RlbCB2YWx1ZSBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChtb2RlbFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbW9kZWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKG1vZGVsVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGVuaGFuY2VkIHByb3BzIHdpdGggbmVjZXNzYXJ5IGZpeGVzIGZvciBwcm9kdWN0aW9uXG4gICAgICBjb25zdCBlbmhhbmNlZFByb3BzID0ge1xuICAgICAgICAuLi5maWVsZENvbmZpZy5wcm9wcyxcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIEZvciBzZWxlY3QgZmllbGRzLCBhZGQgY29tcGFyZVdpdGggZnVuY3Rpb24gdG8gZW5zdXJlIHByb3BlciB2YWx1ZSBtYXRjaGluZyBpbiBwcm9kdWN0aW9uIGJ1aWxkc1xuICAgICAgaWYgKGZpZWxkQ29uZmlnLnR5cGUgPT09ICdzZWxlY3QnICYmICFlbmhhbmNlZFByb3BzWydjb21wYXJlV2l0aCddKSB7XG4gICAgICAgIGVuaGFuY2VkUHJvcHNbJ2NvbXBhcmVXaXRoJ10gPSAobzE6IGFueSwgbzI6IGFueSkgPT4gbzEgPT09IG8yO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmRlZmF1bHRGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgdHlwZTogZmllbGRDb25maWcudHlwZSxcbiAgICAgICAga2V5OiB0aGlzLmZpZWxkLmtleSB8fCBmaWVsZENvbmZpZy5rZXkgfHwgJ2RlZmF1bHRLZXknLFxuICAgICAgICBmb3JtQ29udHJvbDogdGhpcy5mb3JtQ29udHJvbCxcbiAgICAgICAgcHJvcHM6IGVuaGFuY2VkUHJvcHMsXG4gICAgICAgIHdyYXBwZXJzOiBmaWVsZENvbmZpZy53cmFwcGVycyB8fCBbXSxcbiAgICAgICAgbW9kZWxPcHRpb25zOiBmaWVsZENvbmZpZy5tb2RlbE9wdGlvbnMgfHwgdGhpcy5maWVsZC5tb2RlbE9wdGlvbnMgfHwge30sXG4gICAgICAgIHZhbGlkYXRvcnM6IGZpZWxkQ29uZmlnLnZhbGlkYXRvcnMgfHwgdGhpcy5maWVsZC52YWxpZGF0b3JzIHx8IHt9LFxuICAgICAgICBhc3luY1ZhbGlkYXRvcnM6XG4gICAgICAgICAgZmllbGRDb25maWcuYXN5bmNWYWxpZGF0b3JzIHx8IHRoaXMuZmllbGQuYXN5bmNWYWxpZGF0b3JzIHx8IHt9LFxuICAgICAgICBob29rczogZmllbGRDb25maWcuaG9va3MgfHwgdGhpcy5maWVsZC5ob29rcyB8fCB7fSxcbiAgICAgICAgZXhwcmVzc2lvbnM6IGZpZWxkQ29uZmlnLmV4cHJlc3Npb25zIHx8IHRoaXMuZmllbGQuZXhwcmVzc2lvbnMgfHwge30sXG4gICAgICAgIGhpZGU6IGZpZWxkQ29uZmlnLmhpZGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkQ29uZmlnLmhpZGUgOiBmYWxzZSxcbiAgICAgICAgY2xhc3NOYW1lOiBmaWVsZENvbmZpZy5jbGFzc05hbWUgfHwgdGhpcy5maWVsZC5jbGFzc05hbWUgfHwgJycsXG4gICAgICAgIGZpZWxkR3JvdXBDbGFzc05hbWU6XG4gICAgICAgICAgZmllbGRDb25maWcuZmllbGRHcm91cENsYXNzTmFtZSB8fFxuICAgICAgICAgIHRoaXMuZmllbGQuZmllbGRHcm91cENsYXNzTmFtZSB8fFxuICAgICAgICAgICcnLFxuICAgICAgICBwYXJlbnQ6IHRoaXMuZmllbGQucGFyZW50LFxuICAgICAgICBvcHRpb25zOiB0aGlzLmZpZWxkLm9wdGlvbnMsXG4gICAgICAgIG1vZGVsOiB0aGlzLmZpZWxkLm1vZGVsLFxuICAgICAgICBmb3JtOiB0aGlzLmZpZWxkLmZvcm0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGRldGVybWluZUluaXRpYWxTdGF0ZSgpIHtcbiAgICAvLyBBdXRvLW9wZW4gaGVscGVyIGJhc2VkIG9uIHNjb3JpbmcgY3JpdGVyaWFcbiAgICBzd2l0Y2ggKHRoaXMudG9bJ3Njb3JpbmcnXT8uWydjcml0ZXJpYSddKSB7XG4gICAgICBjYXNlICdleGFjdE1hdGNoJzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy50b1snc2NvcmluZyddPy5bJ2Fuc3dlciddKSkge1xuICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aXNlbGVjdCBjYXNlIHdoZXJlIGFuc3dlciBpcyBhbHNvIGFuIGFycmF5XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcmlnaW5hbFZhbHVlKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbm90IGVtcHR5IEFORCBhbGwgc2VsZWN0ZWQgYW5zd2VycyBhcmUgaW4gZXhwZWN0ZWQgYW5zd2Vyc1xuICAgICAgICAgICAgY29uc3QgaXNDb3JyZWN0ID0gdGhpcy5vcmlnaW5hbFZhbHVlLmxlbmd0aCA+IDAgJiYgXG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZS5ldmVyeShhID0+IHRoaXMudG9bJ3Njb3JpbmcnXT8uWydhbnN3ZXInXS5pbmNsdWRlcyhhKSk7XG4gICAgICAgICAgICBpZiAoIWlzQ29ycmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgdmFsdWUgY2FzZVxuICAgICAgICAgICAgaWYgKCF0aGlzLnRvWydzY29yaW5nJ10/LlsnYW5zd2VyJ10uaW5jbHVkZXModGhpcy5vcmlnaW5hbFZhbHVlKSkge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmFuZ2UnOlxuICAgICAgICBjb25zdCBhbnN3ZXIgPSB0aGlzLm9yaWdpbmFsVmFsdWU7XG4gICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiBhbnN3ZXIgPT09ICdudW1iZXInID8gYW5zd2VyIDogTnVtYmVyKGFuc3dlcik7XG5cbiAgICAgICAgY29uc3QgY29ycmVjdCA9XG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG51bSkgJiZcbiAgICAgICAgICBudW0gPj0gdGhpcy50b1snc2NvcmluZyddPy5bJ2Fuc3dlciddLm1pbiAmJlxuICAgICAgICAgIG51bSA8PSB0aGlzLnRvWydzY29yaW5nJ10/LlsnYW5zd2VyJ10ubWF4O1xuXG4gICAgICAgIGlmICghY29ycmVjdCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2V0Q29ycmVjdFZhbHVlKCkge1xuICAgIGNvbnN0IGN1cnJlbnRIZWxwZXJWYWx1ZSA9IHRoaXMuY3VycmVudEhlbHBlclZhbHVlO1xuXG4gICAgLy8gSWYgaGVscGVyIGFscmVhZHkgaGFzIGEgdmFsdWUgKHVzZXIgZWRpdGVkKSwgZG9uJ3Qgb3ZlcnJpZGVcbiAgICBpZiAoY3VycmVudEhlbHBlclZhbHVlICYmIGN1cnJlbnRIZWxwZXJWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnRvWydzY29yaW5nJ10/LlsnY3JpdGVyaWEnXSkge1xuICAgICAgY2FzZSAnYXR0ZW1wdGVkJzpcbiAgICAgICAgLy8gRm9yIGF0dGVtcHRlZCwgc2V0IGRlZmF1bHRIZWxwZXJUZXh0XG4gICAgICAgIHRoaXMuaGVscGVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXhhY3RNYXRjaCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudG9bJ3Njb3JpbmcnXT8uWydhbnN3ZXInXSkpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgbXVsdGlzZWxlY3QgY2FzZSB3aGVyZSBhbnN3ZXIgaXMgYWxzbyBhbiBhcnJheVxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3JpZ2luYWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIG5vdCBlbXB0eSBBTkQgYWxsIHNlbGVjdGVkIGFuc3dlcnMgYXJlIGluIGV4cGVjdGVkIGFuc3dlcnNcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ycmVjdCA9IHRoaXMub3JpZ2luYWxWYWx1ZS5sZW5ndGggPiAwICYmIFxuICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsVmFsdWUuZXZlcnkoYSA9PiB0aGlzLnRvWydzY29yaW5nJ10/LlsnYW5zd2VyJ10uaW5jbHVkZXMoYSkpO1xuICAgICAgICAgICAgaWYgKGlzQ29ycmVjdCkge1xuICAgICAgICAgICAgICAvLyBBbnN3ZXIgaXMgY29ycmVjdCAtIHNldCBlbXB0eSB2YWx1ZSBpbiBoZWxwZXJcbiAgICAgICAgICAgICAgdGhpcy5oZWxwZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBBbnN3ZXIgaXMgaW5jb3JyZWN0IC0gc2V0IGRlZmF1bHRIZWxwZXJUZXh0IGluIGhlbHBlclxuICAgICAgICAgICAgICB0aGlzLmhlbHBlckZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZGVmYXVsdEhlbHBlclRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgdmFsdWUgY2FzZVxuICAgICAgICAgICAgaWYgKHRoaXMudG9bJ3Njb3JpbmcnXT8uWydhbnN3ZXInXS5pbmNsdWRlcyh0aGlzLm9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIEFuc3dlciBpcyBjb3JyZWN0IC0gc2V0IGVtcHR5IHZhbHVlIGluIGhlbHBlclxuICAgICAgICAgICAgICB0aGlzLmhlbHBlckZvcm1Db250cm9sLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEFuc3dlciBpcyBpbmNvcnJlY3QgLSBzZXQgZGVmYXVsdEhlbHBlclRleHQgaW4gaGVscGVyXG4gICAgICAgICAgICAgIHRoaXMuaGVscGVyRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5kZWZhdWx0SGVscGVyVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgIGNvbnN0IGFuc3dlciA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgY29uc3QgbnVtID0gdHlwZW9mIGFuc3dlciA9PT0gJ251bWJlcicgPyBhbnN3ZXIgOiBOdW1iZXIoYW5zd2VyKTtcblxuICAgICAgICBjb25zdCBjb3JyZWN0ID1cbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUobnVtKSAmJlxuICAgICAgICAgIG51bSA+PSB0aGlzLnRvWydzY29yaW5nJ10/LlsnYW5zd2VyJ10ubWluICYmXG4gICAgICAgICAgbnVtIDw9IHRoaXMudG9bJ3Njb3JpbmcnXT8uWydhbnN3ZXInXS5tYXg7XG5cbiAgICAgICAgaWYgKGNvcnJlY3QpIHtcbiAgICAgICAgICAvLyBBbnN3ZXIgaXMgY29ycmVjdCAtIHNldCBlbXB0eSB2YWx1ZSBpbiBoZWxwZXJcbiAgICAgICAgICB0aGlzLmhlbHBlckZvcm1Db250cm9sLnNldFZhbHVlKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbnN3ZXIgaXMgaW5jb3JyZWN0IC0gc2V0IGRlZmF1bHRIZWxwZXJUZXh0IGluIGhlbHBlclxuICAgICAgICAgIHRoaXMuaGVscGVyRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5kZWZhdWx0SGVscGVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,139 +0,0 @@
1
- import { Component, computed, inject, model, signal } from "@angular/core";
2
- import { FieldType } from "@ngx-formly/material";
3
- import { FormControl, FormsModule, ReactiveFormsModule } from "@angular/forms";
4
- import { MatFormFieldModule } from "@angular/material/form-field";
5
- import { MatInputModule } from "@angular/material/input";
6
- import { MatAutocompleteModule } from "@angular/material/autocomplete";
7
- import { AsyncPipe, CommonModule } from "@angular/common";
8
- import { FormlyModule } from "@ngx-formly/core";
9
- import { MatChipsModule } from "@angular/material/chips";
10
- import { LiveAnnouncer } from "@angular/cdk/a11y";
11
- import { MatIconModule } from "@angular/material/icon";
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/forms";
14
- import * as i2 from "@angular/material/form-field";
15
- import * as i3 from "@angular/material/autocomplete";
16
- import * as i4 from "@angular/material/core";
17
- import * as i5 from "@ngx-formly/core";
18
- import * as i6 from "@angular/material/chips";
19
- import * as i7 from "@angular/material/icon";
20
- import * as i8 from "@angular/common";
21
- export class MultiSelectAutocompleteComponent extends FieldType {
22
- constructor() {
23
- super(...arguments);
24
- this.currentState = model("");
25
- this.chipsArr = signal([]);
26
- this.announcer = inject(LiveAnnouncer);
27
- this.itemControl = new FormControl();
28
- this.filteredStates = computed(() => {
29
- const currentState = this.currentState().toLowerCase();
30
- this.tempArr = this.props.options;
31
- this.tempArr = this.tempArr?.filter((state) => !this.formControl.value.includes(state));
32
- return currentState
33
- ? this.tempArr?.filter((state) => state.toLowerCase().includes(currentState))
34
- : this.tempArr?.slice();
35
- });
36
- }
37
- removeChip(i) {
38
- const value = this.formControl.value;
39
- this.formControl.setValue([
40
- ...value.slice(0, i),
41
- ...value.slice(i + 1, value.length)
42
- ]);
43
- this.formControl.markAsTouched();
44
- }
45
- selectedChip(event) {
46
- const data = [
47
- ...this.itemControl.value,
48
- event.option.viewValue,
49
- ];
50
- this.formControl.setValue([...new Set(data)]);
51
- this.itemControl.setValue("");
52
- this.currentState.set("");
53
- }
54
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
55
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MultiSelectAutocompleteComponent, isStandalone: true, selector: "mu-formly-autocomplete-type", inputs: { currentState: { classPropertyName: "currentState", publicName: "currentState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { currentState: "currentStateChange" }, usesInheritance: true, ngImport: i0, template: `
56
- <mat-chip-grid
57
- #chipGrid
58
- [formControl]="itemControl"
59
- [formlyAttributes]="field"
60
- >
61
- @for (chip of formControl.value; track $index; let i= $index) {
62
- <mat-chip-row (removed)="removeChip(i)">
63
- {{ chip }}
64
- <button matChipRemove [attr.aria-label]="'remove ' + chip">
65
- <mat-icon>cancel</mat-icon>
66
- </button>
67
- </mat-chip-row>
68
- }
69
- </mat-chip-grid>
70
- <input
71
- [(ngModel)]="currentState"
72
- [matChipInputFor]="chipGrid"
73
- [matAutocomplete]="auto"
74
- />
75
- <mat-autocomplete
76
- #auto="matAutocomplete"
77
- (optionSelected)="selectedChip($event)"
78
- >
79
- @for (state of filteredStates(); track state) {
80
- <mat-option [value]="state">{{ state }}</mat-option>
81
- }
82
- </mat-autocomplete>
83
- <mat-error *ngIf="formControl.invalid && formControl.touched">
84
- {{ field.validation?.messages?.['required'] }}
85
- </mat-error>
86
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "directive", type: i5.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
87
- }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectAutocompleteComponent, decorators: [{
89
- type: Component,
90
- args: [{
91
- selector: "mu-formly-autocomplete-type",
92
- standalone: true,
93
- imports: [
94
- FormsModule,
95
- MatFormFieldModule,
96
- MatInputModule,
97
- MatAutocompleteModule,
98
- ReactiveFormsModule,
99
- AsyncPipe,
100
- FormlyModule,
101
- MatChipsModule,
102
- MatIconModule,
103
- CommonModule
104
- ],
105
- template: `
106
- <mat-chip-grid
107
- #chipGrid
108
- [formControl]="itemControl"
109
- [formlyAttributes]="field"
110
- >
111
- @for (chip of formControl.value; track $index; let i= $index) {
112
- <mat-chip-row (removed)="removeChip(i)">
113
- {{ chip }}
114
- <button matChipRemove [attr.aria-label]="'remove ' + chip">
115
- <mat-icon>cancel</mat-icon>
116
- </button>
117
- </mat-chip-row>
118
- }
119
- </mat-chip-grid>
120
- <input
121
- [(ngModel)]="currentState"
122
- [matChipInputFor]="chipGrid"
123
- [matAutocomplete]="auto"
124
- />
125
- <mat-autocomplete
126
- #auto="matAutocomplete"
127
- (optionSelected)="selectedChip($event)"
128
- >
129
- @for (state of filteredStates(); track state) {
130
- <mat-option [value]="state">{{ state }}</mat-option>
131
- }
132
- </mat-autocomplete>
133
- <mat-error *ngIf="formControl.invalid && formControl.touched">
134
- {{ field.validation?.messages?.['required'] }}
135
- </mat-error>
136
- `,
137
- }]
138
- }] });
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LWF1dG9jb21wbGV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tbGliL3NyYy9saWIvdHlwZXMvbXVsdGktc2VsZWN0LWF1dG9jb21wbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHFCQUFxQixFQUFnQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7O0FBa0R2RCxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsU0FBMEI7SUFoRGhGOztRQWlEVyxpQkFBWSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixhQUFRLEdBQUcsTUFBTSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFM0MsZ0JBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRXZCLG1CQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdGLE9BQU8sWUFBWTtnQkFDZixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUNwQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUMzQztnQkFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztLQXNCTjtJQW5CQyxVQUFVLENBQUMsQ0FBSztRQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQ3hCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQW1DO1FBQzlDLE1BQU0sSUFBSSxHQUFJO1lBQ1osR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDekIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTO1NBQ3ZCLENBQUE7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBcENVLGdDQUFnQzttR0FBaEMsZ0NBQWdDLHdUQWpDakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQlQsMkRBMUNDLFdBQVcsOG1CQUNYLGtCQUFrQiwySEFDbEIsY0FBYyw4QkFDZCxxQkFBcUIsdzFCQUNyQixtQkFBbUIsaU5BRW5CLFlBQVkscUpBQ1osY0FBYyw0dUJBQ2QsYUFBYSxtTEFDYixZQUFZOzs0RkFtQ0gsZ0NBQWdDO2tCQWhENUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNkJBQTZCO29CQUN2QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFO3dCQUNQLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLHFCQUFxQjt3QkFDckIsbUJBQW1CO3dCQUNuQixTQUFTO3dCQUNULFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7cUJBQ2I7b0JBQ0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBtb2RlbCwgT25Jbml0LCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L21hdGVyaWFsXCI7XG5pbXBvcnQgeyBGaWVsZFR5cGVDb25maWcgfSBmcm9tIFwiQG5neC1mb3JtbHkvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcbmltcG9ydCB7IEFzeW5jUGlwZSwgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybWx5TW9kdWxlIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L2NvcmVcIjtcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoaXBzXCI7XG5pbXBvcnQgeyBMaXZlQW5ub3VuY2VyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm11LWZvcm1seS1hdXRvY29tcGxldGUtdHlwZVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBGb3JtbHlNb2R1bGUsXG4gICAgTWF0Q2hpcHNNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bWF0LWNoaXAtZ3JpZFxuICAgICAgI2NoaXBHcmlkXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiaXRlbUNvbnRyb2xcIlxuICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxuICAgID5cbiAgICAgIEBmb3IgKGNoaXAgb2YgZm9ybUNvbnRyb2wudmFsdWU7IHRyYWNrICRpbmRleDsgbGV0IGk9ICRpbmRleCkge1xuICAgICAgPG1hdC1jaGlwLXJvdyAocmVtb3ZlZCk9XCJyZW1vdmVDaGlwKGkpXCI+XG4gICAgICAgIHt7IGNoaXAgfX1cbiAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3JlbW92ZSAnICsgY2hpcFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgfVxuICAgIDwvbWF0LWNoaXAtZ3JpZD5cbiAgICA8aW5wdXRcbiAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudFN0YXRlXCJcbiAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIlxuICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAvPlxuICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWRDaGlwKCRldmVudClcIlxuICAgID5cbiAgICAgIEBmb3IgKHN0YXRlIG9mIGZpbHRlcmVkU3RhdGVzKCk7IHRyYWNrIHN0YXRlKSB7XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwic3RhdGVcIj57eyBzdGF0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgIH1cbiAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Db250cm9sLmludmFsaWQgJiYgZm9ybUNvbnRyb2wudG91Y2hlZFwiPlxuICAgICAgICB7eyBmaWVsZC52YWxpZGF0aW9uPy5tZXNzYWdlcz8uWydyZXF1aXJlZCddIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0QXV0b2NvbXBsZXRlQ29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlPEZpZWxkVHlwZUNvbmZpZz4ge1xuICByZWFkb25seSBjdXJyZW50U3RhdGUgPSBtb2RlbChcIlwiKTtcbiAgcmVhZG9ubHkgY2hpcHNBcnIgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcbiAgcmVhZG9ubHkgYW5ub3VuY2VyID0gaW5qZWN0KExpdmVBbm5vdW5jZXIpO1xuICB0ZW1wQXJyOiBhbnk7XG4gIGl0ZW1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG5cbiAgcmVhZG9ubHkgZmlsdGVyZWRTdGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5jdXJyZW50U3RhdGUoKS50b0xvd2VyQ2FzZSgpOyAgICBcbiAgICB0aGlzLnRlbXBBcnIgPSB0aGlzLnByb3BzLm9wdGlvbnM7XG4gICAgdGhpcy50ZW1wQXJyID0gdGhpcy50ZW1wQXJyPy5maWx0ZXIoKHN0YXRlOiBhbnkpID0+ICF0aGlzLmZvcm1Db250cm9sLnZhbHVlLmluY2x1ZGVzKHN0YXRlKSk7XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZVxuICAgICAgICA/IHRoaXMudGVtcEFycj8uZmlsdGVyKChzdGF0ZTogYW55KSA9PlxuICAgICAgICAgIHN0YXRlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY3VycmVudFN0YXRlKVxuICAgICAgICApXG4gICAgICAgIDogdGhpcy50ZW1wQXJyPy5zbGljZSgpO1xuICAgIH0pO1xuXG5cbiAgcmVtb3ZlQ2hpcChpOmFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTsgICAgXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShbXG4gICAgICAuLi52YWx1ZS5zbGljZSgwLCBpKSxcbiAgICAgIC4uLnZhbHVlLnNsaWNlKGkgKyAxLCB2YWx1ZS5sZW5ndGgpXG4gICAgXSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCkgIFxuICB9XG5cbiAgc2VsZWN0ZWRDaGlwKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9ICBbXG4gICAgICAuLi50aGlzLml0ZW1Db250cm9sLnZhbHVlLFxuICAgICAgZXZlbnQub3B0aW9uLnZpZXdWYWx1ZSxcbiAgICBdXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShbLi4ubmV3IFNldChkYXRhKV0pO1xuICAgIHRoaXMuaXRlbUNvbnRyb2wuc2V0VmFsdWUoXCJcIik7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuc2V0KFwiXCIpO1xuICB9XG5cbn1cbiJdfQ==