@ngx-formly/core 7.1.0 → 9.0.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.
Files changed (102) hide show
  1. package/README.md +26 -9
  2. package/fesm2022/ngx-formly-core-json-schema.mjs +159 -39
  3. package/fesm2022/ngx-formly-core-json-schema.mjs.map +1 -1
  4. package/fesm2022/ngx-formly-core-preset.mjs +4 -4
  5. package/fesm2022/ngx-formly-core-preset.mjs.map +1 -1
  6. package/fesm2022/ngx-formly-core-select.mjs +28 -21
  7. package/fesm2022/ngx-formly-core-select.mjs.map +1 -1
  8. package/fesm2022/ngx-formly-core-testing.mjs +3 -3
  9. package/fesm2022/ngx-formly-core-testing.mjs.map +1 -1
  10. package/fesm2022/ngx-formly-core.mjs +181 -89
  11. package/fesm2022/ngx-formly-core.mjs.map +1 -1
  12. package/index.d.ts +738 -3
  13. package/json-schema/index.d.ts +39 -5
  14. package/package.json +2 -12
  15. package/preset/index.d.ts +13 -5
  16. package/select/index.d.ts +44 -5
  17. package/testing/index.d.ts +37 -5
  18. package/esm2022/json-schema/formly-json-schema.service.mjs +0 -728
  19. package/esm2022/json-schema/ngx-formly-core-json-schema.mjs +0 -5
  20. package/esm2022/json-schema/public_api.mjs +0 -2
  21. package/esm2022/lib/components/formly.field.mjs +0 -292
  22. package/esm2022/lib/components/formly.form.mjs +0 -171
  23. package/esm2022/lib/components/formly.template.mjs +0 -36
  24. package/esm2022/lib/core.config.mjs +0 -66
  25. package/esm2022/lib/core.mjs +0 -20
  26. package/esm2022/lib/core.module.mjs +0 -74
  27. package/esm2022/lib/extensions/core/core.mjs +0 -144
  28. package/esm2022/lib/extensions/field-expression/field-expression.mjs +0 -8
  29. package/esm2022/lib/extensions/field-expression/utils.mjs +0 -459
  30. package/esm2022/lib/extensions/field-expression-legacy/field-expression.mjs +0 -249
  31. package/esm2022/lib/extensions/field-expression-legacy/utils.mjs +0 -20
  32. package/esm2022/lib/extensions/field-form/field-form.mjs +0 -141
  33. package/esm2022/lib/extensions/field-form/utils.mjs +0 -100
  34. package/esm2022/lib/extensions/field-validation/field-validation.mjs +0 -135
  35. package/esm2022/lib/models/config.mjs +0 -2
  36. package/esm2022/lib/models/fieldconfig.cache.mjs +0 -2
  37. package/esm2022/lib/models/fieldconfig.mjs +0 -2
  38. package/esm2022/lib/models/index.mjs +0 -4
  39. package/esm2022/lib/services/formly.builder.mjs +0 -98
  40. package/esm2022/lib/services/formly.config.mjs +0 -236
  41. package/esm2022/lib/templates/field-array.type.mjs +0 -84
  42. package/esm2022/lib/templates/field-template.type.mjs +0 -34
  43. package/esm2022/lib/templates/field.type.mjs +0 -57
  44. package/esm2022/lib/templates/field.wrapper.mjs +0 -21
  45. package/esm2022/lib/templates/formly.attributes.mjs +0 -201
  46. package/esm2022/lib/templates/formly.group.mjs +0 -31
  47. package/esm2022/lib/templates/formly.validation-message.mjs +0 -84
  48. package/esm2022/lib/utils.mjs +0 -313
  49. package/esm2022/ngx-formly-core.mjs +0 -5
  50. package/esm2022/preset/ngx-formly-core-preset.mjs +0 -5
  51. package/esm2022/preset/preset-substitution.extension.mjs +0 -30
  52. package/esm2022/preset/preset.config.mjs +0 -11
  53. package/esm2022/preset/preset.module.mjs +0 -18
  54. package/esm2022/preset/public_api.mjs +0 -3
  55. package/esm2022/public_api.mjs +0 -5
  56. package/esm2022/select/ngx-formly-core-select.mjs +0 -5
  57. package/esm2022/select/public_api.mjs +0 -3
  58. package/esm2022/select/select-options.pipe.mjs +0 -108
  59. package/esm2022/select/select.module.mjs +0 -16
  60. package/esm2022/testing/component-factory.mjs +0 -86
  61. package/esm2022/testing/ngx-formly-core-testing.mjs +0 -5
  62. package/esm2022/testing/public_api.mjs +0 -2
  63. package/json-schema/formly-json-schema.service.d.ts +0 -31
  64. package/json-schema/public_api.d.ts +0 -1
  65. package/lib/components/formly.field.d.ts +0 -44
  66. package/lib/components/formly.form.d.ts +0 -50
  67. package/lib/components/formly.template.d.ts +0 -19
  68. package/lib/core.config.d.ts +0 -11
  69. package/lib/core.d.ts +0 -20
  70. package/lib/core.module.d.ts +0 -18
  71. package/lib/extensions/core/core.d.ts +0 -14
  72. package/lib/extensions/field-expression/field-expression.d.ts +0 -4
  73. package/lib/extensions/field-expression/utils.d.ts +0 -4
  74. package/lib/extensions/field-expression-legacy/field-expression.d.ts +0 -16
  75. package/lib/extensions/field-expression-legacy/utils.d.ts +0 -5
  76. package/lib/extensions/field-form/field-form.d.ts +0 -11
  77. package/lib/extensions/field-form/utils.d.ts +0 -7
  78. package/lib/extensions/field-validation/field-validation.d.ts +0 -11
  79. package/lib/models/config.d.ts +0 -90
  80. package/lib/models/fieldconfig.cache.d.ts +0 -50
  81. package/lib/models/fieldconfig.d.ts +0 -243
  82. package/lib/models/index.d.ts +0 -3
  83. package/lib/services/formly.builder.d.ts +0 -18
  84. package/lib/services/formly.config.d.ts +0 -56
  85. package/lib/templates/field-array.type.d.ts +0 -22
  86. package/lib/templates/field-template.type.d.ts +0 -12
  87. package/lib/templates/field.type.d.ts +0 -30
  88. package/lib/templates/field.wrapper.d.ts +0 -12
  89. package/lib/templates/formly.attributes.d.ts +0 -52
  90. package/lib/templates/formly.group.d.ts +0 -7
  91. package/lib/templates/formly.validation-message.d.ts +0 -23
  92. package/lib/utils.d.ts +0 -47
  93. package/preset/preset-substitution.extension.d.ts +0 -13
  94. package/preset/preset.config.d.ts +0 -2
  95. package/preset/preset.module.d.ts +0 -7
  96. package/preset/public_api.d.ts +0 -2
  97. package/public_api.d.ts +0 -1
  98. package/select/public_api.d.ts +0 -2
  99. package/select/select-options.pipe.d.ts +0 -33
  100. package/select/select.module.d.ts +0 -7
  101. package/testing/component-factory.d.ts +0 -35
  102. package/testing/public_api.d.ts +0 -1
@@ -1,249 +0,0 @@
1
- import { isObject, isNil, isUndefined, isFunction, defineHiddenProp, observe, getFieldValue, assignFieldValue, hasKey, } from '../../utils';
2
- import { evalExpression, evalStringExpressionLegacy } from './utils';
3
- import { isObservable, Observable } from 'rxjs';
4
- import { tap } from 'rxjs/operators';
5
- import { unregisterControl, registerControl, updateValidity } from '../field-form/utils';
6
- import { UntypedFormArray } from '@angular/forms';
7
- export class FieldExpressionExtension {
8
- onPopulate(field) {
9
- if (field._expressions) {
10
- return;
11
- }
12
- // cache built expression
13
- defineHiddenProp(field, '_expressions', {});
14
- observe(field, ['hide'], ({ currentValue, firstChange }) => {
15
- defineHiddenProp(field, '_hide', !!currentValue);
16
- if (!firstChange || (firstChange && currentValue === true)) {
17
- field.props.hidden = currentValue;
18
- field.options._hiddenFieldsForCheck.push({ field });
19
- }
20
- });
21
- if (field.hideExpression) {
22
- observe(field, ['hideExpression'], ({ currentValue: expr }) => {
23
- field._expressions.hide = this.parseExpressions(field, 'hide', typeof expr === 'boolean' ? () => expr : expr);
24
- });
25
- }
26
- const evalExpr = (key, expr) => {
27
- if (typeof expr === 'string' || isFunction(expr)) {
28
- field._expressions[key] = this.parseExpressions(field, key, expr);
29
- }
30
- else if (expr instanceof Observable) {
31
- field._expressions[key] = {
32
- value$: expr.pipe(tap((v) => {
33
- this.evalExpr(field, key, v);
34
- field.options._detectChanges(field);
35
- })),
36
- };
37
- }
38
- };
39
- field.expressions = field.expressions || {};
40
- for (const key of Object.keys(field.expressions)) {
41
- observe(field, ['expressions', key], ({ currentValue: expr }) => {
42
- evalExpr(key, isFunction(expr) ? (...args) => expr(field, args[3]) : expr);
43
- });
44
- }
45
- field.expressionProperties = field.expressionProperties || {};
46
- for (const key of Object.keys(field.expressionProperties)) {
47
- observe(field, ['expressionProperties', key], ({ currentValue }) => evalExpr(key, currentValue));
48
- }
49
- }
50
- postPopulate(field) {
51
- if (field.parent) {
52
- return;
53
- }
54
- if (!field.options.checkExpressions) {
55
- let checkLocked = false;
56
- field.options.checkExpressions = (f, ignoreCache) => {
57
- if (checkLocked) {
58
- return;
59
- }
60
- checkLocked = true;
61
- const fieldChanged = this.checkExpressions(f, ignoreCache);
62
- const options = field.options;
63
- options._hiddenFieldsForCheck
64
- .sort((f) => (f.field.hide ? -1 : 1))
65
- .forEach((f) => this.changeHideState(f.field, f.field.hide ?? f.default, !ignoreCache));
66
- options._hiddenFieldsForCheck = [];
67
- if (fieldChanged) {
68
- this.checkExpressions(field);
69
- }
70
- checkLocked = false;
71
- };
72
- }
73
- }
74
- parseExpressions(field, path, expr) {
75
- let parentExpression;
76
- if (field.parent && ['hide', 'props.disabled'].includes(path)) {
77
- const rootValue = (f) => {
78
- return path === 'hide' ? f.hide : f.props.disabled;
79
- };
80
- parentExpression = () => {
81
- let root = field.parent;
82
- while (root.parent && !rootValue(root)) {
83
- root = root.parent;
84
- }
85
- return rootValue(root);
86
- };
87
- }
88
- expr = expr || (() => false);
89
- if (typeof expr === 'string') {
90
- expr = this._evalStringExpression(expr, ['model', 'formState', 'field']);
91
- }
92
- let currentValue;
93
- return {
94
- callback: (ignoreCache) => {
95
- try {
96
- const exprValue = evalExpression(parentExpression ? (...args) => parentExpression(field) || expr(...args) : expr, { field }, [field.model, field.options.formState, field, ignoreCache]);
97
- if (ignoreCache ||
98
- (currentValue !== exprValue &&
99
- (!isObject(exprValue) ||
100
- isObservable(exprValue) ||
101
- JSON.stringify(exprValue) !== JSON.stringify(currentValue)))) {
102
- currentValue = exprValue;
103
- this.evalExpr(field, path, exprValue);
104
- return true;
105
- }
106
- return false;
107
- }
108
- catch (error) {
109
- error.message = `[Formly Error] [Expression "${path}"] ${error.message}`;
110
- throw error;
111
- }
112
- },
113
- };
114
- }
115
- _evalStringExpression(expression, argNames) {
116
- return evalStringExpressionLegacy(expression, argNames);
117
- }
118
- checkExpressions(field, ignoreCache = false) {
119
- if (!field) {
120
- return false;
121
- }
122
- let fieldChanged = false;
123
- if (field._expressions) {
124
- for (const key of Object.keys(field._expressions)) {
125
- field._expressions[key].callback?.(ignoreCache) && (fieldChanged = true);
126
- }
127
- }
128
- field.fieldGroup?.forEach((f) => this.checkExpressions(f, ignoreCache) && (fieldChanged = true));
129
- return fieldChanged;
130
- }
131
- changeDisabledState(field, value) {
132
- if (field.fieldGroup) {
133
- field.fieldGroup
134
- .filter((f) => !f._expressions.hasOwnProperty('props.disabled'))
135
- .forEach((f) => this.changeDisabledState(f, value));
136
- }
137
- if (hasKey(field) && field.props.disabled !== value) {
138
- field.props.disabled = value;
139
- }
140
- }
141
- changeHideState(field, hide, resetOnHide) {
142
- if (field.fieldGroup) {
143
- field.fieldGroup
144
- .filter((f) => f && !f._expressions.hide)
145
- .forEach((f) => this.changeHideState(f, hide, resetOnHide));
146
- }
147
- if (field.formControl && hasKey(field)) {
148
- defineHiddenProp(field, '_hide', !!(hide || field.hide));
149
- const c = field.formControl;
150
- if (c._fields?.length > 1) {
151
- updateValidity(c);
152
- }
153
- if (hide === true && (!c._fields || c._fields.every((f) => !!f._hide))) {
154
- unregisterControl(field, true);
155
- if (resetOnHide && field.resetOnHide) {
156
- assignFieldValue(field, undefined);
157
- field.formControl.reset({ value: undefined, disabled: field.formControl.disabled });
158
- field.options.fieldChanges.next({ value: undefined, field, type: 'valueChanges' });
159
- if (field.fieldGroup && field.formControl instanceof UntypedFormArray) {
160
- field.fieldGroup.length = 0;
161
- }
162
- }
163
- }
164
- else if (hide === false) {
165
- if (field.resetOnHide && !isUndefined(field.defaultValue) && isUndefined(getFieldValue(field))) {
166
- assignFieldValue(field, field.defaultValue);
167
- }
168
- registerControl(field, undefined, true);
169
- if (field.resetOnHide && field.fieldArray && field.fieldGroup?.length !== field.model?.length) {
170
- field.options.build(field);
171
- }
172
- }
173
- }
174
- if (field.options.fieldChanges) {
175
- field.options.fieldChanges.next({ field, type: 'hidden', value: hide });
176
- }
177
- }
178
- evalExpr(field, prop, value) {
179
- if (prop.indexOf('model.') === 0) {
180
- const key = prop.replace(/^model\./, ''), parent = field.fieldGroup ? field : field.parent;
181
- let control = field?.key === key ? field.formControl : field.form.get(key);
182
- if (!control && field.get(key)) {
183
- control = field.get(key).formControl;
184
- }
185
- assignFieldValue({ key, parent, model: field.model }, value);
186
- if (control && !(isNil(control.value) && isNil(value)) && control.value !== value) {
187
- control.patchValue(value);
188
- }
189
- }
190
- else {
191
- try {
192
- let target = field;
193
- const paths = this._evalExpressionPath(field, prop);
194
- const lastIndex = paths.length - 1;
195
- for (let i = 0; i < lastIndex; i++) {
196
- target = target[paths[i]];
197
- }
198
- target[paths[lastIndex]] = value;
199
- }
200
- catch (error) {
201
- error.message = `[Formly Error] [Expression "${prop}"] ${error.message}`;
202
- throw error;
203
- }
204
- if (['templateOptions.disabled', 'props.disabled'].includes(prop) && hasKey(field)) {
205
- this.changeDisabledState(field, value);
206
- }
207
- }
208
- this.emitExpressionChanges(field, prop, value);
209
- }
210
- emitExpressionChanges(field, property, value) {
211
- if (!field.options.fieldChanges) {
212
- return;
213
- }
214
- field.options.fieldChanges.next({
215
- field,
216
- type: 'expressionChanges',
217
- property,
218
- value,
219
- });
220
- }
221
- _evalExpressionPath(field, prop) {
222
- if (field._expressions[prop] && field._expressions[prop].paths) {
223
- return field._expressions[prop].paths;
224
- }
225
- let paths = [];
226
- if (prop.indexOf('[') === -1) {
227
- paths = prop.split('.');
228
- }
229
- else {
230
- prop
231
- .split(/[[\]]{1,2}/) // https://stackoverflow.com/a/20198206
232
- .filter((p) => p)
233
- .forEach((path) => {
234
- const arrayPath = path.match(/['|"](.*?)['|"]/);
235
- if (arrayPath) {
236
- paths.push(arrayPath[1]);
237
- }
238
- else {
239
- paths.push(...path.split('.').filter((p) => p));
240
- }
241
- });
242
- }
243
- if (field._expressions[prop]) {
244
- field._expressions[prop].paths = paths;
245
- }
246
- return paths;
247
- }
248
- }
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZXhwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL3NyYy9saWIvZXh0ZW5zaW9ucy9maWVsZC1leHByZXNzaW9uLWxlZ2FjeS9maWVsZC1leHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsRUFDWCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLE1BQU0sR0FDUCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsVUFBVSxDQUFDLEtBQTZCO1FBQ3RDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFNUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtZQUN6RCxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxJQUFJLENB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LENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtbHlWYWx1ZUNoYW5nZUV2ZW50LCBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc05pbCxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRnVuY3Rpb24sXG4gIGRlZmluZUhpZGRlblByb3AsXG4gIG9ic2VydmUsXG4gIGdldEZpZWxkVmFsdWUsXG4gIGFzc2lnbkZpZWxkVmFsdWUsXG4gIGhhc0tleSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgZXZhbEV4cHJlc3Npb24sIGV2YWxTdHJpbmdFeHByZXNzaW9uTGVnYWN5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZvcm1seUV4dGVuc2lvbiB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyB1bnJlZ2lzdGVyQ29udHJvbCwgcmVnaXN0ZXJDb250cm9sLCB1cGRhdGVWYWxpZGl0eSB9IGZyb20gJy4uL2ZpZWxkLWZvcm0vdXRpbHMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkRXhwcmVzc2lvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIEZvcm1seUV4dGVuc2lvbiB7XG4gIG9uUG9wdWxhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUpIHtcbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2FjaGUgYnVpbHQgZXhwcmVzc2lvblxuICAgIGRlZmluZUhpZGRlblByb3AoZmllbGQsICdfZXhwcmVzc2lvbnMnLCB7fSk7XG5cbiAgICBvYnNlcnZlKGZpZWxkLCBbJ2hpZGUnXSwgKHsgY3VycmVudFZhbHVlLCBmaXJzdENoYW5nZSB9KSA9PiB7XG4gICAgICBkZWZpbmVIaWRkZW5Qcm9wKGZpZWxkLCAnX2hpZGUnLCAhIWN1cnJlbnRWYWx1ZSk7XG4gICAgICBpZiAoIWZpcnN0Q2hhbmdlIHx8IChmaXJzdENoYW5nZSAmJiBjdXJyZW50VmFsdWUgPT09IHRydWUpKSB7XG4gICAgICAgIGZpZWxkLnByb3BzLmhpZGRlbiA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgZmllbGQub3B0aW9ucy5faGlkZGVuRmllbGRzRm9yQ2hlY2sucHVzaCh7IGZpZWxkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLmhpZGVFeHByZXNzaW9uKSB7XG4gICAgICBvYnNlcnZlKGZpZWxkLCBbJ2hpZGVFeHByZXNzaW9uJ10sICh7IGN1cnJlbnRWYWx1ZTogZXhwciB9KSA9PiB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9ucy5oaWRlID0gdGhpcy5wYXJzZUV4cHJlc3Npb25zKGZpZWxkLCAnaGlkZScsIHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgPyAoKSA9PiBleHByIDogZXhwcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBldmFsRXhwciA9IChrZXk6IHN0cmluZywgZXhwcjogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IGlzRnVuY3Rpb24oZXhwcikpIHtcbiAgICAgICAgZmllbGQuX2V4cHJlc3Npb25zW2tleV0gPSB0aGlzLnBhcnNlRXhwcmVzc2lvbnMoZmllbGQsIGtleSwgZXhwcik7XG4gICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9uc1trZXldID0ge1xuICAgICAgICAgIHZhbHVlJDogKGV4cHIgYXMgT2JzZXJ2YWJsZTxhbnk+KS5waXBlKFxuICAgICAgICAgICAgdGFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZXZhbEV4cHIoZmllbGQsIGtleSwgdik7XG4gICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuX2RldGVjdENoYW5nZXMoZmllbGQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZmllbGQuZXhwcmVzc2lvbnMgPSBmaWVsZC5leHByZXNzaW9ucyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5leHByZXNzaW9ucykpIHtcbiAgICAgIG9ic2VydmUoZmllbGQsIFsnZXhwcmVzc2lvbnMnLCBrZXldLCAoeyBjdXJyZW50VmFsdWU6IGV4cHIgfSkgPT4ge1xuICAgICAgICBldmFsRXhwcihrZXksIGlzRnVuY3Rpb24oZXhwcikgPyAoLi4uYXJnczogYW55KSA9PiBleHByKGZpZWxkLCBhcmdzWzNdKSA6IGV4cHIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmllbGQuZXhwcmVzc2lvblByb3BlcnRpZXMgPSBmaWVsZC5leHByZXNzaW9uUHJvcGVydGllcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5leHByZXNzaW9uUHJvcGVydGllcykpIHtcbiAgICAgIG9ic2VydmUoZmllbGQsIFsnZXhwcmVzc2lvblByb3BlcnRpZXMnLCBrZXldLCAoeyBjdXJyZW50VmFsdWUgfSkgPT4gZXZhbEV4cHIoa2V5LCBjdXJyZW50VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBwb3N0UG9wdWxhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUpIHtcbiAgICBpZiAoZmllbGQucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFmaWVsZC5vcHRpb25zLmNoZWNrRXhwcmVzc2lvbnMpIHtcbiAgICAgIGxldCBjaGVja0xvY2tlZCA9IGZhbHNlO1xuICAgICAgZmllbGQub3B0aW9ucy5jaGVja0V4cHJlc3Npb25zID0gKGYsIGlnbm9yZUNhY2hlKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xvY2tlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZmllbGRDaGFuZ2VkID0gdGhpcy5jaGVja0V4cHJlc3Npb25zKGYsIGlnbm9yZUNhY2hlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMuX2hpZGRlbkZpZWxkc0ZvckNoZWNrXG4gICAgICAgICAgLnNvcnQoKGYpID0+IChmLmZpZWxkLmhpZGUgPyAtMSA6IDEpKVxuICAgICAgICAgIC5mb3JFYWNoKChmKSA9PiB0aGlzLmNoYW5nZUhpZGVTdGF0ZShmLmZpZWxkLCBmLmZpZWxkLmhpZGUgPz8gZi5kZWZhdWx0LCAhaWdub3JlQ2FjaGUpKTtcbiAgICAgICAgb3B0aW9ucy5faGlkZGVuRmllbGRzRm9yQ2hlY2sgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9ucyhmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tMb2NrZWQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXhwcmVzc2lvbnMoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsIHBhdGg6IHN0cmluZywgZXhwcjogYW55KSB7XG4gICAgbGV0IHBhcmVudEV4cHJlc3Npb246IGFueTtcbiAgICBpZiAoZmllbGQucGFyZW50ICYmIFsnaGlkZScsICdwcm9wcy5kaXNhYmxlZCddLmluY2x1ZGVzKHBhdGgpKSB7XG4gICAgICBjb25zdCByb290VmFsdWUgPSAoZjogRm9ybWx5RmllbGRDb25maWdDYWNoZSkgPT4ge1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gJ2hpZGUnID8gZi5oaWRlIDogZi5wcm9wcy5kaXNhYmxlZDtcbiAgICAgIH07XG5cbiAgICAgIHBhcmVudEV4cHJlc3Npb24gPSAoKSA9PiB7XG4gICAgICAgIGxldCByb290ID0gZmllbGQucGFyZW50O1xuICAgICAgICB3aGlsZSAocm9vdC5wYXJlbnQgJiYgIXJvb3RWYWx1ZShyb290KSkge1xuICAgICAgICAgIHJvb3QgPSByb290LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb290VmFsdWUocm9vdCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGV4cHIgPSBleHByIHx8ICgoKSA9PiBmYWxzZSk7XG4gICAgaWYgKHR5cGVvZiBleHByID09PSAnc3RyaW5nJykge1xuICAgICAgZXhwciA9IHRoaXMuX2V2YWxTdHJpbmdFeHByZXNzaW9uKGV4cHIsIFsnbW9kZWwnLCAnZm9ybVN0YXRlJywgJ2ZpZWxkJ10pO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50VmFsdWU6IGFueTtcblxuICAgIHJldHVybiB7XG4gICAgICBjYWxsYmFjazogKGlnbm9yZUNhY2hlPzogYm9vbGVhbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4cHJWYWx1ZSA9IGV2YWxFeHByZXNzaW9uKFxuICAgICAgICAgICAgcGFyZW50RXhwcmVzc2lvbiA/ICguLi5hcmdzOiBhbnkpID0+IHBhcmVudEV4cHJlc3Npb24oZmllbGQpIHx8IGV4cHIoLi4uYXJncykgOiBleHByLFxuICAgICAgICAgICAgeyBmaWVsZCB9LFxuICAgICAgICAgICAgW2ZpZWxkLm1vZGVsLCBmaWVsZC5vcHRpb25zLmZvcm1TdGF0ZSwgZmllbGQsIGlnbm9yZUNhY2hlXSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaWdub3JlQ2FjaGUgfHxcbiAgICAgICAgICAgIChjdXJyZW50VmFsdWUgIT09IGV4cHJWYWx1ZSAmJlxuICAgICAgICAgICAgICAoIWlzT2JqZWN0KGV4cHJWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICBpc09ic2VydmFibGUoZXhwclZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV4cHJWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSkpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlID0gZXhwclZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ldmFsRXhwcihmaWVsZCwgcGF0aCwgZXhwclZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbRm9ybWx5IEVycm9yXSBbRXhwcmVzc2lvbiBcIiR7cGF0aH1cIl0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZXZhbFN0cmluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBhcmdOYW1lczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gZXZhbFN0cmluZ0V4cHJlc3Npb25MZWdhY3koZXhwcmVzc2lvbiwgYXJnTmFtZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4cHJlc3Npb25zKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCBpZ25vcmVDYWNoZSA9IGZhbHNlKSB7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBmaWVsZENoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5fZXhwcmVzc2lvbnMpKSB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9uc1trZXldLmNhbGxiYWNrPy4oaWdub3JlQ2FjaGUpICYmIChmaWVsZENoYW5nZWQgPSB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmllbGQuZmllbGRHcm91cD8uZm9yRWFjaCgoZikgPT4gdGhpcy5jaGVja0V4cHJlc3Npb25zKGYsIGlnbm9yZUNhY2hlKSAmJiAoZmllbGRDaGFuZ2VkID0gdHJ1ZSkpO1xuXG4gICAgcmV0dXJuIGZpZWxkQ2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlRGlzYWJsZWRTdGF0ZShmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgZmllbGQuZmllbGRHcm91cFxuICAgICAgICAuZmlsdGVyKChmOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSA9PiAhZi5fZXhwcmVzc2lvbnMuaGFzT3duUHJvcGVydHkoJ3Byb3BzLmRpc2FibGVkJykpXG4gICAgICAgIC5mb3JFYWNoKChmKSA9PiB0aGlzLmNoYW5nZURpc2FibGVkU3RhdGUoZiwgdmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzS2V5KGZpZWxkKSAmJiBmaWVsZC5wcm9wcy5kaXNhYmxlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGZpZWxkLnByb3BzLmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VIaWRlU3RhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsIGhpZGU6IGJvb2xlYW4sIHJlc2V0T25IaWRlOiBib29sZWFuKSB7XG4gICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgIGZpZWxkLmZpZWxkR3JvdXBcbiAgICAgICAgLmZpbHRlcigoZjogRm9ybWx5RmllbGRDb25maWdDYWNoZSkgPT4gZiAmJiAhZi5fZXhwcmVzc2lvbnMuaGlkZSlcbiAgICAgICAgLmZvckVhY2goKGYpID0+IHRoaXMuY2hhbmdlSGlkZVN0YXRlKGYsIGhpZGUsIHJlc2V0T25IaWRlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLmZvcm1Db250cm9sICYmIGhhc0tleShmaWVsZCkpIHtcbiAgICAgIGRlZmluZUhpZGRlblByb3AoZmllbGQsICdfaGlkZScsICEhKGhpZGUgfHwgZmllbGQuaGlkZSkpO1xuICAgICAgY29uc3QgYyA9IGZpZWxkLmZvcm1Db250cm9sO1xuICAgICAgaWYgKGMuX2ZpZWxkcz8ubGVuZ3RoID4gMSkge1xuICAgICAgICB1cGRhdGVWYWxpZGl0eShjKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZGUgPT09IHRydWUgJiYgKCFjLl9maWVsZHMgfHwgYy5fZmllbGRzLmV2ZXJ5KChmKSA9PiAhIWYuX2hpZGUpKSkge1xuICAgICAgICB1bnJlZ2lzdGVyQ29udHJvbChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZXNldE9uSGlkZSAmJiBmaWVsZC5yZXNldE9uSGlkZSkge1xuICAgICAgICAgIGFzc2lnbkZpZWxkVmFsdWUoZmllbGQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wucmVzZXQoeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmllbGQuZm9ybUNvbnRyb2wuZGlzYWJsZWQgfSk7XG4gICAgICAgICAgZmllbGQub3B0aW9ucy5maWVsZENoYW5nZXMubmV4dCh7IHZhbHVlOiB1bmRlZmluZWQsIGZpZWxkLCB0eXBlOiAndmFsdWVDaGFuZ2VzJyB9KTtcbiAgICAgICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBmaWVsZC5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZpZWxkR3JvdXAubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGlkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpZWxkLnJlc2V0T25IaWRlICYmICFpc1VuZGVmaW5lZChmaWVsZC5kZWZhdWx0VmFsdWUpICYmIGlzVW5kZWZpbmVkKGdldEZpZWxkVmFsdWUoZmllbGQpKSkge1xuICAgICAgICAgIGFzc2lnbkZpZWxkVmFsdWUoZmllbGQsIGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJDb250cm9sKGZpZWxkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICBpZiAoZmllbGQucmVzZXRPbkhpZGUgJiYgZmllbGQuZmllbGRBcnJheSAmJiBmaWVsZC5maWVsZEdyb3VwPy5sZW5ndGggIT09IGZpZWxkLm1vZGVsPy5sZW5ndGgpIHtcbiAgICAgICAgICBmaWVsZC5vcHRpb25zLmJ1aWxkKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaWVsZC5vcHRpb25zLmZpZWxkQ2hhbmdlcykge1xuICAgICAgZmllbGQub3B0aW9ucy5maWVsZENoYW5nZXMubmV4dCg8Rm9ybWx5VmFsdWVDaGFuZ2VFdmVudD57IGZpZWxkLCB0eXBlOiAnaGlkZGVuJywgdmFsdWU6IGhpZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsRXhwcihmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHByb3AuaW5kZXhPZignbW9kZWwuJykgPT09IDApIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3AucmVwbGFjZSgvXm1vZGVsXFwuLywgJycpLFxuICAgICAgICBwYXJlbnQgPSBmaWVsZC5maWVsZEdyb3VwID8gZmllbGQgOiBmaWVsZC5wYXJlbnQ7XG5cbiAgICAgIGxldCBjb250cm9sID0gZmllbGQ/LmtleSA9PT0ga2V5ID8gZmllbGQuZm9ybUNvbnRyb2wgOiBmaWVsZC5mb3JtLmdldChrZXkpO1xuICAgICAgaWYgKCFjb250cm9sICYmIGZpZWxkLmdldChrZXkpKSB7XG4gICAgICAgIGNvbnRyb2wgPSBmaWVsZC5nZXQoa2V5KS5mb3JtQ29udHJvbDtcbiAgICAgIH1cbiAgICAgIGFzc2lnbkZpZWxkVmFsdWUoeyBrZXksIHBhcmVudCwgbW9kZWw6IGZpZWxkLm1vZGVsIH0sIHZhbHVlKTtcbiAgICAgIGlmIChjb250cm9sICYmICEoaXNOaWwoY29udHJvbC52YWx1ZSkgJiYgaXNOaWwodmFsdWUpKSAmJiBjb250cm9sLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdGFyZ2V0OiBhbnkgPSBmaWVsZDtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLl9ldmFsRXhwcmVzc2lvblBhdGgoZmllbGQsIHByb3ApO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBwYXRocy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W3BhdGhzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldFtwYXRoc1tsYXN0SW5kZXhdXSA9IHZhbHVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gYFtGb3JtbHkgRXJyb3JdIFtFeHByZXNzaW9uIFwiJHtwcm9wfVwiXSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChbJ3RlbXBsYXRlT3B0aW9ucy5kaXNhYmxlZCcsICdwcm9wcy5kaXNhYmxlZCddLmluY2x1ZGVzKHByb3ApICYmIGhhc0tleShmaWVsZCkpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEaXNhYmxlZFN0YXRlKGZpZWxkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0RXhwcmVzc2lvbkNoYW5nZXMoZmllbGQsIHByb3AsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEV4cHJlc3Npb25DaGFuZ2VzKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFmaWVsZC5vcHRpb25zLmZpZWxkQ2hhbmdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpZWxkLm9wdGlvbnMuZmllbGRDaGFuZ2VzLm5leHQoe1xuICAgICAgZmllbGQsXG4gICAgICB0eXBlOiAnZXhwcmVzc2lvbkNoYW5nZXMnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2V2YWxFeHByZXNzaW9uUGF0aChmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgcHJvcDogc3RyaW5nKSB7XG4gICAgaWYgKGZpZWxkLl9leHByZXNzaW9uc1twcm9wXSAmJiBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHMpIHtcbiAgICAgIHJldHVybiBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHM7XG4gICAgfVxuXG4gICAgbGV0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChwcm9wLmluZGV4T2YoJ1snKSA9PT0gLTEpIHtcbiAgICAgIHBhdGhzID0gcHJvcC5zcGxpdCgnLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wXG4gICAgICAgIC5zcGxpdCgvW1tcXF1dezEsMn0vKSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjAxOTgyMDZcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcClcbiAgICAgICAgLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheVBhdGggPSBwYXRoLm1hdGNoKC9bJ3xcIl0oLio/KVsnfFwiXS8pO1xuICAgICAgICAgIGlmIChhcnJheVBhdGgpIHtcbiAgICAgICAgICAgIHBhdGhzLnB1c2goYXJyYXlQYXRoWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aHMucHVzaCguLi5wYXRoLnNwbGl0KCcuJykuZmlsdGVyKChwKSA9PiBwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zW3Byb3BdKSB7XG4gICAgICBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHMgPSBwYXRocztcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbn1cbiJdfQ==
@@ -1,20 +0,0 @@
1
- /**
2
- * Legacy implementation
3
- */
4
- export function evalStringExpressionLegacy(expression, argNames) {
5
- try {
6
- return Function(...argNames, `return ${expression};`);
7
- }
8
- catch (error) {
9
- console.error(error);
10
- }
11
- }
12
- export function evalExpression(expression, thisArg, argVal) {
13
- if (typeof expression === 'function') {
14
- return expression.apply(thisArg, argVal);
15
- }
16
- else {
17
- return expression ? true : false;
18
- }
19
- }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29yZS9zcmMvbGliL2V4dGVuc2lvbnMvZmllbGQtZXhwcmVzc2lvbi1sZWdhY3kvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsVUFBa0IsRUFBRSxRQUFrQjtJQUMvRSxJQUFJLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQyxHQUFHLFFBQVEsRUFBRSxVQUFVLFVBQVUsR0FBRyxDQUFRLENBQUM7SUFDL0QsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsVUFBeUQsRUFDekQsT0FBWSxFQUNaLE1BQWE7SUFFYixJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbkMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbFN0cmluZ0V4cHJlc3Npb25MZWdhY3koZXhwcmVzc2lvbjogc3RyaW5nLCBhcmdOYW1lczogc3RyaW5nW10pOiBhbnkge1xuICB0cnkge1xuICAgIHJldHVybiBGdW5jdGlvbiguLi5hcmdOYW1lcywgYHJldHVybiAke2V4cHJlc3Npb259O2ApIGFzIGFueTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHN0cmluZyB8ICgoLi4udmFsdWU6IGFueVtdKSA9PiBhbnkpIHwgYm9vbGVhbixcbiAgdGhpc0FyZzogYW55LFxuICBhcmdWYWw6IGFueVtdLFxuKTogYW55IHtcbiAgaWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24uYXBwbHkodGhpc0FyZywgYXJnVmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbiA/IHRydWUgOiBmYWxzZTtcbiAgfVxufVxuIl19
@@ -1,141 +0,0 @@
1
- import { UntypedFormGroup, UntypedFormControl, Validators, FormControl, } from '@angular/forms';
2
- import { getFieldValue, defineHiddenProp, hasKey, getKeyPath } from '../../utils';
3
- import { registerControl, findControl, updateValidity } from './utils';
4
- import { of } from 'rxjs';
5
- export class FieldFormExtension {
6
- prePopulate(field) {
7
- if (!this.root) {
8
- this.root = field;
9
- }
10
- if (field.parent) {
11
- Object.defineProperty(field, 'form', {
12
- get: () => field.parent.formControl,
13
- configurable: true,
14
- });
15
- }
16
- }
17
- onPopulate(field) {
18
- if (field.hasOwnProperty('fieldGroup') && !hasKey(field)) {
19
- defineHiddenProp(field, 'formControl', field.form);
20
- }
21
- else {
22
- this.addFormControl(field);
23
- }
24
- }
25
- postPopulate(field) {
26
- if (this.root !== field) {
27
- return;
28
- }
29
- this.root = null;
30
- const markForCheck = this.setValidators(field);
31
- if (markForCheck && field.parent) {
32
- let parent = field.parent;
33
- while (parent) {
34
- if (hasKey(parent) || !parent.parent) {
35
- updateValidity(parent.formControl, true);
36
- }
37
- parent = parent.parent;
38
- }
39
- }
40
- }
41
- addFormControl(field) {
42
- let control = findControl(field);
43
- if (field.fieldArray) {
44
- return;
45
- }
46
- if (!control) {
47
- const controlOptions = { updateOn: field.modelOptions.updateOn };
48
- if (field.fieldGroup) {
49
- control = new UntypedFormGroup({}, controlOptions);
50
- }
51
- else {
52
- const value = hasKey(field) ? getFieldValue(field) : field.defaultValue;
53
- control = new UntypedFormControl({ value, disabled: !!field.props.disabled }, { ...controlOptions, initialValueIsDefault: true });
54
- }
55
- }
56
- else {
57
- if (control instanceof FormControl) {
58
- const value = hasKey(field) ? getFieldValue(field) : field.defaultValue;
59
- control.defaultValue = value;
60
- }
61
- }
62
- registerControl(field, control);
63
- }
64
- setValidators(field, disabled = false) {
65
- if (disabled === false && hasKey(field) && field.props?.disabled) {
66
- disabled = true;
67
- }
68
- let markForCheck = false;
69
- field.fieldGroup?.forEach((f) => f && this.setValidators(f, disabled) && (markForCheck = true));
70
- if (hasKey(field) || !field.parent || (!hasKey(field) && !field.fieldGroup)) {
71
- const { formControl: c } = field;
72
- if (c) {
73
- if (hasKey(field) && c instanceof FormControl) {
74
- if (disabled && c.enabled) {
75
- c.disable({ emitEvent: false, onlySelf: true });
76
- markForCheck = true;
77
- }
78
- if (!disabled && c.disabled) {
79
- c.enable({ emitEvent: false, onlySelf: true });
80
- markForCheck = true;
81
- }
82
- }
83
- if (null === c.validator && this.hasValidators(field, '_validators')) {
84
- c.setValidators(() => {
85
- const v = Validators.compose(this.mergeValidators(field, '_validators'));
86
- return v ? v(c) : null;
87
- });
88
- markForCheck = true;
89
- }
90
- if (null === c.asyncValidator && this.hasValidators(field, '_asyncValidators')) {
91
- c.setAsyncValidators(() => {
92
- const v = Validators.composeAsync(this.mergeValidators(field, '_asyncValidators'));
93
- return v ? v(c) : of(null);
94
- });
95
- markForCheck = true;
96
- }
97
- if (markForCheck) {
98
- updateValidity(c, true);
99
- // update validity of `FormGroup` instance created by field with nested key.
100
- let parent = c.parent;
101
- for (let i = 1; i < getKeyPath(field).length; i++) {
102
- if (parent) {
103
- updateValidity(parent, true);
104
- parent = parent.parent;
105
- }
106
- }
107
- }
108
- }
109
- }
110
- return markForCheck;
111
- }
112
- hasValidators(field, type) {
113
- const c = field.formControl;
114
- if (c?._fields?.length > 1 && c._fields.some((f) => f[type].length > 0)) {
115
- return true;
116
- }
117
- else if (field[type].length > 0) {
118
- return true;
119
- }
120
- return field.fieldGroup?.some((f) => f?.fieldGroup && !hasKey(f) && this.hasValidators(f, type));
121
- }
122
- mergeValidators(field, type) {
123
- const validators = [];
124
- const c = field.formControl;
125
- if (c?._fields?.length > 1) {
126
- c._fields
127
- .filter((f) => !f._hide)
128
- .forEach((f) => validators.push(...f[type]));
129
- }
130
- else if (field[type]) {
131
- validators.push(...field[type]);
132
- }
133
- if (field.fieldGroup) {
134
- field.fieldGroup
135
- .filter((f) => f?.fieldGroup && !hasKey(f))
136
- .forEach((f) => validators.push(...this.mergeValidators(f, type)));
137
- }
138
- return validators;
139
- }
140
- }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL3NyYy9saWIvZXh0ZW5zaW9ucy9maWVsZC1mb3JtL2ZpZWxkLWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFFbEIsVUFBVSxFQUdWLFdBQVcsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQixNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFdBQVcsQ0FBQyxLQUE2QjtRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFDbkMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsV0FBVztnQkFDcEMsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBNkI7UUFDdEMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekQsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxD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QUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLFVBQVU7aUJBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1seUV4dGVuc2lvbiwgRm9ybWx5RmllbGRDb25maWdDYWNoZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIEFic3RyYWN0Q29udHJvbE9wdGlvbnMsXG4gIFZhbGlkYXRvcnMsXG4gIFZhbGlkYXRvckZuLFxuICBBc3luY1ZhbGlkYXRvckZuLFxuICBGb3JtQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgZGVmaW5lSGlkZGVuUHJvcCwgaGFzS2V5LCBnZXRLZXlQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJDb250cm9sLCBmaW5kQ29udHJvbCwgdXBkYXRlVmFsaWRpdHkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEZvcm1FeHRlbnNpb24gaW1wbGVtZW50cyBGb3JtbHlFeHRlbnNpb24ge1xuICBwcml2YXRlIHJvb3Q6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGU7XG4gIHByZVBvcHVsYXRlKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSB7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgIHRoaXMucm9vdCA9IGZpZWxkO1xuICAgIH1cblxuICAgIGlmIChmaWVsZC5wYXJlbnQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJ2Zvcm0nLCB7XG4gICAgICAgIGdldDogKCkgPT4gZmllbGQucGFyZW50IS5mb3JtQ29udHJvbCxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Qb3B1bGF0ZShmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSkge1xuICAgIGlmIChmaWVsZC5oYXNPd25Qcm9wZXJ0eSgnZmllbGRHcm91cCcpICYmICFoYXNLZXkoZmllbGQpKSB7XG4gICAgICBkZWZpbmVIaWRkZW5Qcm9wKGZpZWxkLCAnZm9ybUNvbnRyb2wnLCBmaWVsZC5mb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRGb3JtQ29udHJvbChmaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFBvcHVsYXRlKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSB7XG4gICAgaWYgKHRoaXMucm9vdCAhPT0gZmllbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgIGNvbnN0IG1hcmtGb3JDaGVjayA9IHRoaXMuc2V0VmFsaWRhdG9ycyhmaWVsZCk7XG4gICAgaWYgKG1hcmtGb3JDaGVjayAmJiBmaWVsZC5wYXJlbnQpIHtcbiAgICAgIGxldCBwYXJlbnQgPSBmaWVsZC5wYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChoYXNLZXkocGFyZW50KSB8fCAhcGFyZW50LnBhcmVudCkge1xuICAgICAgICAgIHVwZGF0ZVZhbGlkaXR5KHBhcmVudC5mb3JtQ29udHJvbCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEZvcm1Db250cm9sKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSB7XG4gICAgbGV0IGNvbnRyb2wgPSBmaW5kQ29udHJvbChmaWVsZCk7XG4gICAgaWYgKGZpZWxkLmZpZWxkQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zID0geyB1cGRhdGVPbjogZmllbGQubW9kZWxPcHRpb25zLnVwZGF0ZU9uIH07XG5cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSwgY29udHJvbE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoYXNLZXkoZmllbGQpID8gZ2V0RmllbGRWYWx1ZShmaWVsZCkgOiBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIGNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKFxuICAgICAgICAgIHsgdmFsdWUsIGRpc2FibGVkOiAhIWZpZWxkLnByb3BzLmRpc2FibGVkIH0sXG4gICAgICAgICAgeyAuLi5jb250cm9sT3B0aW9ucywgaW5pdGlhbFZhbHVlSXNEZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoYXNLZXkoZmllbGQpID8gZ2V0RmllbGRWYWx1ZShmaWVsZCkgOiBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIChjb250cm9sIGFzIGFueSkuZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJDb250cm9sKGZpZWxkLCBjb250cm9sKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsaWRhdG9ycyhmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgZGlzYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmIChkaXNhYmxlZCA9PT0gZmFsc2UgJiYgaGFzS2V5KGZpZWxkKSAmJiBmaWVsZC5wcm9wcz8uZGlzYWJsZWQpIHtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgbWFya0ZvckNoZWNrID0gZmFsc2U7XG4gICAgZmllbGQuZmllbGRHcm91cD8uZm9yRWFjaCgoZikgPT4gZiAmJiB0aGlzLnNldFZhbGlkYXRvcnMoZiwgZGlzYWJsZWQpICYmIChtYXJrRm9yQ2hlY2sgPSB0cnVlKSk7XG4gICAgaWYgKGhhc0tleShmaWVsZCkgfHwgIWZpZWxkLnBhcmVudCB8fCAoIWhhc0tleShmaWVsZCkgJiYgIWZpZWxkLmZpZWxkR3JvdXApKSB7XG4gICAgICBjb25zdCB7IGZvcm1Db250cm9sOiBjIH0gPSBmaWVsZDtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIGlmIChoYXNLZXkoZmllbGQpICYmIGMgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgICAgIGlmIChkaXNhYmxlZCAmJiBjLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGMuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgbWFya0ZvckNoZWNrID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWRpc2FibGVkICYmIGMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGMuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICBtYXJrRm9yQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudWxsID09PSBjLnZhbGlkYXRvciAmJiB0aGlzLmhhc1ZhbGlkYXRvcnMoZmllbGQsICdfdmFsaWRhdG9ycycpKSB7XG4gICAgICAgICAgYy5zZXRWYWxpZGF0b3JzKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBWYWxpZGF0b3JzLmNvbXBvc2UodGhpcy5tZXJnZVZhbGlkYXRvcnM8VmFsaWRhdG9yRm4+KGZpZWxkLCAnX3ZhbGlkYXRvcnMnKSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2ID8gdihjKSA6IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFya0ZvckNoZWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudWxsID09PSBjLmFzeW5jVmFsaWRhdG9yICYmIHRoaXMuaGFzVmFsaWRhdG9ycyhmaWVsZCwgJ19hc3luY1ZhbGlkYXRvcnMnKSkge1xuICAgICAgICAgIGMuc2V0QXN5bmNWYWxpZGF0b3JzKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyh0aGlzLm1lcmdlVmFsaWRhdG9yczxBc3luY1ZhbGlkYXRvckZuPihmaWVsZCwgJ19hc3luY1ZhbGlkYXRvcnMnKSk7XG4gICAgICAgICAgICByZXR1cm4gdiA/IHYoYykgOiBvZihudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBtYXJrRm9yQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaykge1xuICAgICAgICAgIHVwZGF0ZVZhbGlkaXR5KGMsIHRydWUpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlIHZhbGlkaXR5IG9mIGBGb3JtR3JvdXBgIGluc3RhbmNlIGNyZWF0ZWQgYnkgZmllbGQgd2l0aCBuZXN0ZWQga2V5LlxuICAgICAgICAgIGxldCBwYXJlbnQgPSBjLnBhcmVudDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGdldEtleVBhdGgoZmllbGQpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgIHVwZGF0ZVZhbGlkaXR5KHBhcmVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmtGb3JDaGVjaztcbiAgfVxuXG4gIHByaXZhdGUgaGFzVmFsaWRhdG9ycyhmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgdHlwZTogJ192YWxpZGF0b3JzJyB8ICdfYXN5bmNWYWxpZGF0b3JzJyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGMgPSBmaWVsZC5mb3JtQ29udHJvbDtcbiAgICBpZiAoYz8uX2ZpZWxkcz8ubGVuZ3RoID4gMSAmJiBjLl9maWVsZHMuc29tZSgoZikgPT4gZlt0eXBlXS5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZFt0eXBlXS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQuZmllbGRHcm91cD8uc29tZSgoZikgPT4gZj8uZmllbGRHcm91cCAmJiAhaGFzS2V5KGYpICYmIHRoaXMuaGFzVmFsaWRhdG9ycyhmLCB0eXBlKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlVmFsaWRhdG9yczxUPihmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgdHlwZTogJ192YWxpZGF0b3JzJyB8ICdfYXN5bmNWYWxpZGF0b3JzJyk6IFRbXSB7XG4gICAgY29uc3QgdmFsaWRhdG9yczogYW55ID0gW107XG4gICAgY29uc3QgYyA9IGZpZWxkLmZvcm1Db250cm9sO1xuICAgIGlmIChjPy5fZmllbGRzPy5sZW5ndGggPiAxKSB7XG4gICAgICBjLl9maWVsZHNcbiAgICAgICAgLmZpbHRlcigoZjogRm9ybWx5RmllbGRDb25maWdDYWNoZSkgPT4gIWYuX2hpZGUpXG4gICAgICAgIC5mb3JFYWNoKChmOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSA9PiB2YWxpZGF0b3JzLnB1c2goLi4uZlt0eXBlXSkpO1xuICAgIH0gZWxzZSBpZiAoZmllbGRbdHlwZV0pIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCguLi5maWVsZFt0eXBlXSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgIGZpZWxkLmZpZWxkR3JvdXBcbiAgICAgICAgLmZpbHRlcigoZikgPT4gZj8uZmllbGRHcm91cCAmJiAhaGFzS2V5KGYpKVxuICAgICAgICAuZm9yRWFjaCgoZikgPT4gdmFsaWRhdG9ycy5wdXNoKC4uLnRoaXMubWVyZ2VWYWxpZGF0b3JzKGYsIHR5cGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cbn1cbiJdfQ==
@@ -1,100 +0,0 @@
1
- import { UntypedFormArray, UntypedFormGroup, FormControl } from '@angular/forms';
2
- import { getKeyPath, getFieldValue, isNil, defineHiddenProp, observe, hasKey } from '../../utils';
3
- export function unregisterControl(field, emitEvent = false) {
4
- const control = field.formControl;
5
- const fieldIndex = control._fields ? control._fields.indexOf(field) : -1;
6
- if (fieldIndex !== -1) {
7
- control._fields.splice(fieldIndex, 1);
8
- }
9
- const form = control.parent;
10
- if (!form) {
11
- return;
12
- }
13
- const opts = { emitEvent };
14
- if (form instanceof UntypedFormArray) {
15
- const key = form.controls.findIndex((c) => c === control);
16
- if (key !== -1) {
17
- form.removeAt(key, opts);
18
- }
19
- }
20
- else if (form instanceof UntypedFormGroup) {
21
- const paths = getKeyPath(field);
22
- const key = paths[paths.length - 1];
23
- if (form.get([key]) === control) {
24
- form.removeControl(key, opts);
25
- }
26
- }
27
- control.setParent(null);
28
- }
29
- export function findControl(field) {
30
- if (field.formControl) {
31
- return field.formControl;
32
- }
33
- if (field.shareFormControl === false) {
34
- return null;
35
- }
36
- return field.form?.get(getKeyPath(field));
37
- }
38
- export function registerControl(field, control, emitEvent = false) {
39
- control = control || field.formControl;
40
- if (!control._fields) {
41
- defineHiddenProp(control, '_fields', []);
42
- }
43
- if (control._fields.indexOf(field) === -1) {
44
- control._fields.push(field);
45
- }
46
- if (!field.formControl && control) {
47
- defineHiddenProp(field, 'formControl', control);
48
- control.setValidators(null);
49
- control.setAsyncValidators(null);
50
- field.props.disabled = !!field.props.disabled;
51
- const disabledObserver = observe(field, ['props', 'disabled'], ({ firstChange, currentValue }) => {
52
- if (!firstChange) {
53
- currentValue ? field.formControl.disable() : field.formControl.enable();
54
- }
55
- });
56
- if (control instanceof FormControl) {
57
- control.registerOnDisabledChange(disabledObserver.setValue);
58
- }
59
- }
60
- if (!field.form || !hasKey(field)) {
61
- return;
62
- }
63
- let form = field.form;
64
- const paths = getKeyPath(field);
65
- const value = getFieldValue(field);
66
- if (!(isNil(control.value) && isNil(value)) && control.value !== value && control instanceof FormControl) {
67
- control.patchValue(value);
68
- }
69
- for (let i = 0; i < paths.length - 1; i++) {
70
- const path = paths[i];
71
- if (!form.get([path])) {
72
- form.setControl(path, new UntypedFormGroup({}), { emitEvent });
73
- }
74
- form = form.get([path]);
75
- }
76
- const key = paths[paths.length - 1];
77
- if (!field._hide && form.get([key]) !== control) {
78
- form.setControl(key, control, { emitEvent });
79
- }
80
- }
81
- export function updateValidity(c, onlySelf = false) {
82
- const status = c.status;
83
- const value = c.value;
84
- c.updateValueAndValidity({ emitEvent: false, onlySelf });
85
- if (status !== c.status) {
86
- c.statusChanges.emit(c.status);
87
- }
88
- if (value !== c.value) {
89
- c.valueChanges.emit(c.value);
90
- }
91
- }
92
- export function clearControl(form) {
93
- delete form?._fields;
94
- form.setValidators(null);
95
- form.setAsyncValidators(null);
96
- if (form instanceof UntypedFormGroup || form instanceof UntypedFormArray) {
97
- Object.values(form.controls).forEach((c) => clearControl(c));
98
- }
99
- }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29yZS9zcmMvbGliL2V4dGVuc2lvbnMvZmllbGQtZm9ybS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQW1CLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xHLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUE2QixFQUFFLFNBQVMsR0FBRyxLQUFLO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBNkMsQ0FBQztJQUNuRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDM0IsSUFBSSxJQUFJLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9B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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0S2V5UGF0aCwgZ2V0RmllbGRWYWx1ZSwgaXNOaWwsIGRlZmluZUhpZGRlblByb3AsIG9ic2VydmUsIGhhc0tleSB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckNvbnRyb2woZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsIGVtaXRFdmVudCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnRyb2wgPSBmaWVsZC5mb3JtQ29udHJvbDtcbiAgY29uc3QgZmllbGRJbmRleCA9IGNvbnRyb2wuX2ZpZWxkcyA/IGNvbnRyb2wuX2ZpZWxkcy5pbmRleE9mKGZpZWxkKSA6IC0xO1xuICBpZiAoZmllbGRJbmRleCAhPT0gLTEpIHtcbiAgICBjb250cm9sLl9maWVsZHMuc3BsaWNlKGZpZWxkSW5kZXgsIDEpO1xuICB9XG5cbiAgY29uc3QgZm9ybSA9IGNvbnRyb2wucGFyZW50IGFzIFVudHlwZWRGb3JtQXJyYXkgfCBVbnR5cGVkRm9ybUdyb3VwO1xuICBpZiAoIWZvcm0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRzID0geyBlbWl0RXZlbnQgfTtcbiAgaWYgKGZvcm0gaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XG4gICAgY29uc3Qga2V5ID0gZm9ybS5jb250cm9scy5maW5kSW5kZXgoKGMpID0+IGMgPT09IGNvbnRyb2wpO1xuICAgIGlmIChrZXkgIT09IC0xKSB7XG4gICAgICBmb3JtLnJlbW92ZUF0KGtleSwgb3B0cyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgY29uc3QgcGF0aHMgPSBnZXRLZXlQYXRoKGZpZWxkKTtcbiAgICBjb25zdCBrZXkgPSBwYXRoc1twYXRocy5sZW5ndGggLSAxXTtcbiAgICBpZiAoZm9ybS5nZXQoW2tleV0pID09PSBjb250cm9sKSB7XG4gICAgICBmb3JtLnJlbW92ZUNvbnRyb2woa2V5LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBjb250cm9sLnNldFBhcmVudChudWxsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb250cm9sKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKTogQWJzdHJhY3RDb250cm9sIHtcbiAgaWYgKGZpZWxkLmZvcm1Db250cm9sKSB7XG4gICAgcmV0dXJuIGZpZWxkLmZvcm1Db250cm9sO1xuICB9XG5cbiAgaWYgKGZpZWxkLnNoYXJlRm9ybUNvbnRyb2wgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmllbGQuZm9ybT8uZ2V0KGdldEtleVBhdGgoZmllbGQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29udHJvbChcbiAgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsXG4gIGNvbnRyb2w/OiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlWydmb3JtQ29udHJvbCddLFxuICBlbWl0RXZlbnQgPSBmYWxzZSxcbikge1xuICBjb250cm9sID0gY29udHJvbCB8fCBmaWVsZC5mb3JtQ29udHJvbDtcblxuICBpZiAoIWNvbnRyb2wuX2ZpZWxkcykge1xuICAgIGRlZmluZUhpZGRlblByb3AoY29udHJvbCwgJ19maWVsZHMnLCBbXSk7XG4gIH1cbiAgaWYgKGNvbnRyb2wuX2ZpZWxkcy5pbmRleE9mKGZpZWxkKSA9PT0gLTEpIHtcbiAgICBjb250cm9sLl9maWVsZHMucHVzaChmaWVsZCk7XG4gIH1cblxuICBpZiAoIWZpZWxkLmZvcm1Db250cm9sICYmIGNvbnRyb2wpIHtcbiAgICBkZWZpbmVIaWRkZW5Qcm9wKGZpZWxkLCAnZm9ybUNvbnRyb2wnLCBjb250cm9sKTtcbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnMobnVsbCk7XG4gICAgY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMobnVsbCk7XG5cbiAgICBmaWVsZC5wcm9wcy5kaXNhYmxlZCA9ICEhZmllbGQucHJvcHMuZGlzYWJsZWQ7XG4gICAgY29uc3QgZGlzYWJsZWRPYnNlcnZlciA9IG9ic2VydmUoZmllbGQsIFsncHJvcHMnLCAnZGlzYWJsZWQnXSwgKHsgZmlyc3RDaGFuZ2UsIGN1cnJlbnRWYWx1ZSB9KSA9PiB7XG4gICAgICBpZiAoIWZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA/IGZpZWxkLmZvcm1Db250cm9sLmRpc2FibGUoKSA6IGZpZWxkLmZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKGRpc2FibGVkT2JzZXJ2ZXIuc2V0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZmllbGQuZm9ybSB8fCAhaGFzS2V5KGZpZWxkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmb3JtID0gZmllbGQuZm9ybTtcbiAgY29uc3QgcGF0aHMgPSBnZXRLZXlQYXRoKGZpZWxkKTtcbiAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgaWYgKCEoaXNOaWwoY29udHJvbC52YWx1ZSkgJiYgaXNOaWwodmFsdWUpKSAmJiBjb250cm9sLnZhbHVlICE9PSB2YWx1ZSAmJiBjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcbiAgICBjb250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXRoID0gcGF0aHNbaV07XG4gICAgaWYgKCFmb3JtLmdldChbcGF0aF0pKSB7XG4gICAgICAoZm9ybSBhcyBVbnR5cGVkRm9ybUdyb3VwKS5zZXRDb250cm9sKHBhdGgsIG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KSwgeyBlbWl0RXZlbnQgfSk7XG4gICAgfVxuXG4gICAgZm9ybSA9IDxVbnR5cGVkRm9ybUdyb3VwPmZvcm0uZ2V0KFtwYXRoXSk7XG4gIH1cblxuICBjb25zdCBrZXkgPSBwYXRoc1twYXRocy5sZW5ndGggLSAxXTtcbiAgaWYgKCFmaWVsZC5faGlkZSAmJiBmb3JtLmdldChba2V5XSkgIT09IGNvbnRyb2wpIHtcbiAgICAoZm9ybSBhcyBVbnR5cGVkRm9ybUdyb3VwKS5zZXRDb250cm9sKGtleSwgY29udHJvbCwgeyBlbWl0RXZlbnQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbGlkaXR5KGM6IEFic3RyYWN0Q29udHJvbCwgb25seVNlbGYgPSBmYWxzZSkge1xuICBjb25zdCBzdGF0dXMgPSBjLnN0YXR1cztcbiAgY29uc3QgdmFsdWUgPSBjLnZhbHVlO1xuICBjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZiB9KTtcbiAgaWYgKHN0YXR1cyAhPT0gYy5zdGF0dXMpIHtcbiAgICAoYy5zdGF0dXNDaGFuZ2VzIGFzIEV2ZW50RW1pdHRlcjxzdHJpbmc+KS5lbWl0KGMuc3RhdHVzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gYy52YWx1ZSkge1xuICAgIChjLnZhbHVlQ2hhbmdlcyBhcyBFdmVudEVtaXR0ZXI8YW55PikuZW1pdChjLnZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb250cm9sKGZvcm06IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGVbJ2Zvcm1Db250cm9sJ10pIHtcbiAgZGVsZXRlIGZvcm0/Ll9maWVsZHM7XG4gIGZvcm0uc2V0VmFsaWRhdG9ycyhudWxsKTtcbiAgZm9ybS5zZXRBc3luY1ZhbGlkYXRvcnMobnVsbCk7XG4gIGlmIChmb3JtIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCB8fCBmb3JtIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgIE9iamVjdC52YWx1ZXMoZm9ybS5jb250cm9scykuZm9yRWFjaCgoYykgPT4gY2xlYXJDb250cm9sKGMpKTtcbiAgfVxufVxuIl19