@olafvv/ngx-dynamic-form 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +326 -3
- package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +6 -15
- package/esm2022/lib/components/dynamic-form-field/dynamic-form-field.component.mjs +17 -13
- package/esm2022/lib/controls/button/dynamic-button.component.mjs +5 -6
- package/esm2022/lib/controls/button/dynamic-button.model.mjs +2 -3
- package/esm2022/lib/controls/button-toggles/dynamic-button-toggles.component.mjs +6 -6
- package/esm2022/lib/controls/button-toggles/dynamic-button-toggles.model.mjs +1 -3
- package/esm2022/lib/controls/checkbox/dynamic-checkbox.component.mjs +3 -3
- package/esm2022/lib/controls/controls.mjs +2 -1
- package/esm2022/lib/controls/datepicker/dynamic-datepicker.component.mjs +31 -0
- package/esm2022/lib/controls/datepicker/dynamic-datepicker.model.mjs +13 -0
- package/esm2022/lib/controls/input/dynamic-input.component.mjs +6 -6
- package/esm2022/lib/controls/input/dynamic-input.model.mjs +2 -1
- package/esm2022/lib/controls/radio-group/dynamic-radio-group.component.mjs +6 -6
- package/esm2022/lib/controls/readonly/dynamic-readonly.component.mjs +3 -3
- package/esm2022/lib/controls/select/dynamic-select.component.mjs +6 -9
- package/esm2022/lib/controls/textarea/dynamic-textarea.component.mjs +6 -6
- package/esm2022/lib/controls/textarea/dynamic-textarea.model.mjs +2 -1
- package/esm2022/lib/models/classes/dynamic-form-field-base.mjs +1 -1
- package/esm2022/lib/models/classes/dynamic-form-field-model.mjs +9 -2
- package/esm2022/lib/models/classes/dynamic-form-field-option-model.mjs +1 -1
- package/esm2022/lib/models/classes/dynamic-form-validators.mjs +21 -21
- package/esm2022/lib/models/constants/dynamic-relations.const.mjs +1 -1
- package/esm2022/lib/models/interfaces/dynamic-form-field-config.interface.mjs +1 -1
- package/esm2022/lib/models/interfaces/dynamic-form-field-relation.interface.mjs +1 -1
- package/esm2022/lib/services/dynamic-form-relations.service.mjs +13 -9
- package/esm2022/lib/services/dynamic-form.service.mjs +5 -5
- package/esm2022/lib/services/dynamic-validations.service.mjs +4 -4
- package/fesm2022/olafvv-ngx-dynamic-form.mjs +139 -107
- package/fesm2022/olafvv-ngx-dynamic-form.mjs.map +1 -1
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +0 -7
- package/lib/components/dynamic-form-field/dynamic-form-field.component.d.ts +2 -2
- package/lib/controls/button/dynamic-button.model.d.ts +2 -4
- package/lib/controls/button-toggles/dynamic-button-toggles.model.d.ts +1 -7
- package/lib/controls/controls.d.ts +1 -0
- package/lib/controls/datepicker/dynamic-datepicker.component.d.ts +13 -0
- package/lib/controls/datepicker/dynamic-datepicker.model.d.ts +24 -0
- package/lib/controls/input/dynamic-input.model.d.ts +2 -0
- package/lib/controls/select/dynamic-select.component.d.ts +0 -2
- package/lib/controls/textarea/dynamic-textarea.model.d.ts +2 -0
- package/lib/models/classes/dynamic-form-field-model.d.ts +3 -1
- package/lib/models/classes/dynamic-form-validators.d.ts +12 -12
- package/lib/models/constants/dynamic-relations.const.d.ts +9 -1
- package/lib/models/interfaces/dynamic-form-field-config.interface.d.ts +7 -2
- package/lib/models/interfaces/dynamic-form-field-relation.interface.d.ts +9 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,329 @@
|
|
|
1
1
|
# NgxDynamicForm
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This library is to create a form based on a JSON model. The forms is based on the `ReactiveFormsModule` from Angular and contains a set of pre-built form controls using the Angular Material library. Using the built-in form controls is optional, you can use your own components to use as form controls inside the dynamic form. See [Custom Form Controls](#custom-form-controls) form more information.
|
|
4
|
+
|
|
5
|
+
## Table of contents
|
|
6
|
+
|
|
7
|
+
- [Getting Started](#getting-started)
|
|
8
|
+
- [Usage](#usage)
|
|
9
|
+
- [Validators](#validators)
|
|
10
|
+
- [Built-in validators](#built-in-validators)
|
|
11
|
+
- [Custom validators](#custom-validators)
|
|
12
|
+
- [Relations](#relations)
|
|
13
|
+
- [Action type](#action-type)
|
|
14
|
+
- [Conditions](#conditions)
|
|
15
|
+
- [Operator](#operator)
|
|
16
|
+
- [Custom Form Controls](#custom-form-controls)
|
|
17
|
+
|
|
18
|
+
## Getting started
|
|
19
|
+
|
|
20
|
+
##### 1. Make sure to install and configure [Angular Material](https://material.angular.io/guide/getting-started) if you want to use the built-in form controls
|
|
21
|
+
|
|
22
|
+
##### 2. Install the library using npm:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
npm i --save @olafvv/ngx-dynamic-form
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
##### 1. Import the (standalone) component
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { DynamicFormComponent } from 'olafvv/ngx-dynamic-form';
|
|
34
|
+
|
|
35
|
+
@NgModule({
|
|
36
|
+
//...
|
|
37
|
+
imports: [DynamicFormComponent]
|
|
38
|
+
//...
|
|
39
|
+
})
|
|
40
|
+
export class AppModule {}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Or when using a standalone application/components:**
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { DynamicFormComponent } from '@olafvv/ngx-dynamic-form';
|
|
47
|
+
|
|
48
|
+
@Component({
|
|
49
|
+
standalone: true,
|
|
50
|
+
imports: [DynamicFormComponent]
|
|
51
|
+
//...
|
|
52
|
+
})
|
|
53
|
+
export class AppComponent {
|
|
54
|
+
//...
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
##### 2. Define your form configuration
|
|
59
|
+
|
|
60
|
+
Create the JSON configuration for the form. This is a two-dimensional array where each array is a row in the form. So if you want multiple fields next to each other, define them in a single array. See [Form layout](#form-layout) for more information.
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import { DynamicInput, DynamicTextarea, DynamicFormValidators } from '@olafvv/ngx-dynamic-form';
|
|
64
|
+
|
|
65
|
+
export const SAMPLE_FORM: DynamicFormConfig = [
|
|
66
|
+
[
|
|
67
|
+
new DynamicInput({
|
|
68
|
+
name: 'name',
|
|
69
|
+
inputType: 'text',
|
|
70
|
+
label: 'Name'
|
|
71
|
+
})
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
new DynamicInput({
|
|
75
|
+
name: 'email',
|
|
76
|
+
inputType: 'email',
|
|
77
|
+
label: 'Email address'
|
|
78
|
+
})
|
|
79
|
+
],
|
|
80
|
+
[
|
|
81
|
+
new DynamicTextarea({
|
|
82
|
+
name: 'message',
|
|
83
|
+
label: 'Your message',
|
|
84
|
+
maxLength: 200,
|
|
85
|
+
rows: 5
|
|
86
|
+
})
|
|
87
|
+
]
|
|
88
|
+
];
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
##### 3. Create a FormGroup
|
|
92
|
+
|
|
93
|
+
This library provides the service `DynamicFormService` which you can use to create a FormGroup based on the created form configuration.
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { SAMPLE_FORM } from './sample-form.ts';
|
|
97
|
+
import { DynamicFormService } from '@olafvv/ngx-dynamic-form;
|
|
98
|
+
|
|
99
|
+
@Component({
|
|
100
|
+
//...
|
|
101
|
+
})
|
|
102
|
+
export class AppComponent {
|
|
103
|
+
sampleFormConfig: DynamicFormConfig = SAMPLE_FORM;
|
|
104
|
+
sampleFormGroup: FormGroup<SampleFormModel> = this.dynamicFormService.createFormGroup(this.sampleFormConfig);
|
|
105
|
+
|
|
106
|
+
constructor(private dynamicFormService: DynamicFormService) {}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
##### 4. Add the `dynamic-form` inside the template
|
|
111
|
+
|
|
112
|
+
To add the form to your template, you have to use the selector `<dynamic-form></dynamic-form>` and pass the FormGroup and configuration as inputs:
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<form [formGroup]="sampleFormGroup">
|
|
116
|
+
<dynamic-form [group]="sampleFormGroup" [formConfig]="sampleFormConfig">
|
|
117
|
+
</form>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Validators
|
|
121
|
+
|
|
122
|
+
This library comes with a set of built-in validators, based on the [Angular Validators](https://angular.dev/api/forms/Validators). All provided validators are static methods inside the class `DynamicFormValidators`, each returning a `DynamicFormValidator` (e.g. `DynamicFormValidators.required()`).
|
|
123
|
+
|
|
124
|
+
To use the validators, pass them inside the validators array of the field configuration:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { DynamicFormValidators } from '@olafvv/ngx-dynamic-form';
|
|
128
|
+
|
|
129
|
+
export const SAMPLE_FORM = [
|
|
130
|
+
[
|
|
131
|
+
new DynamicFormInput({
|
|
132
|
+
//..
|
|
133
|
+
validators: [DynamicFormValidators.required('Custom error message')]
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
];
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
#### Built-in validators
|
|
140
|
+
|
|
141
|
+
Each validator has at least the optional parameter for a custom error message. If you don't provided one, the library will place a generic error message (e.g. for required: 'This field is required').
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
class DynamicFormValidators {
|
|
145
|
+
// Validator that requires the control's value to be less than or equal to the provided number.
|
|
146
|
+
static email(errorMessage?: string): DynamicFormValidator;
|
|
147
|
+
// Validator that requires the control's value to be greater than or equal to the provided number.
|
|
148
|
+
static min(min: number, errorMessage?: string): DynamicFormValidator;
|
|
149
|
+
// Validator that requires the control's value to be less than or equal to the provided number.
|
|
150
|
+
static max(max: number, errorMessage?: string): DynamicFormValidator;
|
|
151
|
+
// Validator that requires the length of control's value to be greater than or equal to the provided number.
|
|
152
|
+
static minLength(min: number, errorMessage?: string): DynamicFormValidator;
|
|
153
|
+
// Validator that requires the length of control's value to be less than or equal to the provided number.
|
|
154
|
+
static maxLength(max: number, errorMessage?: string): DynamicFormValidator;
|
|
155
|
+
// Validator that requires the control's value to match the provided pattern.
|
|
156
|
+
static pattern(pattern: string | RexExp, errorMessage?: string): DynamicFormValidator;
|
|
157
|
+
// Validator that requires the control to have a non-empty value.
|
|
158
|
+
static required(errorMessage?: string): DynamicFormValidator;
|
|
159
|
+
// Validator that requires the control's value to be true.
|
|
160
|
+
static requiredTrue(errorMessage?: string): DynamicFormValidator;
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### Custom Validators
|
|
165
|
+
|
|
166
|
+
Adding a custom validator is quite straightforward. All you have to do is to provide an object of the type `DynamicFormValidator` to the validators array of a field with a (unique) name, validatorFn and errorMessage.
|
|
167
|
+
|
|
168
|
+
Read more about creating custom Angular validators on the following page:
|
|
169
|
+
|
|
170
|
+
> https://blog.angular-university.io/angular-custom-validators/
|
|
171
|
+
|
|
172
|
+
E.g. a validator to require a minimum time:
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
function minTimeValidatorFn(minTime: string): ValidatorFn {
|
|
176
|
+
return (control: AbstractControl): ValidationErrors | null => {
|
|
177
|
+
const inputTime = control.value as string;
|
|
178
|
+
|
|
179
|
+
if (!inputTime) return null;
|
|
180
|
+
|
|
181
|
+
const minTimeObj = new Date(`2000-01-01T${minTime}`);
|
|
182
|
+
const inputTimeObj = new Date(`2000-01-01T${inputTime}`);
|
|
183
|
+
|
|
184
|
+
return inputTimeObj >= minTimeObj ? null : { minTime: true };
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export const minTimeValidator: (minTime: string, msg?: string) => DynamicFormValidator = (minTime: string, msg?: string) => ({
|
|
189
|
+
name: 'minTime',
|
|
190
|
+
validator: minTimeValidatorFn(minTime),
|
|
191
|
+
message: msg ?? `Minimale tijd is ${minTime}`
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
import { minTimeValidator } from './min-time-validator.ts';
|
|
197
|
+
|
|
198
|
+
//..
|
|
199
|
+
|
|
200
|
+
const formConfig: DynamicFormConfig = [
|
|
201
|
+
[
|
|
202
|
+
new DynamicInput({
|
|
203
|
+
name: 'time',
|
|
204
|
+
inputType: 'time',
|
|
205
|
+
validators: [minTimeValidator('11:00')]
|
|
206
|
+
})
|
|
207
|
+
]
|
|
208
|
+
];
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Relations
|
|
212
|
+
|
|
213
|
+
Sometimes you want to create certain connections between fields in a form to control their state, based on the value of the other field. This library provides a way to configure these connections,called relations.
|
|
214
|
+
|
|
215
|
+
Each relation is defined on the field that requires a specific state based on one or more conditions. Each relation, a `DynamicFormFieldRelation`, contains an actionType, one or more condition(s) and optionally an operator.
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
interface DynamicFormFieldRelation {
|
|
219
|
+
actionType: RelationActionType;
|
|
220
|
+
conditions: RelationCondition[];
|
|
221
|
+
operator?: RelationOperator;
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
##### Action type
|
|
226
|
+
|
|
227
|
+
The action type is the type of state the field should be when the conditions are met. Right now the library contains three different action types:
|
|
228
|
+
|
|
229
|
+
- Disable/Enable
|
|
230
|
+
- Visible/Hidden
|
|
231
|
+
- Required/Optional
|
|
232
|
+
|
|
233
|
+
To set the type you have to use one of the provided enums:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
enum RelationActionType {
|
|
237
|
+
DISABLED = 'DISABLED',
|
|
238
|
+
ENABLED = 'ENABLED',
|
|
239
|
+
HIDDEN = 'HIDDEN',
|
|
240
|
+
VISIBLE = 'VISIBLE',
|
|
241
|
+
REQUIRED = 'REQUIRED',
|
|
242
|
+
OPTIONAL = 'OPTIONAL'
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
##### Conditions
|
|
247
|
+
|
|
248
|
+
The conditions is an array of `RelationCondition` objects. Each condition contains the name of the field the related field is depended on and a value when the condition is met:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
interface RelationCondition {
|
|
252
|
+
// The name of the field this field is related to
|
|
253
|
+
fieldName: string;
|
|
254
|
+
// A method which has to return a boolean. Returning true means the condition is met
|
|
255
|
+
value: (val: any) => boolean;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
##### Operator
|
|
260
|
+
|
|
261
|
+
The operator is an optional property and determines if all or any one of the conditions have to return true to trigger the required state of the field. By default the value of this property is `RelationOperator.AND` and is only used when there are more than 1 conditions.
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
enum RelationOperator {
|
|
265
|
+
// All conditions have to equal true
|
|
266
|
+
AND = 'AND',
|
|
267
|
+
// On of the conditions have to equal true
|
|
268
|
+
OR = 'OR'
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
##### Example
|
|
273
|
+
|
|
274
|
+
Here is an example of a field called 'passportNumber' which has to be visible when the value of the field named 'documentType' equals to 'passport':
|
|
275
|
+
|
|
276
|
+
```ts
|
|
277
|
+
const formConfig = [
|
|
278
|
+
[
|
|
279
|
+
new DynamicSelect({
|
|
280
|
+
name: 'documentType',
|
|
281
|
+
label: 'Document type',
|
|
282
|
+
options: [
|
|
283
|
+
{ label: 'Passport', value: 'passport' }
|
|
284
|
+
//..
|
|
285
|
+
]
|
|
286
|
+
})
|
|
287
|
+
][
|
|
288
|
+
new DymamicInput({
|
|
289
|
+
name: 'passportNumber',
|
|
290
|
+
label: 'Passport number',
|
|
291
|
+
relations: [
|
|
292
|
+
{
|
|
293
|
+
actionType: RelationActionType.VISIBLE,
|
|
294
|
+
conditions: [
|
|
295
|
+
{
|
|
296
|
+
fieldName: 'documentType',
|
|
297
|
+
value: (val: string) => val === 'passport'
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
})
|
|
303
|
+
]
|
|
304
|
+
];
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Built-in form controls
|
|
308
|
+
|
|
309
|
+
The library comes with a set of built-in form controls, using the Angular Material library. To make use of these you have to make sure to install and configure [Angular Material](https://material.angular.io).
|
|
310
|
+
|
|
311
|
+
The library comes with the following form controls:
|
|
312
|
+
|
|
313
|
+
| Form control name | Description |
|
|
314
|
+
| :---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
315
|
+
| Button | Shows a button inside the form. Can be provided with a label and/or icon. You also provide a callback method for what happens when the button is clicked |
|
|
316
|
+
| Button toggle | Based on the Angular Material component which shows a row of buttons, each holding a value (can be compared to radio buttons). It is possible to select one or multiple options |
|
|
317
|
+
| Checkbox | Shows a checkbox, indicating a true or false value |
|
|
318
|
+
| Input | Text based input using the HTML5 input element with Angular Material styling and animations. |
|
|
319
|
+
| Radio group | Uses the `mat-radio-group` of Angular Material to show a group of radio buttons to select a single option |
|
|
320
|
+
| Readonly | Shows the value of the control without the possibility to interact with it. |
|
|
321
|
+
| Select | Uses the `mat-select` of Angular Material to show a list of options inside a dropdown. |
|
|
322
|
+
| Textarea | The HTML5 `<textarea>` element with enchanced Angular Material styling and animations. |
|
|
323
|
+
|
|
324
|
+
Each control has a basic set of properties (see `DynamicFormFieldConfig`) that can be passed to the control's model. They also have a specific set of properties that only apply to the selected control.
|
|
325
|
+
|
|
326
|
+
## Custom Form Controls
|
|
4
327
|
|
|
5
328
|
Other than the build-in form controls, it is possible to plug in you own custom controls. Start out with creating a custom form control component:
|
|
6
329
|
|
|
@@ -8,14 +331,14 @@ Other than the build-in form controls, it is possible to plug in you own custom
|
|
|
8
331
|
|
|
9
332
|
After that follow the following steps.
|
|
10
333
|
|
|
11
|
-
|
|
334
|
+
#### 1. Create a model
|
|
12
335
|
|
|
13
336
|
First step is to create a model and interface for the custom control containing the control specific properties for the configuration definitions, extending the base interface/model from the library.
|
|
14
337
|
Also, you need to create an (unique) name for the type of the model/.
|
|
15
338
|
|
|
16
339
|
For example if you're creating a control with a slider to select a value between 0 and 10:
|
|
17
340
|
|
|
18
|
-
|
|
341
|
+
##### Interface:
|
|
19
342
|
|
|
20
343
|
The interface extends the base interface `DynamicFormFieldValueConfig` and expects a generic type describing the possible value(s) of the field. In this case that would be a number or null value.
|
|
21
344
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NgClass
|
|
1
|
+
import { NgClass } from '@angular/common';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
3
|
import { ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { DynamicFormService } from '../../services/dynamic-form.service';
|
|
@@ -14,15 +14,6 @@ export class DynamicFormComponent {
|
|
|
14
14
|
get flatFormConfig() {
|
|
15
15
|
return this.formConfig.reduce((acc, curr) => acc.concat(curr), []);
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
* TrackBy Function for performance optimization
|
|
19
|
-
* @param _index
|
|
20
|
-
* @param field
|
|
21
|
-
* @returns
|
|
22
|
-
*/
|
|
23
|
-
trackByFn(_index, field) {
|
|
24
|
-
return field.id;
|
|
25
|
-
}
|
|
26
17
|
/**
|
|
27
18
|
* Get the current value of the form.
|
|
28
19
|
* @param includeDisabledFields Include the disabled fields of the form, is enabled by default
|
|
@@ -47,12 +38,12 @@ export class DynamicFormComponent {
|
|
|
47
38
|
onChange(event) {
|
|
48
39
|
this.change.emit(event);
|
|
49
40
|
}
|
|
50
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
51
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
41
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DynamicFormComponent, isStandalone: true, selector: "dynamic-form", inputs: { group: "group", formConfig: "formConfig" }, outputs: { change: "change" }, providers: [DynamicFormService], ngImport: i0, template: "@for(row of formConfig; track $index) {\n<div class=\"dynamic-form-row\">\n @for(field of row; track field.id) {\n <dynamic-form-field class=\"dynamic-form-field\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [ngClass]=\"[field.type, 'form-field-width-' + field.width]\"\n [group]=\"group\"\n [model]=\"field\"\n (change)=\"onChange($event)\">\n </dynamic-form-field>\n }\n</div>\n}", styles: [".dynamic-form-row{display:flex}.dynamic-form-row .dynamic-form-field{width:100%;margin:4px 0}.dynamic-form-row .dynamic-form-field:not(:last-of-type){margin-right:12px}.dynamic-form-row .dynamic-form-field.button{flex:0}.dynamic-form-row .form-field-width-1{width:1%}.dynamic-form-row .form-field-width-2{width:2%}.dynamic-form-row .form-field-width-3{width:3%}.dynamic-form-row .form-field-width-4{width:4%}.dynamic-form-row .form-field-width-5{width:5%}.dynamic-form-row .form-field-width-6{width:6%}.dynamic-form-row .form-field-width-7{width:7%}.dynamic-form-row .form-field-width-8{width:8%}.dynamic-form-row .form-field-width-9{width:9%}.dynamic-form-row .form-field-width-10{width:10%}.dynamic-form-row .form-field-width-11{width:11%}.dynamic-form-row .form-field-width-12{width:12%}.dynamic-form-row .form-field-width-13{width:13%}.dynamic-form-row .form-field-width-14{width:14%}.dynamic-form-row .form-field-width-15{width:15%}.dynamic-form-row .form-field-width-16{width:16%}.dynamic-form-row .form-field-width-17{width:17%}.dynamic-form-row .form-field-width-18{width:18%}.dynamic-form-row .form-field-width-19{width:19%}.dynamic-form-row .form-field-width-20{width:20%}.dynamic-form-row .form-field-width-21{width:21%}.dynamic-form-row .form-field-width-22{width:22%}.dynamic-form-row .form-field-width-23{width:23%}.dynamic-form-row .form-field-width-24{width:24%}.dynamic-form-row .form-field-width-25{width:25%}.dynamic-form-row .form-field-width-26{width:26%}.dynamic-form-row .form-field-width-27{width:27%}.dynamic-form-row .form-field-width-28{width:28%}.dynamic-form-row .form-field-width-29{width:29%}.dynamic-form-row .form-field-width-30{width:30%}.dynamic-form-row .form-field-width-31{width:31%}.dynamic-form-row .form-field-width-32{width:32%}.dynamic-form-row .form-field-width-33{width:33%}.dynamic-form-row .form-field-width-34{width:34%}.dynamic-form-row .form-field-width-35{width:35%}.dynamic-form-row .form-field-width-36{width:36%}.dynamic-form-row .form-field-width-37{width:37%}.dynamic-form-row .form-field-width-38{width:38%}.dynamic-form-row .form-field-width-39{width:39%}.dynamic-form-row .form-field-width-40{width:40%}.dynamic-form-row .form-field-width-41{width:41%}.dynamic-form-row .form-field-width-42{width:42%}.dynamic-form-row .form-field-width-43{width:43%}.dynamic-form-row .form-field-width-44{width:44%}.dynamic-form-row .form-field-width-45{width:45%}.dynamic-form-row .form-field-width-46{width:46%}.dynamic-form-row .form-field-width-47{width:47%}.dynamic-form-row .form-field-width-48{width:48%}.dynamic-form-row .form-field-width-49{width:49%}.dynamic-form-row .form-field-width-50{width:50%}.dynamic-form-row .form-field-width-51{width:51%}.dynamic-form-row .form-field-width-52{width:52%}.dynamic-form-row .form-field-width-53{width:53%}.dynamic-form-row .form-field-width-54{width:54%}.dynamic-form-row .form-field-width-55{width:55%}.dynamic-form-row .form-field-width-56{width:56%}.dynamic-form-row .form-field-width-57{width:57%}.dynamic-form-row .form-field-width-58{width:58%}.dynamic-form-row .form-field-width-59{width:59%}.dynamic-form-row .form-field-width-60{width:60%}.dynamic-form-row .form-field-width-61{width:61%}.dynamic-form-row .form-field-width-62{width:62%}.dynamic-form-row .form-field-width-63{width:63%}.dynamic-form-row .form-field-width-64{width:64%}.dynamic-form-row .form-field-width-65{width:65%}.dynamic-form-row .form-field-width-66{width:66%}.dynamic-form-row .form-field-width-67{width:67%}.dynamic-form-row .form-field-width-68{width:68%}.dynamic-form-row .form-field-width-69{width:69%}.dynamic-form-row .form-field-width-70{width:70%}.dynamic-form-row .form-field-width-71{width:71%}.dynamic-form-row .form-field-width-72{width:72%}.dynamic-form-row .form-field-width-73{width:73%}.dynamic-form-row .form-field-width-74{width:74%}.dynamic-form-row .form-field-width-75{width:75%}.dynamic-form-row .form-field-width-76{width:76%}.dynamic-form-row .form-field-width-77{width:77%}.dynamic-form-row .form-field-width-78{width:78%}.dynamic-form-row .form-field-width-79{width:79%}.dynamic-form-row .form-field-width-80{width:80%}.dynamic-form-row .form-field-width-81{width:81%}.dynamic-form-row .form-field-width-82{width:82%}.dynamic-form-row .form-field-width-83{width:83%}.dynamic-form-row .form-field-width-84{width:84%}.dynamic-form-row .form-field-width-85{width:85%}.dynamic-form-row .form-field-width-86{width:86%}.dynamic-form-row .form-field-width-87{width:87%}.dynamic-form-row .form-field-width-88{width:88%}.dynamic-form-row .form-field-width-89{width:89%}.dynamic-form-row .form-field-width-90{width:90%}.dynamic-form-row .form-field-width-91{width:91%}.dynamic-form-row .form-field-width-92{width:92%}.dynamic-form-row .form-field-width-93{width:93%}.dynamic-form-row .form-field-width-94{width:94%}.dynamic-form-row .form-field-width-95{width:95%}.dynamic-form-row .form-field-width-96{width:96%}.dynamic-form-row .form-field-width-97{width:97%}.dynamic-form-row .form-field-width-98{width:98%}.dynamic-form-row .form-field-width-99{width:99%}.dynamic-form-row .form-field-width-100{width:100%}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DynamicFormFieldComponent, selector: "dynamic-form-field", inputs: ["model", "group"], outputs: ["change"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
52
43
|
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
54
45
|
type: Component,
|
|
55
|
-
args: [{ standalone: true, imports: [
|
|
46
|
+
args: [{ standalone: true, imports: [NgClass, DynamicFormFieldComponent, ReactiveFormsModule], selector: 'dynamic-form', providers: [DynamicFormService], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for(row of formConfig; track $index) {\n<div class=\"dynamic-form-row\">\n @for(field of row; track field.id) {\n <dynamic-form-field class=\"dynamic-form-field\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [ngClass]=\"[field.type, 'form-field-width-' + field.width]\"\n [group]=\"group\"\n [model]=\"field\"\n (change)=\"onChange($event)\">\n </dynamic-form-field>\n }\n</div>\n}", styles: [".dynamic-form-row{display:flex}.dynamic-form-row .dynamic-form-field{width:100%;margin:4px 0}.dynamic-form-row .dynamic-form-field:not(:last-of-type){margin-right:12px}.dynamic-form-row .dynamic-form-field.button{flex:0}.dynamic-form-row .form-field-width-1{width:1%}.dynamic-form-row .form-field-width-2{width:2%}.dynamic-form-row .form-field-width-3{width:3%}.dynamic-form-row .form-field-width-4{width:4%}.dynamic-form-row .form-field-width-5{width:5%}.dynamic-form-row .form-field-width-6{width:6%}.dynamic-form-row .form-field-width-7{width:7%}.dynamic-form-row .form-field-width-8{width:8%}.dynamic-form-row .form-field-width-9{width:9%}.dynamic-form-row .form-field-width-10{width:10%}.dynamic-form-row .form-field-width-11{width:11%}.dynamic-form-row .form-field-width-12{width:12%}.dynamic-form-row .form-field-width-13{width:13%}.dynamic-form-row .form-field-width-14{width:14%}.dynamic-form-row .form-field-width-15{width:15%}.dynamic-form-row .form-field-width-16{width:16%}.dynamic-form-row .form-field-width-17{width:17%}.dynamic-form-row .form-field-width-18{width:18%}.dynamic-form-row .form-field-width-19{width:19%}.dynamic-form-row .form-field-width-20{width:20%}.dynamic-form-row .form-field-width-21{width:21%}.dynamic-form-row .form-field-width-22{width:22%}.dynamic-form-row .form-field-width-23{width:23%}.dynamic-form-row .form-field-width-24{width:24%}.dynamic-form-row .form-field-width-25{width:25%}.dynamic-form-row .form-field-width-26{width:26%}.dynamic-form-row .form-field-width-27{width:27%}.dynamic-form-row .form-field-width-28{width:28%}.dynamic-form-row .form-field-width-29{width:29%}.dynamic-form-row .form-field-width-30{width:30%}.dynamic-form-row .form-field-width-31{width:31%}.dynamic-form-row .form-field-width-32{width:32%}.dynamic-form-row .form-field-width-33{width:33%}.dynamic-form-row .form-field-width-34{width:34%}.dynamic-form-row .form-field-width-35{width:35%}.dynamic-form-row .form-field-width-36{width:36%}.dynamic-form-row .form-field-width-37{width:37%}.dynamic-form-row .form-field-width-38{width:38%}.dynamic-form-row .form-field-width-39{width:39%}.dynamic-form-row .form-field-width-40{width:40%}.dynamic-form-row .form-field-width-41{width:41%}.dynamic-form-row .form-field-width-42{width:42%}.dynamic-form-row .form-field-width-43{width:43%}.dynamic-form-row .form-field-width-44{width:44%}.dynamic-form-row .form-field-width-45{width:45%}.dynamic-form-row .form-field-width-46{width:46%}.dynamic-form-row .form-field-width-47{width:47%}.dynamic-form-row .form-field-width-48{width:48%}.dynamic-form-row .form-field-width-49{width:49%}.dynamic-form-row .form-field-width-50{width:50%}.dynamic-form-row .form-field-width-51{width:51%}.dynamic-form-row .form-field-width-52{width:52%}.dynamic-form-row .form-field-width-53{width:53%}.dynamic-form-row .form-field-width-54{width:54%}.dynamic-form-row .form-field-width-55{width:55%}.dynamic-form-row .form-field-width-56{width:56%}.dynamic-form-row .form-field-width-57{width:57%}.dynamic-form-row .form-field-width-58{width:58%}.dynamic-form-row .form-field-width-59{width:59%}.dynamic-form-row .form-field-width-60{width:60%}.dynamic-form-row .form-field-width-61{width:61%}.dynamic-form-row .form-field-width-62{width:62%}.dynamic-form-row .form-field-width-63{width:63%}.dynamic-form-row .form-field-width-64{width:64%}.dynamic-form-row .form-field-width-65{width:65%}.dynamic-form-row .form-field-width-66{width:66%}.dynamic-form-row .form-field-width-67{width:67%}.dynamic-form-row .form-field-width-68{width:68%}.dynamic-form-row .form-field-width-69{width:69%}.dynamic-form-row .form-field-width-70{width:70%}.dynamic-form-row .form-field-width-71{width:71%}.dynamic-form-row .form-field-width-72{width:72%}.dynamic-form-row .form-field-width-73{width:73%}.dynamic-form-row .form-field-width-74{width:74%}.dynamic-form-row .form-field-width-75{width:75%}.dynamic-form-row .form-field-width-76{width:76%}.dynamic-form-row .form-field-width-77{width:77%}.dynamic-form-row .form-field-width-78{width:78%}.dynamic-form-row .form-field-width-79{width:79%}.dynamic-form-row .form-field-width-80{width:80%}.dynamic-form-row .form-field-width-81{width:81%}.dynamic-form-row .form-field-width-82{width:82%}.dynamic-form-row .form-field-width-83{width:83%}.dynamic-form-row .form-field-width-84{width:84%}.dynamic-form-row .form-field-width-85{width:85%}.dynamic-form-row .form-field-width-86{width:86%}.dynamic-form-row .form-field-width-87{width:87%}.dynamic-form-row .form-field-width-88{width:88%}.dynamic-form-row .form-field-width-89{width:89%}.dynamic-form-row .form-field-width-90{width:90%}.dynamic-form-row .form-field-width-91{width:91%}.dynamic-form-row .form-field-width-92{width:92%}.dynamic-form-row .form-field-width-93{width:93%}.dynamic-form-row .form-field-width-94{width:94%}.dynamic-form-row .form-field-width-95{width:95%}.dynamic-form-row .form-field-width-96{width:96%}.dynamic-form-row .form-field-width-97{width:97%}.dynamic-form-row .form-field-width-98{width:98%}.dynamic-form-row .form-field-width-99{width:99%}.dynamic-form-row .form-field-width-100{width:100%}\n"] }]
|
|
56
47
|
}], propDecorators: { group: [{
|
|
57
48
|
type: Input,
|
|
58
49
|
args: [{ required: true }]
|
|
@@ -62,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
62
53
|
}], change: [{
|
|
63
54
|
type: Output
|
|
64
55
|
}] } });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWZvcm0vc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsbUJBQW1CLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFLdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBVy9GLE1BQU0sT0FBTyxvQkFBb0I7SUFUakM7UUFhWSxXQUFNLEdBQXdDLElBQUksWUFBWSxFQUFFLENBQUM7S0FzQzVFO0lBcENDOztPQUVHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxZQUFZLENBQWMscUJBQXFCLEdBQUcsSUFBSTtRQUMzRCxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFdEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUFDLElBQVk7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7SUFDNUIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUE0QjtRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDOytHQXpDVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixnSkFIcEIsQ0FBQyxrQkFBa0IsQ0FBQywwQkNoQmpDLDJaQWFDLDRpS0REVyxPQUFPLG9GQUFFLHlCQUF5QiwrR0FBRSxtQkFBbUI7OzRGQU90RCxvQkFBb0I7a0JBVGhDLFNBQVM7aUNBQ0ksSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLG1CQUFtQixDQUFDLFlBQ3hELGNBQWMsYUFHYixDQUFDLGtCQUFrQixDQUFDLG1CQUNkLHVCQUF1QixDQUFDLE1BQU07OEJBR3BCLEtBQUs7c0JBQS9CLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLFVBQVU7c0JBQXBDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVmLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLW1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1maWVsZC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Db25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvdHlwZXMvZHluYW1pYy1mb3JtLWNvbmZpZy50eXBlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWZvcm0tZmllbGQvZHluYW1pYy1mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdDbGFzcywgRHluYW1pY0Zvcm1GaWVsZENvbXBvbmVudCwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHNlbGVjdG9yOiAnZHluYW1pYy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9keW5hbWljLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbRHluYW1pY0Zvcm1TZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGZvcm1Db25maWchOiBEeW5hbWljRm9ybUNvbmZpZztcblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1GaWVsZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogR2V0IHRoZSBmb3JtQ29uZmlnIGFzIGZsYXQgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZsYXRGb3JtQ29uZmlnKCk6IER5bmFtaWNGb3JtRmllbGRNb2RlbFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuY29uY2F0KGN1cnIpLCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gaW5jbHVkZURpc2FibGVkRmllbGRzIEluY2x1ZGUgdGhlIGRpc2FibGVkIGZpZWxkcyBvZiB0aGUgZm9ybSwgaXMgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0Rm9ybVZhbHVlPFQgPSB1bmtub3duPihpbmNsdWRlRGlzYWJsZWRGaWVsZHMgPSB0cnVlKTogVCB7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gaW5jbHVkZURpc2FibGVkRmllbGRzID8gdGhpcy5ncm91cC5nZXRSYXdWYWx1ZSgpIDogdGhpcy5ncm91cC52YWx1ZTtcblxuICAgIHJldHVybiBmb3JtVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYW4gT2JzZXJ2YWJsZSB0byBsaXN0ZW4gdG8gY2hhbmdlcyBvZiBhIHNwZWNpZmljIGZpZWxkIGluIHRoZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPHVua25vd24+XG4gICAqL1xuICBwdWJsaWMgb25Db250cm9sQ2hhbmdlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncm91cC5nZXQobmFtZSk7XG5cbiAgICBpZiAoIWZpZWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZmllbGQgd2l0aCB0aGUgbmFtZSAke25hbWV9IGluIHRoZSBGb3JtR3JvdXBgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQudmFsdWVDaGFuZ2VzO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBEeW5hbWljRm9ybUZpZWxkRXZlbnQpIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiQGZvcihyb3cgb2YgZm9ybUNvbmZpZzsgdHJhY2sgJGluZGV4KSB7XG48ZGl2IGNsYXNzPVwiZHluYW1pYy1mb3JtLXJvd1wiPlxuICBAZm9yKGZpZWxkIG9mIHJvdzsgdHJhY2sgZmllbGQuaWQpIHtcbiAgPGR5bmFtaWMtZm9ybS1maWVsZCBjbGFzcz1cImR5bmFtaWMtZm9ybS1maWVsZFwiXG4gICAgW2lkXT1cImZpZWxkLmlkXCJcbiAgICBbaGlkZGVuXT1cImZpZWxkLmhpZGRlblwiXG4gICAgW25nQ2xhc3NdPVwiW2ZpZWxkLnR5cGUsICdmb3JtLWZpZWxkLXdpZHRoLScgKyBmaWVsZC53aWR0aF1cIlxuICAgIFtncm91cF09XCJncm91cFwiXG4gICAgW21vZGVsXT1cImZpZWxkXCJcbiAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIj5cbiAgPC9keW5hbWljLWZvcm0tZmllbGQ+XG4gIH1cbjwvZGl2PlxufSJdfQ==
|
|
@@ -8,6 +8,8 @@ import { DynamicButtonComponent } from '../../controls/button/dynamic-button.com
|
|
|
8
8
|
import { DYNAMIC_FORM_FIELD_BUTTON } from '../../controls/button/dynamic-button.model';
|
|
9
9
|
import { DynamicCheckboxComponent } from '../../controls/checkbox/dynamic-checkbox.component';
|
|
10
10
|
import { DYNAMIC_FORM_FIELD_CHECKBOX } from '../../controls/checkbox/dynamic-checkbox.model';
|
|
11
|
+
import { DynamicDatepickerComponent } from '../../controls/datepicker/dynamic-datepicker.component';
|
|
12
|
+
import { DYNAMIC_FORM_FIELD_DATEPICKER } from '../../controls/datepicker/dynamic-datepicker.model';
|
|
11
13
|
import { DynamicInputComponent } from '../../controls/input/dynamic-input.component';
|
|
12
14
|
import { DYNAMIC_FORM_FIELD_INPUT } from '../../controls/input/dynamic-input.model';
|
|
13
15
|
import { DymamicRadioGroupComponent } from '../../controls/radio-group/dynamic-radio-group.component';
|
|
@@ -26,9 +28,9 @@ import * as i1 from "@angular/forms";
|
|
|
26
28
|
export class DynamicFormFieldComponent {
|
|
27
29
|
constructor() {
|
|
28
30
|
this.change = new EventEmitter();
|
|
29
|
-
this._subs = new Subscription();
|
|
30
31
|
this.dynamicFormService = inject(DynamicFormService);
|
|
31
32
|
this.relationService = inject(DynamicFormRelationsService);
|
|
33
|
+
this._subs = new Subscription();
|
|
32
34
|
}
|
|
33
35
|
/** Get the instance of a control component using the injected custom method or local method */
|
|
34
36
|
get componentType() {
|
|
@@ -50,22 +52,24 @@ export class DynamicFormFieldComponent {
|
|
|
50
52
|
*/
|
|
51
53
|
getControlComponentType() {
|
|
52
54
|
switch (this.model.type) {
|
|
55
|
+
case DYNAMIC_FORM_FIELD_BUTTON:
|
|
56
|
+
return DynamicButtonComponent;
|
|
57
|
+
case DYNAMIC_FORM_FIELD_BUTTON_TOGGLES:
|
|
58
|
+
return DynamicButtonTogglesComponent;
|
|
53
59
|
case DYNAMIC_FORM_FIELD_CHECKBOX:
|
|
54
60
|
return DynamicCheckboxComponent;
|
|
61
|
+
case DYNAMIC_FORM_FIELD_DATEPICKER:
|
|
62
|
+
return DynamicDatepickerComponent;
|
|
55
63
|
case DYNAMIC_FORM_FIELD_INPUT:
|
|
56
64
|
return DynamicInputComponent;
|
|
57
|
-
case
|
|
58
|
-
return
|
|
65
|
+
case DYNAMIC_FORM_FIELD_RADIO_GROUP:
|
|
66
|
+
return DymamicRadioGroupComponent;
|
|
59
67
|
case DYNAMIC_FORM_FIELD_READONLY:
|
|
60
68
|
return DynamicReadonlyComponent;
|
|
61
69
|
case DYNAMIC_FORM_FIELD_SELECT:
|
|
62
70
|
return DynamicSelectComponent;
|
|
63
|
-
case
|
|
64
|
-
return
|
|
65
|
-
case DYNAMIC_FORM_FIELD_BUTTON_TOGGLES:
|
|
66
|
-
return DynamicButtonTogglesComponent;
|
|
67
|
-
case DYNAMIC_FORM_FIELD_RADIO_GROUP:
|
|
68
|
-
return DymamicRadioGroupComponent;
|
|
71
|
+
case DYNAMIC_FORM_FIELD_TEXTAREA:
|
|
72
|
+
return DynamicTextareaComponent;
|
|
69
73
|
default:
|
|
70
74
|
console.warn(`Model of type 'dynamic-${this.model.type}' is not implemented yet. Add this type to dynamic-form-field.component.ts to add support`);
|
|
71
75
|
return null;
|
|
@@ -128,10 +132,10 @@ export class DynamicFormFieldComponent {
|
|
|
128
132
|
createDynamicFormEvent(event, type) {
|
|
129
133
|
return { event, type, control: this._control, form: this.group, model: this.model };
|
|
130
134
|
}
|
|
131
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
132
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
135
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
136
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DynamicFormFieldComponent, isStandalone: true, selector: "dynamic-form-field", inputs: { model: "model", group: "group" }, outputs: { change: "change" }, viewQueries: [{ propertyName: "componentViewContainer", first: true, predicate: ["componentViewContainer"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div [formGroup]=\"group\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model.type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
133
137
|
}
|
|
134
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicFormFieldComponent, decorators: [{
|
|
135
139
|
type: Component,
|
|
136
140
|
args: [{ standalone: true, imports: [NgClass, ReactiveFormsModule], selector: 'dynamic-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [formGroup]=\"group\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model.type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>" }]
|
|
137
141
|
}], propDecorators: { componentViewContainer: [{
|
|
@@ -144,4 +148,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
144
148
|
}], change: [{
|
|
145
149
|
type: Output
|
|
146
150
|
}] } });
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWZvcm0vc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS1maWVsZC9keW5hbWljLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtLWZpZWxkL2R5bmFtaWMtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUF3QyxNQUFNLGdCQUFnQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDL0csT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOENBQThDLENBQUM7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LHlCQUF5QjttR0FBekIseUJBQXlCLHNRQUNTLGdCQUFnQiwyQ0NoRC9ELG9MQUdNLDRDRHVDTSxPQUFPLG1GQUFFLG1CQUFtQjs7NEZBSzNCLHlCQUF5QjtrQkFQckMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsWUFDN0Isb0JBQW9CLG1CQUViLHVCQUF1QixDQUFDLE1BQU07OEJBR2dDLHNCQUFzQjtzQkFBcEcsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVwRSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNCdXR0b25Ub2dnbGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uLXRvZ2dsZXMvZHluYW1pYy1idXR0b24tdG9nZ2xlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX0JVVFRPTl9UT0dHTEVTIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uLXRvZ2dsZXMvZHluYW1pYy1idXR0b24tdG9nZ2xlcy5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uL2R5bmFtaWMtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEWU5BTUlDX0ZPUk1fRklFTERfQlVUVE9OIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uL2R5bmFtaWMtYnV0dG9uLm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL2NoZWNrYm94L2R5bmFtaWMtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IERZTkFNSUNfRk9STV9GSUVMRF9DSEVDS0JPWCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL2NoZWNrYm94L2R5bmFtaWMtY2hlY2tib3gubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvaW5wdXQvZHluYW1pYy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX0lOUFVUIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvaW5wdXQvZHluYW1pYy1pbnB1dC5tb2RlbCc7XG5pbXBvcnQgeyBEeW1hbWljUmFkaW9Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3JhZGlvLWdyb3VwL2R5bmFtaWMtcmFkaW8tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IERZTkFNSUNfRk9STV9GSUVMRF9SQURJT19HUk9VUCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3JhZGlvLWdyb3VwL2R5bmFtaWMtcmFkaW8tZ3JvdXAubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY1JlYWRvbmx5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvcmVhZG9ubHkvZHluYW1pYy1yZWFkb25seS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX1JFQURPTkxZIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvcmVhZG9ubHkvZHluYW1pYy1yZWFkb25seS5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvc2VsZWN0L2R5bmFtaWMtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEWU5BTUlDX0ZPUk1fRklFTERfU0VMRUNUIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvc2VsZWN0L2R5bmFtaWMtc2VsZWN0Lm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3RleHRhcmVhL2R5bmFtaWMtdGV4dGFyZWEuY29tcG9uZW50JztcbmltcG9ydCB7IERZTkFNSUNfRk9STV9GSUVMRF9URVhUQVJFQSB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3RleHRhcmVhL2R5bmFtaWMtdGV4dGFyZWEubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZCB9IGZyb20gJy4uLy4uL21vZGVscy9jbGFzc2VzL2R5bmFtaWMtZm9ybS1maWVsZC1iYXNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9jbGFzc2VzL2R5bmFtaWMtZm9ybS1maWVsZC1tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkVmFsdWVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9jbGFzc2VzL2R5bmFtaWMtZm9ybS1maWVsZC12YWx1ZS1tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkRXZlbnQsIER5bmFtaWNGb3JtRmllbGRFdmVudFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZmllbGQtZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlbGF0ZWRGb3JtQ29udHJvbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvdHlwZXMvcmVsYXRlZC1mb3JtLWNvbnRyb2xzLnR5cGUnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1SZWxhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHluYW1pYy1mb3JtLXJlbGF0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0NsYXNzLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgc2VsZWN0b3I6ICdkeW5hbWljLWZvcm0tZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtRmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudFZpZXdDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBjb21wb25lbnRWaWV3Q29udGFpbmVyITogVmlld0NvbnRhaW5lclJlZjtcblxuICBASW5wdXQoKSBtb2RlbCE6IER5bmFtaWNGb3JtRmllbGRNb2RlbDtcbiAgQElucHV0KCkgZ3JvdXAhOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtRmllbGRFdmVudD4oKTtcblxuICBwcml2YXRlIF9jb250cm9sITogVW50eXBlZEZvcm1Db250cm9sO1xuICBwcml2YXRlIF9zdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHByaXZhdGUgZHluYW1pY0Zvcm1TZXJ2aWNlID0gaW5qZWN0KER5bmFtaWNGb3JtU2VydmljZSk7XG4gIHByaXZhdGUgcmVsYXRpb25TZXJ2aWNlID0gaW5qZWN0KER5bmFtaWNGb3JtUmVsYXRpb25zU2VydmljZSk7XG5cbiAgLyoqIEdldCB0aGUgaW5zdGFuY2Ugb2YgYSBjb250cm9sIGNvbXBvbmVudCB1c2luZyB0aGUgaW5qZWN0ZWQgY3VzdG9tIG1ldGhvZCBvciBsb2NhbCBtZXRob2QgKi9cbiAgcHJpdmF0ZSBnZXQgY29tcG9uZW50VHlwZSgpOiBUeXBlPER5bmFtaWNGb3JtRmllbGQ+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmdldEN1c3RvbUNvbnRyb2xDb21wb25lbnRUeXBlKHRoaXMubW9kZWwpIHx8IHRoaXMuZ2V0Q29udHJvbENvbXBvbmVudFR5cGUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICB0aGlzLl9jb250cm9sID0gdGhpcy5ncm91cC5nZXQodGhpcy5tb2RlbC5uYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG5cbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xDb21wb25lbnQoKTtcbiAgICAgIHRoaXMuc2V0U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgaW5zdGFuY2Ugb2YgYSBjb250cm9sIGNvbXBvbmVudCBieSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldENvbnRyb2xDb21wb25lbnRUeXBlKCk6IFR5cGU8RHluYW1pY0Zvcm1GaWVsZD4gfCBudWxsIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZWwudHlwZSkge1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfQ0hFQ0tCT1g6XG4gICAgICAgIHJldHVybiBEeW5hbWljQ2hlY2tib3hDb21wb25lbnQ7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9JTlBVVDpcbiAgICAgICAgcmV0dXJuIER5bmFtaWNJbnB1dENvbXBvbmVudDtcbiAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0ZJRUxEX1RFWFRBUkVBOlxuICAgICAgICByZXR1cm4gRHluYW1pY1RleHRhcmVhQ29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfUkVBRE9OTFk6XG4gICAgICAgIHJldHVybiBEeW5hbWljUmVhZG9ubHlDb21wb25lbnQ7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9TRUxFQ1Q6XG4gICAgICAgIHJldHVybiBEeW5hbWljU2VsZWN0Q29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfQlVUVE9OOlxuICAgICAgICByZXR1cm4gRHluYW1pY0J1dHRvbkNvbXBvbmVudDtcbiAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0ZJRUxEX0JVVFRPTl9UT0dHTEVTOlxuICAgICAgICByZXR1cm4gRHluYW1pY0J1dHRvblRvZ2dsZXNDb21wb25lbnQ7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9SQURJT19HUk9VUDpcbiAgICAgICAgcmV0dXJuIER5bWFtaWNSYWRpb0dyb3VwQ29tcG9uZW50O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBNb2RlbCBvZiB0eXBlICdkeW5hbWljLSR7dGhpcy5tb2RlbC50eXBlfScgaXMgbm90IGltcGxlbWVudGVkIHlldC4gQWRkIHRoaXMgdHlwZSB0byBkeW5hbWljLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIHRvIGFkZCBzdXBwb3J0YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9sQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50VHlwZTtcblxuICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgbGV0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29tcG9uZW50Vmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgIHRoaXMuX3N1YnMuYWRkKGNvbXBvbmVudEluc3RhbmNlLmNoYW5nZT8uc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5vbkNoYW5nZShldmVudCkpKTtcblxuICAgICAgY29tcG9uZW50SW5zdGFuY2UuZ3JvdXAgPSB0aGlzLmdyb3VwO1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UubW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBhbGwgbmVjZXNzYXJ5IHN1YnNjcmlwdGlvbnMgb2YgdGhlIEZvcm1Db250cm9sXG4gICAqL1xuICBwcml2YXRlIHNldFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsIGFzIER5bmFtaWNGb3JtRmllbGRWYWx1ZU1vZGVsPHVua25vd24+O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHRoZSB2YWx1ZSBjaGFuZ2UgaW5zaWRlIHRoZSBjb250cm9sIHRvIGNoYW5nZSB0aGUgdmFsdWUgaW5zaWRlIHRoZSBtb2RlbCBhcyB3ZWxsXG4gICAgdGhpcy5fc3Vicy5hZGQodGhpcy5fY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5vblZhbHVlQ2hhbmdlKHZhbHVlKSkpO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBkaXNhYmxlZCBjaGFuZ2UgaW5zaWRlIHRoZSBtb2RlbCB0byBjaGFuZ2UgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBGb3JtQ29udHJvbFxuICAgIHRoaXMuX3N1YnMuYWRkKG1vZGVsLmRpc2FibGVkQ2hhbmdlLnN1YnNjcmliZSgoZGlzYWJsZWQpID0+IHRoaXMub25EaXNhYmxlZENoYW5nZShkaXNhYmxlZCkpKTtcblxuICAgIC8vIFNldHVwIHN1YnNjcmlwdGlvbnMgZm9yIGFueSBwb3NzaWJsZSByZWxhdGlvblxuICAgIGlmICh0aGlzLm1vZGVsLnJlbGF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFVwUmVsYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbGwgcmVsYXRpb25zIG9mIHRoZSBjdXJyZW50IG1vZGVsXG4gICAqL1xuICBwcml2YXRlIHNldFVwUmVsYXRpb25zKCk6IHZvaWQge1xuICAgIC8vIEFycmF5IG9mIGFsbCBGb3JtQ29udHJvbHMgdGhlIGN1cnJlbnQgbW9kZWwgaGFzIGEgcmVsYXRpb24gdG9cbiAgICBjb25zdCByZWxhdGVkRm9ybUNvbnRyb2xzOiBSZWxhdGVkRm9ybUNvbnRyb2xzID0gdGhpcy5yZWxhdGlvblNlcnZpY2UuZmluZFJlbGF0ZWRGb3JtRmllbGQodGhpcy5tb2RlbCwgdGhpcy5ncm91cCk7XG4gICAgY29uc3Qgc3VicyA9IHRoaXMucmVsYXRpb25TZXJ2aWNlLmdldFJlbGF0aW9uU3Vic2NyaXB0aW9ucyhyZWxhdGVkRm9ybUNvbnRyb2xzLCB0aGlzLm1vZGVsLCB0aGlzLl9jb250cm9sKTtcblxuICAgIC8vIEFkZCBhbGwgcmVsYXRpb25zIGFzIHN1YnNjcmlwdGlvbiB0byB0aGUgbWFpbiBTdWJzY3JpcHRpb24gb2JqZWN0XG4gICAgc3Vicy5mb3JFYWNoKChzdWIpID0+IHRoaXMuX3N1YnMuYWRkKHN1YikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMgb2YgdGhlIGNvbnRyb2wgYW5kIHVwZGF0ZXMgdGhlIHZhbHVlIGluc2lkZSB0aGUgbW9kZWxcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtRmllbGRWYWx1ZU1vZGVsICYmIHRoaXMubW9kZWwudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLm1vZGVsLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZWQgdGhlIGNvbnRyb2wgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlci5cbiAgICogSXMgZmlyZWQgd2hlbiBkaXNhYmxlZCBzdGF0ZSBpcyBjaGFuZ2VkIGluc2lkZSB0aGUgbW9kZWwgYW5kIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdXNlZCBvdXRzaWRlIHRoaXMgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gZGlzYWJsZWRcbiAgICovXG4gIHByaXZhdGUgb25EaXNhYmxlZENoYW5nZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGRpc2FibGVkID8gdGhpcy5fY29udHJvbC5kaXNhYmxlKCkgOiB0aGlzLl9jb250cm9sLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZShldjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5jcmVhdGVEeW5hbWljRm9ybUV2ZW50KGV2LCAnY2hhbmdlJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljRm9ybUV2ZW50KGV2ZW50OiB1bmtub3duLCB0eXBlOiBEeW5hbWljRm9ybUZpZWxkRXZlbnRUeXBlKTogRHluYW1pY0Zvcm1GaWVsZEV2ZW50IHtcbiAgICByZXR1cm4geyBldmVudCwgdHlwZSwgY29udHJvbDogdGhpcy5fY29udHJvbCwgZm9ybTogdGhpcy5ncm91cCwgbW9kZWw6IHRoaXMubW9kZWwgfTtcbiAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCJcbiAgW25nQ2xhc3NdPVwiWydkeW5hbWljLWZvcm0tZmllbGQtY29udGFpbmVyJywgJ2R5bmFtaWMtZm9ybS1maWVsZC0nICsgbW9kZWwudHlwZV1cIj5cbiAgPG5nLWNvbnRhaW5lciAjY29tcG9uZW50Vmlld0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWZvcm0vc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS1maWVsZC9keW5hbWljLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtLWZpZWxkL2R5bmFtaWMtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUF3QyxNQUFNLGdCQUFnQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDL0csT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDN0YsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDcEcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbkcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDckYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDdEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDdEcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFHN0YsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFHakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDNUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7OztBQVN6RSxNQUFNLE9BQU8seUJBQXlCO0lBUHRDO1FBYVksV0FBTSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBRTVDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELG9CQUFlLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFHL0QsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0E0SHBDO0lBMUhDLCtGQUErRjtJQUMvRixJQUFZLGFBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzdHLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUF1QixDQUFDO1lBRXRFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHVCQUF1QjtRQUM3QixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsS0FBSyx5QkFBeUI7Z0JBQzVCLE9BQU8sc0JBQXNCLENBQUM7WUFDaEMsS0FBSyxpQ0FBaUM7Z0JBQ3BDLE9BQU8sNkJBQTZCLENBQUM7WUFDdkMsS0FBSywyQkFBMkI7Z0JBQzlCLE9BQU8sd0JBQXdCLENBQUM7WUFDbEMsS0FBSyw2QkFBNkI7Z0JBQ2hDLE9BQU8sMEJBQTBCLENBQUM7WUFDcEMsS0FBSyx3QkFBd0I7Z0JBQzNCLE9BQU8scUJBQXFCLENBQUM7WUFDL0IsS0FBSyw4QkFBOEI7Z0JBQ2pDLE9BQU8sMEJBQTBCLENBQUM7WUFDcEMsS0FBSywyQkFBMkI7Z0JBQzlCLE9BQU8sd0JBQXdCLENBQUM7WUFDbEMsS0FBSyx5QkFBeUI7Z0JBQzVCLE9BQU8sc0JBQXNCLENBQUM7WUFDaEMsS0FBSywyQkFBMkI7Z0JBQzlCLE9BQU8sd0JBQXdCLENBQUM7WUFDbEM7Z0JBQ0UsT0FBTyxDQUFDLElBQUksQ0FDViwwQkFBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLDJGQUEyRixDQUNySSxDQUFDO2dCQUNGLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRU8sMEJBQTBCO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFckMsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUxRSxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7WUFFaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckYsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDckMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBNEMsQ0FBQztRQUVoRSxnR0FBZ0c7UUFDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixvR0FBb0c7UUFDcEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUYsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3BCLGdFQUFnRTtRQUNoRSxNQUFNLG1CQUFtQixHQUF3QixJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5ILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0csb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksSUFBSSxDQUFDLEtBQUssWUFBWSwwQkFBMEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuRixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsUUFBaUI7UUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFTyxRQUFRLENBQUMsRUFBVztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQWMsRUFBRSxJQUErQjtRQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RGLENBQUM7K0dBdklVLHlCQUF5QjttR0FBekIseUJBQXlCLHNRQUNTLGdCQUFnQiwyQ0NsRC9ELG9MQUdNLDRDRHlDTSxPQUFPLG1GQUFFLG1CQUFtQjs7NEZBSzNCLHlCQUF5QjtrQkFQckMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsWUFDN0Isb0JBQW9CLG1CQUViLHVCQUF1QixDQUFDLE1BQU07OEJBR2dDLHNCQUFzQjtzQkFBcEcsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVwRSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNCdXR0b25Ub2dnbGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uLXRvZ2dsZXMvZHluYW1pYy1idXR0b24tdG9nZ2xlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX0JVVFRPTl9UT0dHTEVTIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uLXRvZ2dsZXMvZHluYW1pYy1idXR0b24tdG9nZ2xlcy5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uL2R5bmFtaWMtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEWU5BTUlDX0ZPUk1fRklFTERfQlVUVE9OIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uL2R5bmFtaWMtYnV0dG9uLm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL2NoZWNrYm94L2R5bmFtaWMtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IERZTkFNSUNfRk9STV9GSUVMRF9DSEVDS0JPWCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL2NoZWNrYm94L2R5bmFtaWMtY2hlY2tib3gubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY0RhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cm9scy9kYXRlcGlja2VyL2R5bmFtaWMtZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX0RBVEVQSUNLRVIgfSBmcm9tICcuLi8uLi9jb250cm9scy9kYXRlcGlja2VyL2R5bmFtaWMtZGF0ZXBpY2tlci5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cm9scy9pbnB1dC9keW5hbWljLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEWU5BTUlDX0ZPUk1fRklFTERfSU5QVVQgfSBmcm9tICcuLi8uLi9jb250cm9scy9pbnB1dC9keW5hbWljLWlucHV0Lm1vZGVsJztcbmltcG9ydCB7IER5bWFtaWNSYWRpb0dyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvcmFkaW8tZ3JvdXAvZHluYW1pYy1yYWRpby1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX1JBRElPX0dST1VQIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvcmFkaW8tZ3JvdXAvZHluYW1pYy1yYWRpby1ncm91cC5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljUmVhZG9ubHlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cm9scy9yZWFkb25seS9keW5hbWljLXJlYWRvbmx5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEWU5BTUlDX0ZPUk1fRklFTERfUkVBRE9OTFkgfSBmcm9tICcuLi8uLi9jb250cm9scy9yZWFkb25seS9keW5hbWljLXJlYWRvbmx5Lm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cm9scy9zZWxlY3QvZHluYW1pYy1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IERZTkFNSUNfRk9STV9GSUVMRF9TRUxFQ1QgfSBmcm9tICcuLi8uLi9jb250cm9scy9zZWxlY3QvZHluYW1pYy1zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY1RleHRhcmVhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvdGV4dGFyZWEvZHluYW1pYy10ZXh0YXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX1RFWFRBUkVBIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvdGV4dGFyZWEvZHluYW1pYy10ZXh0YXJlYS5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLWJhc2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLW1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRWYWx1ZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLXZhbHVlLW1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRFdmVudCwgRHluYW1pY0Zvcm1GaWVsZEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1maWVsZC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVsYXRlZEZvcm1Db250cm9scyB9IGZyb20gJy4uLy4uL21vZGVscy90eXBlcy9yZWxhdGVkLWZvcm0tY29udHJvbHMudHlwZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybVJlbGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0tcmVsYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ2xhc3MsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICBzZWxlY3RvcjogJ2R5bmFtaWMtZm9ybS1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnZHluYW1pYy1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50Vmlld0NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIGNvbXBvbmVudFZpZXdDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0Zvcm1GaWVsZE1vZGVsO1xuICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1GaWVsZEV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0Zvcm1TZXJ2aWNlID0gaW5qZWN0KER5bmFtaWNGb3JtU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsYXRpb25TZXJ2aWNlID0gaW5qZWN0KER5bmFtaWNGb3JtUmVsYXRpb25zU2VydmljZSk7XG5cbiAgcHJpdmF0ZSBfY29udHJvbCE6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHJpdmF0ZSBfc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAvKiogR2V0IHRoZSBpbnN0YW5jZSBvZiBhIGNvbnRyb2wgY29tcG9uZW50IHVzaW5nIHRoZSBpbmplY3RlZCBjdXN0b20gbWV0aG9kIG9yIGxvY2FsIG1ldGhvZCAqL1xuICBwcml2YXRlIGdldCBjb21wb25lbnRUeXBlKCk6IFR5cGU8RHluYW1pY0Zvcm1GaWVsZD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuZ2V0Q3VzdG9tQ29udHJvbENvbXBvbmVudFR5cGUodGhpcy5tb2RlbCkgfHwgdGhpcy5nZXRDb250cm9sQ29tcG9uZW50VHlwZSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSB0aGlzLmdyb3VwLmdldCh0aGlzLm1vZGVsLm5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcblxuICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbENvbXBvbmVudCgpO1xuICAgICAgdGhpcy5zZXRTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vicy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBpbnN0YW5jZSBvZiBhIGNvbnRyb2wgY29tcG9uZW50IGJ5IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udHJvbENvbXBvbmVudFR5cGUoKTogVHlwZTxEeW5hbWljRm9ybUZpZWxkPiB8IG51bGwge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlbC50eXBlKSB7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9CVVRUT046XG4gICAgICAgIHJldHVybiBEeW5hbWljQnV0dG9uQ29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfQlVUVE9OX1RPR0dMRVM6XG4gICAgICAgIHJldHVybiBEeW5hbWljQnV0dG9uVG9nZ2xlc0NvbXBvbmVudDtcbiAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0ZJRUxEX0NIRUNLQk9YOlxuICAgICAgICByZXR1cm4gRHluYW1pY0NoZWNrYm94Q29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfREFURVBJQ0tFUjpcbiAgICAgICAgcmV0dXJuIER5bmFtaWNEYXRlcGlja2VyQ29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfSU5QVVQ6XG4gICAgICAgIHJldHVybiBEeW5hbWljSW5wdXRDb21wb25lbnQ7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9SQURJT19HUk9VUDpcbiAgICAgICAgcmV0dXJuIER5bWFtaWNSYWRpb0dyb3VwQ29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfUkVBRE9OTFk6XG4gICAgICAgIHJldHVybiBEeW5hbWljUmVhZG9ubHlDb21wb25lbnQ7XG4gICAgICBjYXNlIERZTkFNSUNfRk9STV9GSUVMRF9TRUxFQ1Q6XG4gICAgICAgIHJldHVybiBEeW5hbWljU2VsZWN0Q29tcG9uZW50O1xuICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fRklFTERfVEVYVEFSRUE6XG4gICAgICAgIHJldHVybiBEeW5hbWljVGV4dGFyZWFDb21wb25lbnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYE1vZGVsIG9mIHR5cGUgJ2R5bmFtaWMtJHt0aGlzLm1vZGVsLnR5cGV9JyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiBBZGQgdGhpcyB0eXBlIHRvIGR5bmFtaWMtZm9ybS1maWVsZC5jb21wb25lbnQudHMgdG8gYWRkIHN1cHBvcnRgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybUNvbnRyb2xDb21wb25lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRUeXBlO1xuXG4gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7XG4gICAgICBsZXQgY29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRWaWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgdGhpcy5fc3Vicy5hZGQoY29tcG9uZW50SW5zdGFuY2UuY2hhbmdlPy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLm9uQ2hhbmdlKGV2ZW50KSkpO1xuXG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5ncm91cCA9IHRoaXMuZ3JvdXA7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5tb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGFsbCBuZWNlc3Nhcnkgc3Vic2NyaXB0aW9ucyBvZiB0aGUgRm9ybUNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgc2V0U3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwgYXMgRHluYW1pY0Zvcm1GaWVsZFZhbHVlTW9kZWw8dW5rbm93bj47XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIHZhbHVlIGNoYW5nZSBpbnNpZGUgdGhlIGNvbnRyb2wgdG8gY2hhbmdlIHRoZSB2YWx1ZSBpbnNpZGUgdGhlIG1vZGVsIGFzIHdlbGxcbiAgICB0aGlzLl9zdWJzLmFkZCh0aGlzLl9jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLm9uVmFsdWVDaGFuZ2UodmFsdWUpKSk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIGRpc2FibGVkIGNoYW5nZSBpbnNpZGUgdGhlIG1vZGVsIHRvIGNoYW5nZSB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIEZvcm1Db250cm9sXG4gICAgdGhpcy5fc3Vicy5hZGQobW9kZWwuZGlzYWJsZWRDaGFuZ2Uuc3Vic2NyaWJlKChkaXNhYmxlZCkgPT4gdGhpcy5vbkRpc2FibGVkQ2hhbmdlKGRpc2FibGVkKSkpO1xuXG4gICAgLy8gU2V0dXAgc3Vic2NyaXB0aW9ucyBmb3IgYW55IHBvc3NpYmxlIHJlbGF0aW9uXG4gICAgaWYgKHRoaXMubW9kZWwucmVsYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0VXBSZWxhdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFsbCByZWxhdGlvbnMgb2YgdGhlIGN1cnJlbnQgbW9kZWxcbiAgICovXG4gIHByaXZhdGUgc2V0VXBSZWxhdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gQXJyYXkgb2YgYWxsIEZvcm1Db250cm9scyB0aGUgY3VycmVudCBtb2RlbCBoYXMgYSByZWxhdGlvbiB0b1xuICAgIGNvbnN0IHJlbGF0ZWRGb3JtQ29udHJvbHM6IFJlbGF0ZWRGb3JtQ29udHJvbHMgPSB0aGlzLnJlbGF0aW9uU2VydmljZS5maW5kUmVsYXRlZEZvcm1GaWVsZCh0aGlzLm1vZGVsLCB0aGlzLmdyb3VwKTtcblxuICAgIGNvbnN0IHN1YnMgPSB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRSZWxhdGlvblN1YnNjcmlwdGlvbnMocmVsYXRlZEZvcm1Db250cm9scywgdGhpcy5tb2RlbCwgdGhpcy5fY29udHJvbCk7XG5cbiAgICAvLyBBZGQgYWxsIHJlbGF0aW9ucyBhcyBzdWJzY3JpcHRpb24gdG8gdGhlIG1haW4gU3Vic2NyaXB0aW9uIG9iamVjdFxuICAgIHN1YnMuZm9yRWFjaCgoc3ViKSA9PiB0aGlzLl9zdWJzLmFkZChzdWIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBjb250cm9sIGFuZCB1cGRhdGVzIHRoZSB2YWx1ZSBpbnNpZGUgdGhlIG1vZGVsXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUZpZWxkVmFsdWVNb2RlbCAmJiB0aGlzLm1vZGVsLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5tb2RlbC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVkIHRoZSBjb250cm9sIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIuXG4gICAqIElzIGZpcmVkIHdoZW4gZGlzYWJsZWQgc3RhdGUgaXMgY2hhbmdlZCBpbnNpZGUgdGhlIG1vZGVsIGFuZCBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHVzZWQgb3V0c2lkZSB0aGlzIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGRpc2FibGVkXG4gICAqL1xuICBwcml2YXRlIG9uRGlzYWJsZWRDaGFuZ2UoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBkaXNhYmxlZCA/IHRoaXMuX2NvbnRyb2wuZGlzYWJsZSgpIDogdGhpcy5fY29udHJvbC5lbmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2UoZXY6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuY3JlYXRlRHluYW1pY0Zvcm1FdmVudChldiwgJ2NoYW5nZScpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0Zvcm1FdmVudChldmVudDogdW5rbm93biwgdHlwZTogRHluYW1pY0Zvcm1GaWVsZEV2ZW50VHlwZSk6IER5bmFtaWNGb3JtRmllbGRFdmVudCB7XG4gICAgcmV0dXJuIHsgZXZlbnQsIHR5cGUsIGNvbnRyb2w6IHRoaXMuX2NvbnRyb2wsIGZvcm06IHRoaXMuZ3JvdXAsIG1vZGVsOiB0aGlzLm1vZGVsIH07XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJncm91cFwiXG4gIFtuZ0NsYXNzXT1cIlsnZHluYW1pYy1mb3JtLWZpZWxkLWNvbnRhaW5lcicsICdkeW5hbWljLWZvcm0tZmllbGQtJyArIG1vZGVsLnR5cGVdXCI+XG4gIDxuZy1jb250YWluZXIgI2NvbXBvbmVudFZpZXdDb250YWluZXI+PC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=
|