@mediusinc/mng-commons-data-api 5.2.0-rc.0 → 5.2.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,470 @@
1
+ import { CommonsInternalError, fromAngularDateFormatToPrime } from '@mediusinc/mng-commons/core';
2
+ import { EnumDescriptor } from '@mediusinc/mng-commons/model';
3
+ import { FieldInputDescriptor, TableviewDescriptorInst } from '@mediusinc/mng-commons/tableview/api';
4
+ import { enumModelFromSchema } from './enum-from-schema';
5
+ import { fromSchemaCurrencyOptsToCurrency, fromSchemaFilterNonArrayProperties } from './internal/common-from-schema';
6
+ /**
7
+ * <em>Experimental:</em> Builder for adding fields to editor.
8
+ *
9
+ * @experimental
10
+ */
11
+ export class SchemaFieldsBuilder {
12
+ constructor(descriptor, schema, opts) {
13
+ this.descriptor = descriptor;
14
+ this.schema = schema;
15
+ this.opts = opts;
16
+ }
17
+ mergeFieldsInputOpts(property, opts) {
18
+ return {
19
+ ...this.opts,
20
+ fieldType: opts?.fieldTypes?.[property] ?? this.opts?.fieldTypes?.[property],
21
+ enumModel: opts?.enumModels?.[property] ?? this.opts?.enumModels?.[property],
22
+ enumSchema: opts?.enumSchemas?.[property] ?? this.opts?.enumSchemas?.[property],
23
+ ...opts
24
+ };
25
+ }
26
+ mergeFieldInputOpts(property, opts) {
27
+ return {
28
+ ...this.opts,
29
+ fieldType: this.opts?.fieldTypes?.[property],
30
+ enumModel: this.opts?.enumModels?.[property],
31
+ enumSchema: this.opts?.enumSchemas?.[property],
32
+ ...opts
33
+ };
34
+ }
35
+ /**
36
+ * <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema}.
37
+ *
38
+ * @experimental
39
+ *
40
+ * @param {Property} property - The property to add the field for.
41
+ * @param {FieldInputFromSchemaOptsType<SchModel>} opts - Additional options.
42
+ *
43
+ * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
44
+ */
45
+ add(property, opts) {
46
+ return addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldInputOpts(property, opts));
47
+ }
48
+ /**
49
+ * <em>Experimental:</em> Adds all input fields for the non-array properties via {addFieldInputFromSchema}.
50
+ *
51
+ * @experimental
52
+ *
53
+ * @param {FieldsFromSchemaOptsType<SchModel>} opts - Additional options.
54
+ *
55
+ * @return {this} - The current instance of the builder.
56
+ */
57
+ withAddAll(opts) {
58
+ this.addFields(undefined, opts);
59
+ return this;
60
+ }
61
+ withAdd(propOrOpts, ...properties) {
62
+ if (typeof propOrOpts === 'object') {
63
+ this.addFields(properties.length === 0 ? undefined : properties, propOrOpts);
64
+ }
65
+ else {
66
+ this.addFields(propOrOpts === undefined ? properties : [propOrOpts, ...properties]);
67
+ }
68
+ return this;
69
+ }
70
+ addFields(properties, opts) {
71
+ const addProperties = properties ?? fromSchemaFilterNonArrayProperties(this.schema.properties);
72
+ addProperties.forEach(property => {
73
+ addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldsInputOpts(property, opts));
74
+ });
75
+ }
76
+ /**
77
+ * <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema} where property schema is manually provided.
78
+ *
79
+ * @experimental
80
+ *
81
+ * @param {Property} property - The property to add the field for.
82
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
83
+ * @param {FieldInputFromSchemaOptsType<Model>} opts - Additional options.
84
+ *
85
+ * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
86
+ */
87
+ addFromSchema(property, schemaProperty, opts) {
88
+ return addFieldInputFromSchema(this.descriptor, property, schemaProperty, this.mergeFieldInputOpts(property, opts));
89
+ }
90
+ /**
91
+ * <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema}.
92
+ *
93
+ * @experimental
94
+ *
95
+ * @param {Property} property - The property to add the enum lookup field for.
96
+ * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
97
+ *
98
+ * @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
99
+ *
100
+ * @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
101
+ */
102
+ addEnum(property, enumOpt) {
103
+ if (!enumOpt) {
104
+ enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
105
+ }
106
+ if (!enumOpt) {
107
+ throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
108
+ }
109
+ return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, this.schema.properties[property]);
110
+ }
111
+ /**
112
+ * <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema} where property schema is manually provided.
113
+ *
114
+ * @experimental
115
+ *
116
+ * @param {Property} property - The property to add the enum lookup field for.
117
+ * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
118
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
119
+ *
120
+ * @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
121
+ *
122
+ * @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
123
+ */
124
+ addEnumFromSchema(property, enumOpt, schemaProperty) {
125
+ if (!enumOpt) {
126
+ enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
127
+ }
128
+ if (!enumOpt) {
129
+ throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
130
+ }
131
+ return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, schemaProperty);
132
+ }
133
+ /**
134
+ * <em>Experimental:</em> Adds a lookup field.
135
+ * {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
136
+ *
137
+ * @experimental
138
+ *
139
+ * @param {Property} property - The property to create the lookup field for.
140
+ *
141
+ * @return The created lookup field.
142
+ */
143
+ addLookup(property) {
144
+ const field = this.descriptor.addFieldLookup(property);
145
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
146
+ return field;
147
+ }
148
+ /**
149
+ * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
150
+ * {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
151
+ *
152
+ * @experimental
153
+ *
154
+ * @param {Property} property - The property to create the lookup field for.
155
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
156
+ *
157
+ * @return The created lookup field.
158
+ */
159
+ addLookupFromSchema(property, schemaProperty) {
160
+ const field = this.descriptor.addFieldLookup(property);
161
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
162
+ return field;
163
+ }
164
+ /**
165
+ * <em>Experimental:</em> Adds a lookup field.
166
+ * {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
167
+ *
168
+ * @experimental
169
+ *
170
+ * @param {Property} property - The property to create the lookup field for.
171
+ * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
172
+ * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
173
+ *
174
+ * @return The created lookup field.
175
+ */
176
+ addLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty) {
177
+ const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
178
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
179
+ return field;
180
+ }
181
+ /**
182
+ * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
183
+ * {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
184
+ *
185
+ * @experimental
186
+ *
187
+ * @param {Property} property - The property to create the lookup field for.
188
+ * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
189
+ * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
190
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
191
+ *
192
+ * @return The created lookup field.
193
+ */
194
+ addLookupWithOptionsValuePropertyFromSchema(property, type, lookupOptionsValueProperty, schemaProperty) {
195
+ const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
196
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
197
+ return field;
198
+ }
199
+ /**
200
+ * <em>Experimental:</em> Adds a lookup field.
201
+ * {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
202
+ *
203
+ * @experimental
204
+ *
205
+ * @param {Property} property - The property to create the lookup field for.
206
+ * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
207
+ *
208
+ * @return The created lookup field.
209
+ */
210
+ addLookupWithProvider(property, provider) {
211
+ const field = this.descriptor.addFieldLookupWithProvider(property, provider);
212
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
213
+ return field;
214
+ }
215
+ /**
216
+ * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
217
+ * {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
218
+ *
219
+ * @experimental
220
+ *
221
+ * @param {Property} property - The property to create the lookup field for.
222
+ * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
223
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
224
+ *
225
+ * @return The created lookup field.
226
+ */
227
+ addLookupWithProviderFromSchema(property, provider, schemaProperty) {
228
+ const field = this.descriptor.addFieldLookupWithProvider(property, provider);
229
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
230
+ return field;
231
+ }
232
+ /**
233
+ * <em>Experimental:</em> Adds a lookup field.
234
+ * {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
235
+ *
236
+ * @experimental
237
+ *
238
+ * @param {Property} property - The property to create the lookup field for.
239
+ * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
240
+ * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
241
+ * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
242
+ *
243
+ * @return The created lookup field.
244
+ */
245
+ addLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty) {
246
+ const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
247
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
248
+ return field;
249
+ }
250
+ /**
251
+ * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
252
+ * {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
253
+ *
254
+ * @experimental
255
+ *
256
+ * @param {Property} property - The property to create the lookup field for.
257
+ * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
258
+ * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
259
+ * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
260
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
261
+ *
262
+ * @return The created lookup field.
263
+ */
264
+ addLookupWithProviderAndOptionsValuePropertyFromSchema(property, provider, type, lookupOptionsValueProperty, schemaProperty) {
265
+ const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
266
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
267
+ return field;
268
+ }
269
+ /**
270
+ * <em>Experimental:</em> Adds a one-to-many editor field.
271
+ * {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
272
+ *
273
+ * @experimental
274
+ *
275
+ * @param {Property} property - The property to create the many editor field for.
276
+ * @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
277
+ *
278
+ * @return The created one-to-many editor field.
279
+ */
280
+ addManyEditor(property, tableviewDescriptor) {
281
+ const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
282
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
283
+ return field;
284
+ }
285
+ /**
286
+ * <em>Experimental:</em> Adds an one-to-many editor field where property schema is manually provided.
287
+ * {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
288
+ *
289
+ * @experimental
290
+ *
291
+ * @param {Property} property - The property to create the many editor field for.
292
+ * @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
293
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
294
+ *
295
+ * @return The created one-to-many editor field.
296
+ */
297
+ addManyEditorFromSchema(property, tableviewDescriptor, schemaProperty) {
298
+ const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
299
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
300
+ return field;
301
+ }
302
+ /**
303
+ * <em>Experimental:</em> Adds a many-to-many editor field.
304
+ * {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
305
+ *
306
+ * @experimental
307
+ *
308
+ * @param {Property} property - The property to create the many editor field for.
309
+ * @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
310
+ * @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
311
+ * @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
312
+ *
313
+ * @return The created many-to-many editor field.
314
+ */
315
+ addManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
316
+ const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
317
+ setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
318
+ return field;
319
+ }
320
+ /**
321
+ * <em>Experimental:</em> Adds a many-to-many editor field where property schema is manually provided.
322
+ * {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
323
+ *
324
+ * @experimental
325
+ *
326
+ * @param {Property} property - The property to create the many editor field for.
327
+ * @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
328
+ * @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
329
+ * @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
330
+ * @param {SchemaProperty} schemaProperty - Manually provided schema property.
331
+ *
332
+ * @return The created many-to-many editor field.
333
+ */
334
+ addManyToManyEditorFromSchema(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider, schemaProperty) {
335
+ const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
336
+ setFieldBasicOptionsFromSchema(field, schemaProperty);
337
+ return field;
338
+ }
339
+ }
340
+ /**
341
+ * <em>Experimental:</em> Creates builder for adding fields to descriptor based on provided model schema.
342
+ *
343
+ * @experimental
344
+ *
345
+ * @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model>} descriptor - Descriptor to add fields to.
346
+ * @param {SchemaModel<SchModel>} schema - The schema with metadata about properties for fields.
347
+ * @param {FieldsFromSchemaOptsType<SchModel>} [opts] - Additional options.
348
+ *
349
+ * @return {SchemaFieldsBuilder<Model, Parent, SchModel>} - The SchemaFieldsBuilder object containing the extracted fields.
350
+ */
351
+ export function fieldsFromSchema(descriptor, schema, opts) {
352
+ return new SchemaFieldsBuilder(descriptor, schema, opts);
353
+ }
354
+ /**
355
+ * <em>Experimental:</em> Adds a field input to editor descriptor based on the given schema property and options.
356
+ *
357
+ * @experimental
358
+ *
359
+ * @param {TableviewDescriptorInst | EditorDescriptorInst} descriptor - Descriptor to add field to.
360
+ * @param {keyof Model} property - The property of the model.
361
+ * @param {SchemaProperty} propertySchema - The property's schema for the field.
362
+ * @param {FieldInputFromSchemaOptsType<Model>} [opts] - Additional options.
363
+ *
364
+ * @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} - The generated field input descriptor.
365
+ */
366
+ export function addFieldInputFromSchema(descriptor, property, propertySchema, opts) {
367
+ const propertyType = opts?.fieldType ?? propertySchema.type;
368
+ const field = new FieldInputDescriptor(descriptor instanceof TableviewDescriptorInst ? descriptor.detailsEditor : descriptor, property);
369
+ if (descriptor instanceof TableviewDescriptorInst) {
370
+ descriptor.detailsEditor.addFieldDescriptor(field);
371
+ descriptor.editEditor.addFieldDescriptor(field);
372
+ descriptor.addEditor.addFieldDescriptor(field);
373
+ }
374
+ else {
375
+ descriptor.addFieldDescriptor(field);
376
+ }
377
+ // Handle different property types
378
+ switch (propertyType) {
379
+ case 'number':
380
+ if (opts?.currency) {
381
+ field.asCurrency(fromSchemaCurrencyOptsToCurrency(opts.currency));
382
+ }
383
+ else {
384
+ field.asNumber();
385
+ }
386
+ break;
387
+ case 'currency':
388
+ field.asCurrency(opts?.currency ? fromSchemaCurrencyOptsToCurrency(opts.currency) : undefined);
389
+ break;
390
+ case 'boolean':
391
+ field.asSwitch();
392
+ break;
393
+ case 'text':
394
+ case 'string':
395
+ field.asText();
396
+ break;
397
+ case 'textarea':
398
+ field.asTextarea();
399
+ break;
400
+ case 'date':
401
+ field.asDatePicker({ format: opts?.dateFormat ? fromAngularDateFormatToPrime(opts.dateFormat) : undefined });
402
+ break;
403
+ case 'date-time':
404
+ field.asDatePicker({ showTime: true, format: opts?.dateTimeFormat ? fromAngularDateFormatToPrime(opts.dateTimeFormat) : undefined });
405
+ break;
406
+ case 'enum':
407
+ // eslint-disable-next-line no-case-declarations
408
+ const enumModel = opts?.enumSchema ? enumModelFromSchema(opts.enumSchema) : opts?.enumModel;
409
+ if (enumModel) {
410
+ field.asRadioFromEnum(enumModel);
411
+ }
412
+ else {
413
+ field.asText();
414
+ }
415
+ break;
416
+ case 'hidden':
417
+ field.asHidden();
418
+ break;
419
+ }
420
+ // Handle different property validations
421
+ if (propertyType === 'number' || propertyType === 'currency') {
422
+ field.withNumberValidation({
423
+ min: propertySchema.exclusiveMinimum && propertySchema.minimum != undefined ? propertySchema.minimum + (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.minimum,
424
+ max: propertySchema.exclusiveMaximum && propertySchema.maximum != undefined ? propertySchema.maximum - (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.maximum
425
+ });
426
+ }
427
+ if (propertyType === 'string' || propertyType === 'textarea' || propertyType === 'text') {
428
+ field.withTextValidation({
429
+ minLength: propertySchema.minLength,
430
+ maxLength: propertySchema.maxLength,
431
+ pattern: propertySchema.pattern ? new RegExp(propertySchema.pattern.slice(1, -1)) : undefined
432
+ });
433
+ if (propertyType !== 'textarea' && propertySchema.isEmail) {
434
+ field.withTextValidationEmail();
435
+ }
436
+ }
437
+ setFieldBasicOptionsFromSchema(field, propertySchema);
438
+ return field;
439
+ }
440
+ /**
441
+ * <em>Experimental:</em> Adds a field enum lookup to editor descriptor based on the given schema property and options.
442
+ *
443
+ * @experimental
444
+ *
445
+ * @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model>} descriptor - Descriptor to add field to.
446
+ * @param {keyof Model} property - The property of the model.
447
+ * @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} enumOpt - The enum schema or enum model descriptor.
448
+ * @param {SchemaProperty} propertySchema - The property's schema for the field.
449
+ *
450
+ * @returns {FieldLookupEnum<Enum>} - The field with enumeration values.
451
+ */
452
+ export function addFieldEnumLookupFromSchema(descriptor, property, enumOpt, propertySchema) {
453
+ const enumDescriptor = enumOpt instanceof EnumDescriptor ? enumOpt : enumModelFromSchema(enumOpt);
454
+ const field = descriptor.addFieldLookupEnumUnsafe(property, enumDescriptor);
455
+ setFieldBasicOptionsFromSchema(field, propertySchema);
456
+ return field;
457
+ }
458
+ /**
459
+ * <em>Experimental:</em> Sets basic options for a field based on a given property schema.
460
+ *
461
+ * @param {AFieldDescriptor<FieldModel, EditorModel, FieldValue, ParentEditorModel>} field - The field to set options for.
462
+ * @param {SchemaProperty} propertySchema - The property schema to base the options on.
463
+ */
464
+ export function setFieldBasicOptionsFromSchema(field, propertySchema) {
465
+ if (propertySchema.required)
466
+ field.withRequired();
467
+ if (propertySchema.isReadOnly)
468
+ field.withDisabled();
469
+ }
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvZmllbGRzLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0Isb0JBQW9CLEVBQWtCLDRCQUE0QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDOUgsT0FBTyxFQUFDLGNBQWMsRUFBaUIsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RSxPQUFPLEVBR0gsb0JBQW9CLEVBTXBCLHVCQUF1QixFQUMxQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBNkIsZ0NBQWdDLEVBQUUsa0NBQWtDLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQXFCL0k7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsWUFDcUIsVUFBMEYsRUFDMUYsTUFBNkIsRUFDdEMsSUFBeUM7UUFGaEMsZUFBVSxHQUFWLFVBQVUsQ0FBZ0Y7UUFDMUYsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDdEMsU0FBSSxHQUFKLElBQUksQ0FBcUM7SUFDbEQsQ0FBQztJQUVJLG9CQUFvQixDQUFDLFFBQXFCLEVBQUUsSUFBK0I7UUFDL0UsT0FBcUM7WUFDakMsR0FBRyxJQUFJLENBQUMsSUFBSTtZQUNaLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDNUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUM1RSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFD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b2RlbCwgU2NoZW1hUHJvcGVydHl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMtZGF0YS1hcGknO1xuaW1wb3J0IHtBcnJheUl0ZW1UeXBlLCBDb21tb25zSW50ZXJuYWxFcnJvciwgS2V5b2ZBbmRPZlR5cGUsIGZyb21Bbmd1bGFyRGF0ZUZvcm1hdFRvUHJpbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBUeXBlRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuaW1wb3J0IHtcbiAgICBBRmllbGREZXNjcmlwdG9yLFxuICAgIEVkaXRvckRlc2NyaXB0b3JJbnN0LFxuICAgIEZpZWxkSW5wdXREZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRGVzY3JpcHRvcixcbiAgICBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlLFxuICAgIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IsXG4gICAgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdFxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge2VudW1Nb2RlbEZyb21TY2hlbWF9IGZyb20gJy4vZW51bS1mcm9tLXNjaGVtYSc7XG5pbXBvcnQge0Zyb21TY2hlbWFDdXJyZW5jeU9wdHNUeXBlLCBmcm9tU2NoZW1hQ3VycmVuY3lPcHRzVG9DdXJyZW5jeSwgZnJvbVNjaGVtYUZpbHRlck5vbkFycmF5UHJvcGVydGllc30gZnJvbSAnLi9pbnRlcm5hbC9jb21tb24tZnJvbS1zY2hlbWEnO1xuXG50eXBlIEZpZWxkSW5wdXRUeXBlID0gJ251bWJlcicgfCAnY3VycmVuY3knIHwgJ2Jvb2xlYW4nIHwgJ3N0cmluZycgfCAndGV4dCcgfCAndGV4dGFyZWEnIHwgJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZW51bScgfCAnaGlkZGVuJztcblxudHlwZSBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnk+ID0ge1xuICAgIGZpZWxkVHlwZXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBNb2RlbCwgRmllbGRJbnB1dFR5cGU+PjtcbiAgICBlbnVtTW9kZWxzPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgTW9kZWwsIEVudW1EZXNjcmlwdG9yPGFueT4+PjtcbiAgICBlbnVtU2NoZW1hcz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIE1vZGVsLCBTY2hlbWFFbnVtPGFueT4+PjtcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAgIGRhdGVUaW1lRm9ybWF0Pzogc3RyaW5nO1xufTtcblxudHlwZSBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPE1vZGVsID0gYW55LCBFbnVtID0gYW55PiA9IHtcbiAgICBmaWVsZFR5cGU/OiBGaWVsZElucHV0VHlwZTtcbiAgICBlbnVtU2NoZW1hPzogU2NoZW1hRW51bTxFbnVtPjtcbiAgICBlbnVtTW9kZWw/OiBFbnVtRGVzY3JpcHRvcjxFbnVtPjtcbiAgICBjdXJyZW5jeT86IEZyb21TY2hlbWFDdXJyZW5jeU9wdHNUeXBlPE1vZGVsPjtcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAgIGRhdGVUaW1lRm9ybWF0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEJ1aWxkZXIgZm9yIGFkZGluZyBmaWVsZHMgdG8gZWRpdG9yLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCA9IHVua25vd24sIFNjaE1vZGVsID0gTW9kZWw+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBTY2hlbWFNb2RlbDxTY2hNb2RlbD4sXG4gICAgICAgIHByaXZhdGUgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD5cbiAgICApIHt9XG5cbiAgICBwcml2YXRlIG1lcmdlRmllbGRzSW5wdXRPcHRzKHByb3BlcnR5OiBrZXlvZiBNb2RlbCwgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZSkge1xuICAgICAgICByZXR1cm4gPEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiBvcHRzPy5maWVsZFR5cGVzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZmllbGRUeXBlcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogb3B0cz8uZW51bU1vZGVscz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0sXG4gICAgICAgICAgICBlbnVtU2NoZW1hOiBvcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1TY2hlbWFzPy5bcHJvcGVydHldLFxuICAgICAgICAgICAgLi4ub3B0c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VGaWVsZElucHV0T3B0cyhwcm9wZXJ0eToga2V5b2YgTW9kZWwsIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZT57XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBmaWVsZFR5cGU6IHRoaXMub3B0cz8uZmllbGRUeXBlcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIC4uLm9wdHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBzaW5nbGUgaW5wdXQgZmllbGQgdmlhIHthZGRGaWVsZElucHV0RnJvbVNjaGVtYX0uXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZDxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4gICAgKTogRmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50PiB7XG4gICAgICAgIHJldHVybiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYSh0aGlzLmRlc2NyaXB0b3IsIHByb3BlcnR5LCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSwgdGhpcy5tZXJnZUZpZWxkSW5wdXRPcHRzKHByb3BlcnR5LCBvcHRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFsbCBpbnB1dCBmaWVsZHMgZm9yIHRoZSBub24tYXJyYXkgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhBZGRBbGwob3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRGaWVsZHModW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGlucHV0IGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gey4uLlByb3BlcnR5W119IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIHRvIGFkZCBmaWVsZHMgZm9yLiBJZiBub24gcHJvdmlkZWQsIGFsbCBub24tYXJyYXkgcHJvcGVydGllcyBmcm9tIHNjaGVtYSB3aWxsIGJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ob3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiwgLi4ucHJvcGVydGllczogUHJvcGVydHlLZXlbXSk6IHRoaXM7XG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgdG8gYWRkIGZpZWxkcyBmb3IuIElmIG5vbiBwcm92aWRlZCwgYWxsIG5vbi1hcnJheSBwcm9wZXJ0aWVzIGZyb20gc2NoZW1hIHdpbGwgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5S2V5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+PiguLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcztcbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcE9yT3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiB8IFByb3BlcnR5S2V5LCAuLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcyB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcE9yT3B0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmllbGRzKHByb3BlcnRpZXMubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogcHJvcGVydGllcywgcHJvcE9yT3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZpZWxkcyhwcm9wT3JPcHRzID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0aWVzIDogW3Byb3BPck9wdHMsIC4uLnByb3BlcnRpZXNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZpZWxkczxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcGVydGllcz86IFByb3BlcnR5W10sIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+KSB7XG4gICAgICAgIGNvbnN0IGFkZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzID8/IGZyb21TY2hlbWFGaWx0ZXJOb25BcnJheVByb3BlcnRpZXModGhpcy5zY2hlbWEucHJvcGVydGllcyk7XG5cbiAgICAgICAgYWRkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhcyB1bmtub3duIGFzIGtleW9mIE1vZGVsLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldLFxuICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VGaWVsZHNJbnB1dE9wdHMocHJvcGVydHkgYXMgdW5rbm93biBhcyBrZXlvZiBNb2RlbCwgb3B0cylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIHNpbmdsZSBpbnB1dCBmaWVsZCB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5LFxuICAgICAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbiAgICApOiBGaWVsZElucHV0RGVzY3JpcHRvcjxNb2RlbCwgTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+IHtcbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIHNjaGVtYVByb3BlcnR5LCB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGFkZCB0aGUgZW51bSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+fSBbZW51bU9wdF0gLSBUaGUgZW51bSBzY2hlbWEgb3IgdGhlIGVudW0gbW9kZWwgZGVzY3JpcHRvci4gSWYgbm9uIHByb3ZpZGVkLCBidWlsZGVyIG9wdHMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD59IC0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiBubyBlbnVtIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGUgcHJvcGVydHkgZWl0aGVyIGZyb20gcGFyYW1ldGVyIG9yIGZyb20gYnVpbGRlcidzIG9wdHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEVudW08UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIEVudW0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1PcHQ/OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT5cbiAgICApOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+IHtcbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICBlbnVtT3B0ID0gdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEVudW0gbG9va3VwIGZpZWxkIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5IGFzIHN0cmluZ30gY2Fubm90IGJlIGFkZGVkIGJlY2F1c2UgZW51bSBtZXRhZGF0YSB3YXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hPE1vZGVsLCBQYXJlbnQsIEVudW0+KHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIGVudW1PcHQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGVudW0gbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPn0gW2VudW1PcHRdIC0gVGhlIGVudW0gc2NoZW1hIG9yIHRoZSBlbnVtIG1vZGVsIGRlc2NyaXB0b3IuIElmIG5vbiBwcm92aWRlZCwgYnVpbGRlciBvcHRzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+fSAtIFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgbm8gZW51bSBtZXRhZGF0YSBpcyBmb3VuZCBmb3IgdGhlIHByb3BlcnR5IGVpdGhlciBmcm9tIHBhcmFtZXRlciBvciBmcm9tIGJ1aWxkZXIncyBvcHRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFbnVtRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLCBFbnVtPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBlbnVtT3B0OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT4gfCB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD4ge1xuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIGVudW1PcHQgPSB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRW51bSBsb29rdXAgZmllbGQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHkgYXMgc3RyaW5nfSBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBlbnVtIG1ldGFkYXRhIHdhcyBub3QgcHJvdmlkZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWEodGhpcy5kZXNjcmlwdG9yLCBwcm9wZXJ0eSwgZW51bU9wdCwgc2NoZW1hUHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cDxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldPihwcm9wZXJ0eTogUHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXA8UHJvcGVydHksIExvb2t1cE1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cEZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXAocHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSB0eXBlIC0gVHlwZSBvZiBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFZhbHVlIHByb3BlcnR5IGZyb20gbG9va3VwIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIE1vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KHByb3BlcnR5OiBQcm9wZXJ0eSwgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eShwcm9wZXJ0eSwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHl9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPn0gdHlwZSAtIFR5cGUgb2YgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBWYWx1ZSBwcm9wZXJ0eSBmcm9tIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHlGcm9tU2NoZW1hPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLFxuICAgICAgICBMb29rdXBNb2RlbCxcbiAgICAgICAgTG9va3VwVmFsdWVQcm9wZXJ0eSBleHRlbmRzIEtleW9mQW5kT2ZUeXBlPExvb2t1cE1vZGVsLCBNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldXG4gICAgPihwcm9wZXJ0eTogUHJvcGVydHksIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPiwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHksIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eShwcm9wZXJ0eSwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb29rdXBXaXRoUHJvdmlkZXI8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIFNlcnZpY2UsIExvb2t1cE1vZGVsID0gTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcihwcm9wZXJ0eSwgcHJvdmlkZXIpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJ9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPn0gcHJvdmlkZXIgLSBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwV2l0aFByb3ZpZGVyRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLCBTZXJ2aWNlLCBMb29rdXBNb2RlbCA9IE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcihwcm9wZXJ0eSwgcHJvdmlkZXIpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5fSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gTG9va3VwIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSB0eXBlIC0gVHlwZSBvZiBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFZhbHVlIHByb3BlcnR5IGZyb20gbG9va3VwIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgYWRkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHk8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+LFxuICAgICAgICBTZXJ2aWNlLFxuICAgICAgICBMb29rdXBNb2RlbCxcbiAgICAgICAgTG9va3VwVmFsdWVQcm9wZXJ0eSBleHRlbmRzIEtleW9mQW5kT2ZUeXBlPExvb2t1cE1vZGVsLCBNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldXG4gICAgPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICB0eXBlOiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4sXG4gICAgICAgIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5OiBMb29rdXBWYWx1ZVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCBwcm92aWRlciwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGFzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPn0gdHlwZSAtIFR5cGUgb2YgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBWYWx1ZSBwcm9wZXJ0eSBmcm9tIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5RnJvbVNjaGVtYTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCxcbiAgICAgICAgU2VydmljZSxcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgTW9kZWxbUHJvcGVydHldPixcbiAgICAgICAgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XVxuICAgID4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCBwcm92aWRlciwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGFzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIE1vZGVsPn0gdGFibGV2aWV3RGVzY3JpcHRvciAtIFRhYmxldmlldyBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBvbmUtdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgRmllbGRNb2RlbCA9IEFycmF5SXRlbVR5cGU8TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIE1vZGVsPlxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgTW9kZWwsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFuIG9uZS10by1tYW55IGVkaXRvciBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRNYW55RWRpdG9yfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIG1hbnkgZWRpdG9yIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD59IHRhYmxldmlld0Rlc2NyaXB0b3IgLSBUYWJsZXZpZXcgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZE1hbnlFZGl0b3JGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD4sXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgTW9kZWwsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbWFueS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5LCBTZXJ2aWNlVHlwZSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXJcbiAgICAgICAgKTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvckZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHksIFNlcnZpY2VUeXBlLCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cERhdGFQcm92aWRlclxuICAgICAgICApO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IENyZWF0ZXMgYnVpbGRlciBmb3IgYWRkaW5nIGZpZWxkcyB0byBkZXNjcmlwdG9yIGJhc2VkIG9uIHByb3ZpZGVkIG1vZGVsIHNjaGVtYS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKlxuICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD59IGRlc2NyaXB0b3IgLSBEZXNjcmlwdG9yIHRvIGFkZCBmaWVsZHMgdG8uXG4gKiBAcGFyYW0ge1NjaGVtYU1vZGVsPFNjaE1vZGVsPn0gc2NoZW1hIC0gVGhlIHNjaGVtYSB3aXRoIG1ldGFkYXRhIGFib3V0IHByb3BlcnRpZXMgZm9yIGZpZWxkcy5cbiAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gW29wdHNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4ge1NjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCwgU2NoTW9kZWw+fSAtIFRoZSBTY2hlbWFGaWVsZHNCdWlsZGVyIG9iamVjdCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRzRnJvbVNjaGVtYTxNb2RlbCwgUGFyZW50ID0gdW5rbm93biwgU2NoTW9kZWwgPSBNb2RlbD4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQ+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8TW9kZWw+LFxuICAgIHNjaGVtYTogU2NoZW1hTW9kZWw8U2NoTW9kZWw+LFxuICAgIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4pOiBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIFNjaE1vZGVsPiB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIFNjaE1vZGVsPihkZXNjcmlwdG9yLCBzY2hlbWEsIG9wdHMpO1xufVxuXG4vKipcbiAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGZpZWxkIGlucHV0IHRvIGVkaXRvciBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBnaXZlbiBzY2hlbWEgcHJvcGVydHkgYW5kIG9wdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICpcbiAqIEBwYXJhbSB7VGFibGV2aWV3RGVzY3JpcHRvckluc3QgfCBFZGl0b3JEZXNjcmlwdG9ySW5zdH0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqIEBwYXJhbSB7RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD59IFtvcHRzXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtGaWVsZElucHV0RGVzY3JpcHRvcjxNb2RlbCwgTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+fSAtIFRoZSBnZW5lcmF0ZWQgZmllbGQgaW5wdXQgZGVzY3JpcHRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIE1vZGVsLCBQYXJlbnQgPSB1bmtub3duPihcbiAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD4sXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eSxcbiAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbik6IEZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IG9wdHM/LmZpZWxkVHlwZSA/PyBwcm9wZXJ0eVNjaGVtYS50eXBlO1xuXG4gICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50PihcbiAgICAgICAgZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0ID8gZGVzY3JpcHRvci5kZXRhaWxzRWRpdG9yIDogZGVzY3JpcHRvcixcbiAgICAgICAgcHJvcGVydHkgYXMgc3RyaW5nXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0KSB7XG4gICAgICAgIGRlc2NyaXB0b3IuZGV0YWlsc0VkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICBkZXNjcmlwdG9yLmVkaXRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgZGVzY3JpcHRvci5hZGRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB0eXBlc1xuICAgIHN3aXRjaCAocHJvcGVydHlUeXBlIGFzIEZpZWxkSW5wdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBpZiAob3B0cz8uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5hc0N1cnJlbmN5KGZyb21TY2hlbWFDdXJyZW5jeU9wdHNUb0N1cnJlbmN5KG9wdHMuY3VycmVuY3kpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICAgICAgICBmaWVsZC5hc0N1cnJlbmN5KG9wdHM/LmN1cnJlbmN5ID8gZnJvbVNjaGVtYUN1cnJlbmN5T3B0c1RvQ3VycmVuY3kob3B0cy5jdXJyZW5jeSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgZmllbGQuYXNTd2l0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dGFyZWEoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7Zm9ybWF0OiBvcHRzPy5kYXRlRm9ybWF0ID8gZnJvbUFuZ3VsYXJEYXRlRm9ybWF0VG9QcmltZShvcHRzLmRhdGVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7c2hvd1RpbWU6IHRydWUsIGZvcm1hdDogb3B0cz8uZGF0ZVRpbWVGb3JtYXQgPyBmcm9tQW5ndWxhckRhdGVGb3JtYXRUb1ByaW1lKG9wdHMuZGF0ZVRpbWVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGVudW1Nb2RlbCA9IG9wdHM/LmVudW1TY2hlbWEgPyBlbnVtTW9kZWxGcm9tU2NoZW1hKG9wdHMuZW51bVNjaGVtYSkgOiBvcHRzPy5lbnVtTW9kZWw7XG4gICAgICAgICAgICBpZiAoZW51bU1vZGVsKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNSYWRpb0Zyb21FbnVtKGVudW1Nb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBmaWVsZC5hc0hpZGRlbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB2YWxpZGF0aW9uc1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdudW1iZXInIHx8IHByb3BlcnR5VHlwZSA9PT0gJ2N1cnJlbmN5Jykge1xuICAgICAgICBmaWVsZC53aXRoTnVtYmVyVmFsaWRhdGlvbih7XG4gICAgICAgICAgICBtaW46IHByb3BlcnR5U2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gJiYgcHJvcGVydHlTY2hlbWEubWluaW11bSAhPSB1bmRlZmluZWQgPyBwcm9wZXJ0eVNjaGVtYS5taW5pbXVtICsgKHByb3BlcnR5U2NoZW1hLmlzSW50ZWdlciA/IDEgOiAwLjAwMDEpIDogcHJvcGVydHlTY2hlbWEubWluaW11bSxcbiAgICAgICAgICAgIG1heDogcHJvcGVydHlTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtICE9IHVuZGVmaW5lZCA/IHByb3BlcnR5U2NoZW1hLm1heGltdW0gLSAocHJvcGVydHlTY2hlbWEuaXNJbnRlZ2VyID8gMSA6IDAuMDAwMSkgOiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdzdHJpbmcnIHx8IHByb3BlcnR5VHlwZSA9PT0gJ3RleHRhcmVhJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBmaWVsZC53aXRoVGV4dFZhbGlkYXRpb24oe1xuICAgICAgICAgICAgbWluTGVuZ3RoOiBwcm9wZXJ0eVNjaGVtYS5taW5MZW5ndGgsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHByb3BlcnR5U2NoZW1hLm1heExlbmd0aCxcbiAgICAgICAgICAgIHBhdHRlcm46IHByb3BlcnR5U2NoZW1hLnBhdHRlcm4gPyBuZXcgUmVnRXhwKHByb3BlcnR5U2NoZW1hLnBhdHRlcm4uc2xpY2UoMSwgLTEpKSA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcGVydHlUeXBlICE9PSAndGV4dGFyZWEnICYmIHByb3BlcnR5U2NoZW1hLmlzRW1haWwpIHtcbiAgICAgICAgICAgIGZpZWxkLndpdGhUZXh0VmFsaWRhdGlvbkVtYWlsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHByb3BlcnR5U2NoZW1hKTtcblxuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBlbnVtIGxvb2t1cCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50PiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsPn0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT59IGVudW1PcHQgLSBUaGUgZW51bSBzY2hlbWEgb3IgZW51bSBtb2RlbCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqXG4gKiBAcmV0dXJucyB7RmllbGRMb29rdXBFbnVtPEVudW0+fSAtIFRoZSBmaWVsZCB3aXRoIGVudW1lcmF0aW9uIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWE8TW9kZWwsIFBhcmVudCA9IHVua25vd24sIEVudW0gPSBhbnk+KFxuICAgIGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50PiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsPixcbiAgICBwcm9wZXJ0eToga2V5b2YgTW9kZWwsXG4gICAgZW51bU9wdDogU2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eVxuKSB7XG4gICAgY29uc3QgZW51bURlc2NyaXB0b3IgPSBlbnVtT3B0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgPyBlbnVtT3B0IDogZW51bU1vZGVsRnJvbVNjaGVtYShlbnVtT3B0KTtcbiAgICBjb25zdCBmaWVsZCA9IGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2NyaXB0b3IpO1xuICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgcHJvcGVydHlTY2hlbWEpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IFNldHMgYmFzaWMgb3B0aW9ucyBmb3IgYSBmaWVsZCBiYXNlZCBvbiBhIGdpdmVuIHByb3BlcnR5IHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge0FGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPn0gZmllbGQgLSBUaGUgZmllbGQgdG8gc2V0IG9wdGlvbnMgZm9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkgc2NoZW1hIHRvIGJhc2UgdGhlIG9wdGlvbnMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWE8RmllbGRNb2RlbCA9IGFueSwgRWRpdG9yTW9kZWwgPSBhbnksIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbCA9IHVuZGVmaW5lZD4oXG4gICAgZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCkgZmllbGQud2l0aFJlcXVpcmVkKCk7XG4gICAgaWYgKHByb3BlcnR5U2NoZW1hLmlzUmVhZE9ubHkpIGZpZWxkLndpdGhEaXNhYmxlZCgpO1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ export function fromSchemaCurrencyOptsToCurrency(opts) {
2
+ return {
3
+ currency: typeof opts === 'string' ? opts : opts.currency,
4
+ currencyDisplay: typeof opts === 'object' ? opts.currencyDisplay : undefined,
5
+ currencyProperty: typeof opts === 'object' ? opts.currencyProperty : undefined
6
+ };
7
+ }
8
+ export function fromSchemaFilterNonArrayProperties(propertySchemas) {
9
+ return Object.keys(propertySchemas).filter(key => {
10
+ const propertySchema = propertySchemas[key];
11
+ return ['number', 'string', 'boolean', 'date', 'date-time', 'enum', 'object'].includes(propertySchema.type);
12
+ });
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvaW50ZXJuYWwvY29tbW9uLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBUSxJQUF1QztJQUMzRixPQUFPO1FBQ0gsUUFBUSxFQUFFLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTtRQUN6RCxlQUFlLEVBQUUsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVFLGdCQUFnQixFQUFFLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ2pGLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQyxDQUFRLGVBQXlDO0lBQy9GLE9BQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQXFCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBGcm9tU2NoZW1hQ3VycmVuY3lPcHRzVHlwZTxNb2RlbD4gPVxuICAgIHwgc3RyaW5nXG4gICAgfCB7XG4gICAgICAgICAgY3VycmVuY3lQcm9wZXJ0eT86IGtleW9mIE1vZGVsO1xuICAgICAgICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xuICAgICAgICAgIGN1cnJlbmN5RGlzcGxheT86ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnO1xuICAgICAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2hlbWFDdXJyZW5jeU9wdHNUb0N1cnJlbmN5PE1vZGVsPihvcHRzOiBGcm9tU2NoZW1hQ3VycmVuY3lPcHRzVHlwZTxNb2RlbD4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW5jeTogdHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnID8gb3B0cyA6IG9wdHMuY3VycmVuY3ksXG4gICAgICAgIGN1cnJlbmN5RGlzcGxheTogdHlwZW9mIG9wdHMgPT09ICdvYmplY3QnID8gb3B0cy5jdXJyZW5jeURpc3BsYXkgOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbmN5UHJvcGVydHk6IHR5cGVvZiBvcHRzID09PSAnb2JqZWN0JyA/IG9wdHMuY3VycmVuY3lQcm9wZXJ0eSA6IHVuZGVmaW5lZFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NoZW1hRmlsdGVyTm9uQXJyYXlQcm9wZXJ0aWVzPE1vZGVsPihwcm9wZXJ0eVNjaGVtYXM6IFJlY29yZDxrZXlvZiBNb2RlbCwgYW55Pik6IChrZXlvZiBNb2RlbClbXSB7XG4gICAgcmV0dXJuIChPYmplY3Qua2V5cyhwcm9wZXJ0eVNjaGVtYXMpIGFzIChrZXlvZiBNb2RlbClbXSkuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2NoZW1hID0gcHJvcGVydHlTY2hlbWFzW2tleV07XG4gICAgICAgIHJldHVybiBbJ251bWJlcicsICdzdHJpbmcnLCAnYm9vbGVhbicsICdkYXRlJywgJ2RhdGUtdGltZScsICdlbnVtJywgJ29iamVjdCddLmluY2x1ZGVzKHByb3BlcnR5U2NoZW1hLnR5cGUpO1xuICAgIH0pO1xufVxuIl19