@rjsf/core 4.2.2 → 4.2.3

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 (130) hide show
  1. package/dist/cjs/components/AddButton.js +39 -0
  2. package/dist/cjs/components/ErrorList.js +41 -0
  3. package/dist/cjs/components/Form.js +588 -0
  4. package/dist/cjs/components/IconButton.js +37 -0
  5. package/dist/cjs/components/fields/ArrayField.js +977 -0
  6. package/dist/cjs/components/fields/BooleanField.js +107 -0
  7. package/dist/cjs/components/fields/DescriptionField.js +50 -0
  8. package/dist/cjs/components/fields/MultiSchemaField.js +275 -0
  9. package/dist/cjs/components/fields/NullField.js +66 -0
  10. package/dist/cjs/components/fields/NumberField.js +156 -0
  11. package/dist/cjs/components/fields/ObjectField.js +366 -0
  12. package/dist/cjs/components/fields/SchemaField.js +546 -0
  13. package/dist/cjs/components/fields/StringField.js +98 -0
  14. package/dist/cjs/components/fields/TitleField.js +42 -0
  15. package/dist/cjs/components/fields/UnsupportedField.js +46 -0
  16. package/dist/cjs/components/fields/index.js +47 -0
  17. package/dist/cjs/components/widgets/AltDateTimeWidget.js +48 -0
  18. package/dist/cjs/components/widgets/AltDateWidget.js +301 -0
  19. package/dist/cjs/components/widgets/BaseInput.js +151 -0
  20. package/dist/cjs/components/widgets/CheckboxWidget.js +85 -0
  21. package/dist/cjs/components/widgets/CheckboxesWidget.js +121 -0
  22. package/dist/cjs/components/widgets/ColorWidget.js +45 -0
  23. package/dist/cjs/components/widgets/DateTimeWidget.js +43 -0
  24. package/dist/cjs/components/widgets/DateWidget.js +39 -0
  25. package/dist/cjs/components/widgets/EmailWidget.js +34 -0
  26. package/dist/cjs/components/widgets/FileWidget.js +215 -0
  27. package/dist/cjs/components/widgets/HiddenWidget.js +36 -0
  28. package/dist/cjs/components/widgets/PasswordWidget.js +34 -0
  29. package/dist/cjs/components/widgets/RadioWidget.js +107 -0
  30. package/dist/cjs/components/widgets/RangeWidget.js +46 -0
  31. package/dist/cjs/components/widgets/SelectWidget.js +151 -0
  32. package/dist/cjs/components/widgets/SubmitButton.js +35 -0
  33. package/dist/cjs/components/widgets/TextWidget.js +31 -0
  34. package/dist/cjs/components/widgets/TextareaWidget.js +81 -0
  35. package/dist/cjs/components/widgets/URLWidget.js +34 -0
  36. package/dist/cjs/components/widgets/UpDownWidget.js +36 -0
  37. package/dist/cjs/components/widgets/index.js +73 -0
  38. package/dist/cjs/defaultRegistry.js +23 -0
  39. package/dist/cjs/index.js +37 -0
  40. package/dist/cjs/types.js +47 -0
  41. package/dist/cjs/utils.js +1407 -0
  42. package/dist/cjs/validate.js +354 -0
  43. package/dist/cjs/withTheme.js +53 -0
  44. package/dist/es/components/AddButton.js +28 -0
  45. package/dist/es/components/ErrorList.js +31 -0
  46. package/dist/es/components/Form.js +572 -0
  47. package/dist/es/components/IconButton.js +27 -0
  48. package/dist/es/components/fields/ArrayField.js +959 -0
  49. package/dist/es/components/fields/BooleanField.js +93 -0
  50. package/dist/es/components/fields/DescriptionField.js +39 -0
  51. package/dist/es/components/fields/MultiSchemaField.js +261 -0
  52. package/dist/es/components/fields/NullField.js +55 -0
  53. package/dist/es/components/fields/NumberField.js +141 -0
  54. package/dist/es/components/fields/ObjectField.js +351 -0
  55. package/dist/es/components/fields/SchemaField.js +528 -0
  56. package/dist/es/components/fields/StringField.js +84 -0
  57. package/dist/es/components/fields/TitleField.js +30 -0
  58. package/dist/es/components/fields/UnsupportedField.js +35 -0
  59. package/dist/es/components/fields/index.js +26 -0
  60. package/dist/es/components/widgets/AltDateTimeWidget.js +36 -0
  61. package/dist/es/components/widgets/AltDateWidget.js +287 -0
  62. package/dist/es/components/widgets/BaseInput.js +140 -0
  63. package/dist/es/components/widgets/CheckboxWidget.js +73 -0
  64. package/dist/es/components/widgets/CheckboxesWidget.js +108 -0
  65. package/dist/es/components/widgets/ColorWidget.js +34 -0
  66. package/dist/es/components/widgets/DateTimeWidget.js +31 -0
  67. package/dist/es/components/widgets/DateWidget.js +28 -0
  68. package/dist/es/components/widgets/EmailWidget.js +23 -0
  69. package/dist/es/components/widgets/FileWidget.js +201 -0
  70. package/dist/es/components/widgets/HiddenWidget.js +25 -0
  71. package/dist/es/components/widgets/PasswordWidget.js +23 -0
  72. package/dist/es/components/widgets/RadioWidget.js +94 -0
  73. package/dist/es/components/widgets/RangeWidget.js +34 -0
  74. package/dist/es/components/widgets/SelectWidget.js +138 -0
  75. package/dist/es/components/widgets/SubmitButton.js +24 -0
  76. package/dist/es/components/widgets/TextWidget.js +20 -0
  77. package/dist/es/components/widgets/TextareaWidget.js +70 -0
  78. package/dist/es/components/widgets/URLWidget.js +23 -0
  79. package/dist/es/components/widgets/UpDownWidget.js +24 -0
  80. package/dist/es/components/widgets/index.js +43 -0
  81. package/dist/es/defaultRegistry.js +12 -0
  82. package/dist/es/index.js +16 -0
  83. package/dist/es/types.js +34 -0
  84. package/dist/es/utils.js +1309 -0
  85. package/dist/es/validate.js +338 -0
  86. package/dist/es/withTheme.js +39 -0
  87. package/lib/components/AddButton.js +28 -0
  88. package/lib/components/ErrorList.js +31 -0
  89. package/lib/components/Form.js +572 -0
  90. package/lib/components/IconButton.js +27 -0
  91. package/lib/components/fields/ArrayField.js +959 -0
  92. package/lib/components/fields/BooleanField.js +93 -0
  93. package/lib/components/fields/DescriptionField.js +39 -0
  94. package/lib/components/fields/MultiSchemaField.js +261 -0
  95. package/lib/components/fields/NullField.js +55 -0
  96. package/lib/components/fields/NumberField.js +141 -0
  97. package/lib/components/fields/ObjectField.js +351 -0
  98. package/lib/components/fields/SchemaField.js +528 -0
  99. package/lib/components/fields/StringField.js +84 -0
  100. package/lib/components/fields/TitleField.js +30 -0
  101. package/lib/components/fields/UnsupportedField.js +35 -0
  102. package/lib/components/fields/index.js +26 -0
  103. package/lib/components/widgets/AltDateTimeWidget.js +36 -0
  104. package/lib/components/widgets/AltDateWidget.js +287 -0
  105. package/lib/components/widgets/BaseInput.js +140 -0
  106. package/lib/components/widgets/CheckboxWidget.js +73 -0
  107. package/lib/components/widgets/CheckboxesWidget.js +108 -0
  108. package/lib/components/widgets/ColorWidget.js +34 -0
  109. package/lib/components/widgets/DateTimeWidget.js +31 -0
  110. package/lib/components/widgets/DateWidget.js +28 -0
  111. package/lib/components/widgets/EmailWidget.js +23 -0
  112. package/lib/components/widgets/FileWidget.js +201 -0
  113. package/lib/components/widgets/HiddenWidget.js +25 -0
  114. package/lib/components/widgets/PasswordWidget.js +23 -0
  115. package/lib/components/widgets/RadioWidget.js +94 -0
  116. package/lib/components/widgets/RangeWidget.js +34 -0
  117. package/lib/components/widgets/SelectWidget.js +138 -0
  118. package/lib/components/widgets/SubmitButton.js +24 -0
  119. package/lib/components/widgets/TextWidget.js +20 -0
  120. package/lib/components/widgets/TextareaWidget.js +70 -0
  121. package/lib/components/widgets/URLWidget.js +23 -0
  122. package/lib/components/widgets/UpDownWidget.js +24 -0
  123. package/lib/components/widgets/index.js +43 -0
  124. package/lib/defaultRegistry.js +12 -0
  125. package/lib/index.js +16 -0
  126. package/lib/types.js +34 -0
  127. package/lib/utils.js +1309 -0
  128. package/lib/validate.js +338 -0
  129. package/lib/withTheme.js +39 -0
  130. package/package.json +6 -3
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _pick2 = _interopRequireDefault(require("lodash/pick"));
13
+
14
+ var _get2 = _interopRequireDefault(require("lodash/get"));
15
+
16
+ var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
17
+
18
+ var _defaultRegistry = require("../defaultRegistry");
19
+
20
+ var _ErrorList = _interopRequireDefault(require("./ErrorList"));
21
+
22
+ var _utils = require("../utils");
23
+
24
+ var _validate = _interopRequireWildcard(require("../validate"));
25
+
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
27
+
28
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } }
29
+
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
31
+
32
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
33
+
34
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
35
+
36
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
37
+
38
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
39
+
40
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
41
+
42
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
43
+
44
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
45
+
46
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
47
+
48
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
49
+
50
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
51
+
52
+ var Form =
53
+ /*#__PURE__*/
54
+ function (_Component) {
55
+ _inherits(Form, _Component);
56
+
57
+ function Form(props) {
58
+ var _this;
59
+
60
+ _classCallCheck(this, Form);
61
+
62
+ _this = _possibleConstructorReturn(this, _getPrototypeOf(Form).call(this, props));
63
+
64
+ _defineProperty(_assertThisInitialized(_this), "getUsedFormData", function (formData, fields) {
65
+ //for the case of a single input form
66
+ if (fields.length === 0 && _typeof(formData) !== "object") {
67
+ return formData;
68
+ }
69
+
70
+ var data = (0, _pick2["default"])(formData, fields);
71
+
72
+ if (Array.isArray(formData)) {
73
+ return Object.keys(data).map(function (key) {
74
+ return data[key];
75
+ });
76
+ }
77
+
78
+ return data;
79
+ });
80
+
81
+ _defineProperty(_assertThisInitialized(_this), "getFieldNames", function (pathSchema, formData) {
82
+ var getAllPaths = function getAllPaths(_obj) {
83
+ var acc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
84
+ var paths = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [""];
85
+ Object.keys(_obj).forEach(function (key) {
86
+ if (_typeof(_obj[key]) === "object") {
87
+ var newPaths = paths.map(function (path) {
88
+ return "".concat(path, ".").concat(key);
89
+ }); // If an object is marked with additionalProperties, all its keys are valid
90
+
91
+ if (_obj[key].__rjsf_additionalProperties && _obj[key].$name !== "") {
92
+ acc.push(_obj[key].$name);
93
+ } else {
94
+ getAllPaths(_obj[key], acc, newPaths);
95
+ }
96
+ } else if (key === "$name" && _obj[key] !== "") {
97
+ paths.forEach(function (path) {
98
+ path = path.replace(/^\./, "");
99
+ var formValue = (0, _get2["default"])(formData, path); // adds path to fieldNames if it points to a value
100
+ // or an empty object/array
101
+
102
+ if (_typeof(formValue) !== "object" || (0, _isEmpty2["default"])(formValue)) {
103
+ acc.push(path);
104
+ }
105
+ });
106
+ }
107
+ });
108
+ return acc;
109
+ };
110
+
111
+ return getAllPaths(pathSchema);
112
+ });
113
+
114
+ _defineProperty(_assertThisInitialized(_this), "onChange", function (formData, newErrorSchema) {
115
+ if ((0, _utils.isObject)(formData) || Array.isArray(formData)) {
116
+ var newState = _this.getStateFromProps(_this.props, formData);
117
+
118
+ formData = newState.formData;
119
+ }
120
+
121
+ var mustValidate = !_this.props.noValidate && _this.props.liveValidate;
122
+ var state = {
123
+ formData: formData
124
+ };
125
+ var newFormData = formData;
126
+
127
+ if (_this.props.omitExtraData === true && _this.props.liveOmit === true) {
128
+ var retrievedSchema = (0, _utils.retrieveSchema)(_this.state.schema, _this.state.schema, formData);
129
+ var pathSchema = (0, _utils.toPathSchema)(retrievedSchema, "", _this.state.schema, formData);
130
+
131
+ var fieldNames = _this.getFieldNames(pathSchema, formData);
132
+
133
+ newFormData = _this.getUsedFormData(formData, fieldNames);
134
+ state = {
135
+ formData: newFormData
136
+ };
137
+ }
138
+
139
+ if (mustValidate) {
140
+ var schemaValidation = _this.validate(newFormData);
141
+
142
+ var errors = schemaValidation.errors;
143
+ var errorSchema = schemaValidation.errorSchema;
144
+ var schemaValidationErrors = errors;
145
+ var schemaValidationErrorSchema = errorSchema;
146
+
147
+ if (_this.props.extraErrors) {
148
+ errorSchema = (0, _utils.mergeObjects)(errorSchema, _this.props.extraErrors, !!"concat arrays");
149
+ errors = (0, _validate.toErrorList)(errorSchema);
150
+ }
151
+
152
+ state = {
153
+ formData: newFormData,
154
+ errors: errors,
155
+ errorSchema: errorSchema,
156
+ schemaValidationErrors: schemaValidationErrors,
157
+ schemaValidationErrorSchema: schemaValidationErrorSchema
158
+ };
159
+ } else if (!_this.props.noValidate && newErrorSchema) {
160
+ var _errorSchema = _this.props.extraErrors ? (0, _utils.mergeObjects)(newErrorSchema, _this.props.extraErrors, !!"concat arrays") : newErrorSchema;
161
+
162
+ state = {
163
+ formData: newFormData,
164
+ errorSchema: _errorSchema,
165
+ errors: (0, _validate.toErrorList)(_errorSchema)
166
+ };
167
+ }
168
+
169
+ _this.setState(state, function () {
170
+ return _this.props.onChange && _this.props.onChange(_this.state);
171
+ });
172
+ });
173
+
174
+ _defineProperty(_assertThisInitialized(_this), "onBlur", function () {
175
+ if (_this.props.onBlur) {
176
+ var _this$props;
177
+
178
+ (_this$props = _this.props).onBlur.apply(_this$props, arguments);
179
+ }
180
+ });
181
+
182
+ _defineProperty(_assertThisInitialized(_this), "onFocus", function () {
183
+ if (_this.props.onFocus) {
184
+ var _this$props2;
185
+
186
+ (_this$props2 = _this.props).onFocus.apply(_this$props2, arguments);
187
+ }
188
+ });
189
+
190
+ _defineProperty(_assertThisInitialized(_this), "onSubmit", function (event) {
191
+ event.preventDefault();
192
+
193
+ if (event.target !== event.currentTarget) {
194
+ return;
195
+ }
196
+
197
+ event.persist();
198
+ var newFormData = _this.state.formData;
199
+
200
+ if (_this.props.omitExtraData === true) {
201
+ var retrievedSchema = (0, _utils.retrieveSchema)(_this.state.schema, _this.state.schema, newFormData);
202
+ var pathSchema = (0, _utils.toPathSchema)(retrievedSchema, "", _this.state.schema, newFormData);
203
+
204
+ var fieldNames = _this.getFieldNames(pathSchema, newFormData);
205
+
206
+ newFormData = _this.getUsedFormData(newFormData, fieldNames);
207
+ }
208
+
209
+ if (!_this.props.noValidate) {
210
+ var schemaValidation = _this.validate(newFormData);
211
+
212
+ var _errors = schemaValidation.errors;
213
+ var _errorSchema2 = schemaValidation.errorSchema;
214
+ var schemaValidationErrors = _errors;
215
+ var schemaValidationErrorSchema = _errorSchema2;
216
+
217
+ if (Object.keys(_errors).length > 0) {
218
+ if (_this.props.extraErrors) {
219
+ _errorSchema2 = (0, _utils.mergeObjects)(_errorSchema2, _this.props.extraErrors, !!"concat arrays");
220
+ _errors = (0, _validate.toErrorList)(_errorSchema2);
221
+ }
222
+
223
+ _this.setState({
224
+ errors: _errors,
225
+ errorSchema: _errorSchema2,
226
+ schemaValidationErrors: schemaValidationErrors,
227
+ schemaValidationErrorSchema: schemaValidationErrorSchema
228
+ }, function () {
229
+ if (_this.props.onError) {
230
+ _this.props.onError(_errors);
231
+ } else {
232
+ console.error("Form validation failed", _errors);
233
+ }
234
+ });
235
+
236
+ return;
237
+ }
238
+ } // There are no errors generated through schema validation.
239
+ // Check for user provided errors and update state accordingly.
240
+
241
+
242
+ var errorSchema;
243
+ var errors;
244
+
245
+ if (_this.props.extraErrors) {
246
+ errorSchema = _this.props.extraErrors;
247
+ errors = (0, _validate.toErrorList)(errorSchema);
248
+ } else {
249
+ errorSchema = {};
250
+ errors = [];
251
+ }
252
+
253
+ _this.setState({
254
+ formData: newFormData,
255
+ errors: errors,
256
+ errorSchema: errorSchema,
257
+ schemaValidationErrors: [],
258
+ schemaValidationErrorSchema: {}
259
+ }, function () {
260
+ if (_this.props.onSubmit) {
261
+ _this.props.onSubmit(_objectSpread({}, _this.state, {
262
+ formData: newFormData,
263
+ status: "submitted"
264
+ }), event);
265
+ }
266
+ });
267
+ });
268
+
269
+ _this.state = _this.getStateFromProps(props, props.formData);
270
+
271
+ if (_this.props.onChange && !(0, _utils.deepEquals)(_this.state.formData, _this.props.formData)) {
272
+ _this.props.onChange(_this.state);
273
+ }
274
+
275
+ _this.formElement = null;
276
+ return _this;
277
+ }
278
+
279
+ _createClass(Form, [{
280
+ key: "UNSAFE_componentWillReceiveProps",
281
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
282
+ var nextState = this.getStateFromProps(nextProps, nextProps.formData);
283
+
284
+ if (!(0, _utils.deepEquals)(nextState.formData, nextProps.formData) && !(0, _utils.deepEquals)(nextState.formData, this.state.formData) && this.props.onChange) {
285
+ this.props.onChange(nextState);
286
+ }
287
+
288
+ this.setState(nextState);
289
+ }
290
+ }, {
291
+ key: "getStateFromProps",
292
+ value: function getStateFromProps(props, inputFormData) {
293
+ var state = this.state || {};
294
+ var schema = "schema" in props ? props.schema : this.props.schema;
295
+ var uiSchema = "uiSchema" in props ? props.uiSchema : this.props.uiSchema;
296
+ var edit = typeof inputFormData !== "undefined";
297
+ var liveValidate = "liveValidate" in props ? props.liveValidate : this.props.liveValidate;
298
+ var mustValidate = edit && !props.noValidate && liveValidate;
299
+ var rootSchema = schema;
300
+ var formData = (0, _utils.getDefaultFormState)(schema, inputFormData, rootSchema);
301
+ var retrievedSchema = (0, _utils.retrieveSchema)(schema, rootSchema, formData);
302
+ var customFormats = props.customFormats;
303
+ var additionalMetaSchemas = props.additionalMetaSchemas;
304
+
305
+ var getCurrentErrors = function getCurrentErrors() {
306
+ if (props.noValidate) {
307
+ return {
308
+ errors: [],
309
+ errorSchema: {}
310
+ };
311
+ } else if (!props.liveValidate) {
312
+ return {
313
+ errors: state.schemaValidationErrors || [],
314
+ errorSchema: state.schemaValidationErrorSchema || {}
315
+ };
316
+ }
317
+
318
+ return {
319
+ errors: state.errors || [],
320
+ errorSchema: state.errorSchema || {}
321
+ };
322
+ };
323
+
324
+ var errors, errorSchema, schemaValidationErrors, schemaValidationErrorSchema;
325
+
326
+ if (mustValidate) {
327
+ var schemaValidation = this.validate(formData, schema, additionalMetaSchemas, customFormats);
328
+ errors = schemaValidation.errors;
329
+ errorSchema = schemaValidation.errorSchema;
330
+ schemaValidationErrors = errors;
331
+ schemaValidationErrorSchema = errorSchema;
332
+ } else {
333
+ var currentErrors = getCurrentErrors();
334
+ errors = currentErrors.errors;
335
+ errorSchema = currentErrors.errorSchema;
336
+ schemaValidationErrors = state.schemaValidationErrors;
337
+ schemaValidationErrorSchema = state.schemaValidationErrorSchema;
338
+ }
339
+
340
+ if (props.extraErrors) {
341
+ errorSchema = (0, _utils.mergeObjects)(errorSchema, props.extraErrors, !!"concat arrays");
342
+ errors = (0, _validate.toErrorList)(errorSchema);
343
+ }
344
+
345
+ var idSchema = (0, _utils.toIdSchema)(retrievedSchema, uiSchema["ui:rootFieldId"], rootSchema, formData, props.idPrefix, props.idSeparator);
346
+ var nextState = {
347
+ schema: schema,
348
+ uiSchema: uiSchema,
349
+ idSchema: idSchema,
350
+ formData: formData,
351
+ edit: edit,
352
+ errors: errors,
353
+ errorSchema: errorSchema,
354
+ additionalMetaSchemas: additionalMetaSchemas
355
+ };
356
+
357
+ if (schemaValidationErrors) {
358
+ nextState.schemaValidationErrors = schemaValidationErrors;
359
+ nextState.schemaValidationErrorSchema = schemaValidationErrorSchema;
360
+ }
361
+
362
+ return nextState;
363
+ }
364
+ }, {
365
+ key: "shouldComponentUpdate",
366
+ value: function shouldComponentUpdate(nextProps, nextState) {
367
+ return (0, _utils.shouldRender)(this, nextProps, nextState);
368
+ }
369
+ }, {
370
+ key: "validate",
371
+ value: function validate(formData) {
372
+ var schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.props.schema;
373
+ var additionalMetaSchemas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.props.additionalMetaSchemas;
374
+ var customFormats = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.props.customFormats;
375
+ var _this$props3 = this.props,
376
+ validate = _this$props3.validate,
377
+ transformErrors = _this$props3.transformErrors;
378
+
379
+ var _this$getRegistry = this.getRegistry(),
380
+ rootSchema = _this$getRegistry.rootSchema;
381
+
382
+ var resolvedSchema = (0, _utils.retrieveSchema)(schema, rootSchema, formData);
383
+ return (0, _validate["default"])(formData, resolvedSchema, validate, transformErrors, additionalMetaSchemas, customFormats);
384
+ }
385
+ }, {
386
+ key: "renderErrors",
387
+ value: function renderErrors() {
388
+ var _this$state = this.state,
389
+ errors = _this$state.errors,
390
+ errorSchema = _this$state.errorSchema,
391
+ schema = _this$state.schema,
392
+ uiSchema = _this$state.uiSchema;
393
+ var _this$props4 = this.props,
394
+ ErrorList = _this$props4.ErrorList,
395
+ showErrorList = _this$props4.showErrorList,
396
+ formContext = _this$props4.formContext;
397
+
398
+ if (errors.length && showErrorList != false) {
399
+ return (
400
+ /*#__PURE__*/
401
+ _react["default"].createElement(ErrorList, {
402
+ errors: errors,
403
+ errorSchema: errorSchema,
404
+ schema: schema,
405
+ uiSchema: uiSchema,
406
+ formContext: formContext
407
+ })
408
+ );
409
+ }
410
+
411
+ return null;
412
+ }
413
+ }, {
414
+ key: "getRegistry",
415
+ value: function getRegistry() {
416
+ // For BC, accept passed SchemaField and TitleField props and pass them to
417
+ // the "fields" registry one.
418
+ var _getDefaultRegistry = (0, _defaultRegistry.getDefaultRegistry)(),
419
+ fields = _getDefaultRegistry.fields,
420
+ widgets = _getDefaultRegistry.widgets;
421
+
422
+ return {
423
+ fields: _objectSpread({}, fields, this.props.fields),
424
+ widgets: _objectSpread({}, widgets, this.props.widgets),
425
+ ArrayFieldTemplate: this.props.ArrayFieldTemplate,
426
+ ObjectFieldTemplate: this.props.ObjectFieldTemplate,
427
+ FieldTemplate: this.props.FieldTemplate,
428
+ definitions: this.props.schema.definitions || {},
429
+ rootSchema: this.props.schema,
430
+ formContext: this.props.formContext || {}
431
+ };
432
+ }
433
+ }, {
434
+ key: "submit",
435
+ value: function submit() {
436
+ if (this.formElement) {
437
+ this.formElement.dispatchEvent(new CustomEvent("submit", {
438
+ cancelable: true
439
+ }));
440
+ }
441
+ }
442
+ }, {
443
+ key: "render",
444
+ value: function render() {
445
+ var _this2 = this;
446
+
447
+ var _this$props5 = this.props,
448
+ children = _this$props5.children,
449
+ id = _this$props5.id,
450
+ idPrefix = _this$props5.idPrefix,
451
+ idSeparator = _this$props5.idSeparator,
452
+ className = _this$props5.className,
453
+ tagName = _this$props5.tagName,
454
+ name = _this$props5.name,
455
+ method = _this$props5.method,
456
+ target = _this$props5.target,
457
+ action = _this$props5.action,
458
+ deprecatedAutocomplete = _this$props5.autocomplete,
459
+ currentAutoComplete = _this$props5.autoComplete,
460
+ enctype = _this$props5.enctype,
461
+ acceptcharset = _this$props5.acceptcharset,
462
+ noHtml5Validate = _this$props5.noHtml5Validate,
463
+ disabled = _this$props5.disabled,
464
+ readonly = _this$props5.readonly,
465
+ formContext = _this$props5.formContext,
466
+ _internalFormWrapper = _this$props5._internalFormWrapper;
467
+ var _this$state2 = this.state,
468
+ schema = _this$state2.schema,
469
+ uiSchema = _this$state2.uiSchema,
470
+ formData = _this$state2.formData,
471
+ errorSchema = _this$state2.errorSchema,
472
+ idSchema = _this$state2.idSchema;
473
+ var registry = this.getRegistry();
474
+ var _SchemaField = registry.fields.SchemaField; // The `semantic-ui` and `material-ui` themes have `_internalFormWrapper`s that take an `as` prop that is the
475
+ // PropTypes.elementType to use for the inner tag so we'll need to pass `tagName` along if it is provided.
476
+ // NOTE, the `as` prop is native to `semantic-ui` and is emulated in the `material-ui` theme
477
+
478
+ var as = _internalFormWrapper ? tagName : undefined;
479
+ var FormTag = _internalFormWrapper || tagName || "form";
480
+ var SubmitButton = registry.widgets.SubmitButton;
481
+
482
+ if (deprecatedAutocomplete) {
483
+ console.warn("Using autocomplete property of Form is deprecated, use autoComplete instead.");
484
+ }
485
+
486
+ var autoComplete = currentAutoComplete ? currentAutoComplete : deprecatedAutocomplete;
487
+ return (
488
+ /*#__PURE__*/
489
+ _react["default"].createElement(FormTag, {
490
+ className: className ? className : "rjsf",
491
+ id: id,
492
+ name: name,
493
+ method: method,
494
+ target: target,
495
+ action: action,
496
+ autoComplete: autoComplete,
497
+ encType: enctype,
498
+ acceptCharset: acceptcharset,
499
+ noValidate: noHtml5Validate,
500
+ onSubmit: this.onSubmit,
501
+ as: as,
502
+ ref: function ref(form) {
503
+ _this2.formElement = form;
504
+ }
505
+ }, this.renderErrors(),
506
+ /*#__PURE__*/
507
+ _react["default"].createElement(_SchemaField, {
508
+ schema: schema,
509
+ uiSchema: uiSchema,
510
+ errorSchema: errorSchema,
511
+ idSchema: idSchema,
512
+ idPrefix: idPrefix,
513
+ idSeparator: idSeparator,
514
+ formContext: formContext,
515
+ formData: formData,
516
+ onChange: this.onChange,
517
+ onBlur: this.onBlur,
518
+ onFocus: this.onFocus,
519
+ registry: registry,
520
+ disabled: disabled,
521
+ readonly: readonly
522
+ }), children ? children :
523
+ /*#__PURE__*/
524
+ _react["default"].createElement(SubmitButton, {
525
+ uiSchema: uiSchema
526
+ }))
527
+ );
528
+ }
529
+ }]);
530
+
531
+ return Form;
532
+ }(_react.Component);
533
+
534
+ exports["default"] = Form;
535
+
536
+ _defineProperty(Form, "defaultProps", {
537
+ uiSchema: {},
538
+ noValidate: false,
539
+ liveValidate: false,
540
+ disabled: false,
541
+ readonly: false,
542
+ noHtml5Validate: false,
543
+ ErrorList: _ErrorList["default"],
544
+ omitExtraData: false
545
+ });
546
+
547
+ if (process.env.NODE_ENV !== "production") {
548
+ Form.propTypes = {
549
+ schema: _propTypes["default"].object.isRequired,
550
+ uiSchema: _propTypes["default"].object,
551
+ formData: _propTypes["default"].any,
552
+ disabled: _propTypes["default"].bool,
553
+ readonly: _propTypes["default"].bool,
554
+ widgets: _propTypes["default"].objectOf(_propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].object])),
555
+ fields: _propTypes["default"].objectOf(_propTypes["default"].elementType),
556
+ ArrayFieldTemplate: _propTypes["default"].elementType,
557
+ ObjectFieldTemplate: _propTypes["default"].elementType,
558
+ FieldTemplate: _propTypes["default"].elementType,
559
+ ErrorList: _propTypes["default"].func,
560
+ onChange: _propTypes["default"].func,
561
+ onError: _propTypes["default"].func,
562
+ showErrorList: _propTypes["default"].bool,
563
+ onSubmit: _propTypes["default"].func,
564
+ id: _propTypes["default"].string,
565
+ className: _propTypes["default"].string,
566
+ tagName: _propTypes["default"].elementType,
567
+ _internalFormWrapper: _propTypes["default"].elementType,
568
+ name: _propTypes["default"].string,
569
+ method: _propTypes["default"].string,
570
+ target: _propTypes["default"].string,
571
+ action: _propTypes["default"].string,
572
+ autocomplete: _propTypes["default"].string,
573
+ autoComplete: _propTypes["default"].string,
574
+ enctype: _propTypes["default"].string,
575
+ acceptcharset: _propTypes["default"].string,
576
+ noValidate: _propTypes["default"].bool,
577
+ noHtml5Validate: _propTypes["default"].bool,
578
+ liveValidate: _propTypes["default"].bool,
579
+ validate: _propTypes["default"].func,
580
+ transformErrors: _propTypes["default"].func,
581
+ formContext: _propTypes["default"].object,
582
+ customFormats: _propTypes["default"].object,
583
+ additionalMetaSchemas: _propTypes["default"].arrayOf(_propTypes["default"].object),
584
+ omitExtraData: _propTypes["default"].bool,
585
+ extraErrors: _propTypes["default"].object
586
+ };
587
+ }
588
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0Zvcm0uanMiXSwibmFtZXMiOlsiRm9ybSIsInByb3BzIiwiZm9ybURhdGEiLCJmaWVsZHMiLCJsZW5ndGgiLCJkYXRhIiwiQXJyYXkiLCJpc0FycmF5IiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImtleSIsInBhdGhTY2hlbWEiLCJnZXRBbGxQYXRocyIsIl9vYmoiLCJhY2MiLCJwYXRocyIsImZvckVhY2giLCJuZXdQYXRocyIsInBhdGgiLCJfX3Jqc2ZfYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkbmFtZSIsInB1c2giLCJyZXBsYWNlIiwiZm9ybVZhbHVlIiwibmV3RXJyb3JTY2hlbWEiLCJuZXdTdGF0ZSIsImdldFN0YXRlRnJvbVByb3BzIiwibXVzdFZhbGlkYXRlIiwibm9WYWxpZGF0ZSIsImxpdmVWYWxpZGF0ZSIsInN0YXRlIiwibmV3Rm9ybURhdGEiLCJvbWl0RXh0cmFEYXRhIiwibGl2ZU9taXQiLCJyZXRyaWV2ZWRTY2hlbWEiLCJzY2hlbWEiLCJmaWVsZE5hbWVzIiwiZ2V0RmllbGROYW1lcyIsImdldFVzZWRGb3JtRGF0YSIsInNjaGVtYVZhbGlkYXRpb24iLCJ2YWxpZGF0ZSIsImVycm9ycyIsImVycm9yU2NoZW1hIiwic2NoZW1hVmFsaWRhdGlvbkVycm9ycyIsInNjaGVtYVZhbGlkYXRpb25FcnJvclNjaGVtYSIsImV4dHJhRXJyb3JzIiwic2V0U3RhdGUiLCJvbkNoYW5nZSIsIm9uQmx1ciIsIm9uRm9jdXMiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsInBlcnNpc3QiLCJvbkVycm9yIiwiY29uc29sZSIsImVycm9yIiwib25TdWJtaXQiLCJzdGF0dXMiLCJmb3JtRWxlbWVudCIsIm5leHRQcm9wcyIsIm5leHRTdGF0ZSIsImlucHV0Rm9ybURhdGEiLCJ1aVNjaGVtYSIsImVkaXQiLCJyb290U2NoZW1hIiwiY3VzdG9tRm9ybWF0cyIsImFkZGl0aW9uYWxNZXRhU2NoZW1hcyIsImdldEN1cnJlbnRFcnJvcnMiLCJjdXJyZW50RXJyb3JzIiwiaWRTY2hlbWEiLCJpZFByZWZpeCIsImlkU2VwYXJhdG9yIiwidHJhbnNmb3JtRXJyb3JzIiwiZ2V0UmVnaXN0cnkiLCJyZXNvbHZlZFNjaGVtYSIsIkVycm9yTGlzdCIsInNob3dFcnJvckxpc3QiLCJmb3JtQ29udGV4dCIsIndpZGdldHMiLCJBcnJheUZpZWxkVGVtcGxhdGUiLCJPYmplY3RGaWVsZFRlbXBsYXRlIiwiRmllbGRUZW1wbGF0ZSIsImRlZmluaXRpb25zIiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiY2FuY2VsYWJsZSIsImNoaWxkcmVuIiwiaWQiLCJjbGFzc05hbWUiLCJ0YWdOYW1lIiwibmFtZSIsIm1ldGhvZCIsImFjdGlvbiIsImRlcHJlY2F0ZWRBdXRvY29tcGxldGUiLCJhdXRvY29tcGxldGUiLCJjdXJyZW50QXV0b0NvbXBsZXRlIiwiYXV0b0NvbXBsZXRlIiwiZW5jdHlwZSIsImFjY2VwdGNoYXJzZXQiLCJub0h0bWw1VmFsaWRhdGUiLCJkaXNhYmxlZCIsInJlYWRvbmx5IiwiX2ludGVybmFsRm9ybVdyYXBwZXIiLCJyZWdpc3RyeSIsIl9TY2hlbWFGaWVsZCIsIlNjaGVtYUZpZWxkIiwiYXMiLCJ1bmRlZmluZWQiLCJGb3JtVGFnIiwiU3VibWl0QnV0dG9uIiwid2FybiIsImZvcm0iLCJyZW5kZXJFcnJvcnMiLCJDb21wb25lbnQiLCJEZWZhdWx0RXJyb3JMaXN0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsImFueSIsImJvb2wiLCJvYmplY3RPZiIsIm9uZU9mVHlwZSIsImZ1bmMiLCJlbGVtZW50VHlwZSIsInN0cmluZyIsImFycmF5T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFTQTs7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QUFBLGFBQWEsRUFBRXFCLHNCQUFVUyxNQTdCVjtBQThCZnRHLElBQUFBLFVBQVUsRUFBRTZGLHNCQUFVSSxJQTlCUDtBQStCZnhCLElBQUFBLGVBQWUsRUFBRW9CLHNCQUFVSSxJQS9CWjtBQWdDZmhHLElBQUFBLFlBQVksRUFBRTRGLHNCQUFVSSxJQWhDVDtBQWlDZnJGLElBQUFBLFFBQVEsRUFBRWlGLHNCQUFVTyxJQWpDTDtBQWtDZnRELElBQUFBLGVBQWUsRUFBRStDLHNCQUFVTyxJQWxDWjtBQW1DZmpELElBQUFBLFdBQVcsRUFBRTBDLHNCQUFVQyxNQW5DUjtBQW9DZnZELElBQUFBLGFBQWEsRUFBRXNELHNCQUFVQyxNQXBDVjtBQXFDZnRELElBQUFBLHFCQUFxQixFQUFFcUQsc0JBQVVVLE9BQVYsQ0FBa0JWLHNCQUFVQyxNQUE1QixDQXJDUjtBQXNDZjFGLElBQUFBLGFBQWEsRUFBRXlGLHNCQUFVSSxJQXRDVjtBQXVDZmhGLElBQUFBLFdBQVcsRUFBRTRFLHNCQUFVQztBQXZDUixHQUFqQjtBQXlDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBfcGljayBmcm9tIFwibG9kYXNoL3BpY2tcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0UmVnaXN0cnkgfSBmcm9tIFwiLi4vZGVmYXVsdFJlZ2lzdHJ5XCI7XG5cbmltcG9ydCB7IGRlZmF1bHQgYXMgRGVmYXVsdEVycm9yTGlzdCB9IGZyb20gXCIuL0Vycm9yTGlzdFwiO1xuaW1wb3J0IHtcbiAgZ2V0RGVmYXVsdEZvcm1TdGF0ZSxcbiAgcmV0cmlldmVTY2hlbWEsXG4gIHNob3VsZFJlbmRlcixcbiAgdG9JZFNjaGVtYSxcbiAgZGVlcEVxdWFscyxcbiAgdG9QYXRoU2NoZW1hLFxuICBpc09iamVjdCxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdmFsaWRhdGVGb3JtRGF0YSwgeyB0b0Vycm9yTGlzdCB9IGZyb20gXCIuLi92YWxpZGF0ZVwiO1xuaW1wb3J0IHsgbWVyZ2VPYmplY3RzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm0gZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIHVpU2NoZW1hOiB7fSxcbiAgICBub1ZhbGlkYXRlOiBmYWxzZSxcbiAgICBsaXZlVmFsaWRhdGU6IGZhbHNlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICByZWFkb25seTogZmFsc2UsXG4gICAgbm9IdG1sNVZhbGlkYXRlOiBmYWxzZSxcbiAgICBFcnJvckxpc3Q6IERlZmF1bHRFcnJvckxpc3QsXG4gICAgb21pdEV4dHJhRGF0YTogZmFsc2UsXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMsIHByb3BzLmZvcm1EYXRhKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlICYmXG4gICAgICAhZGVlcEVxdWFscyh0aGlzLnN0YXRlLmZvcm1EYXRhLCB0aGlzLnByb3BzLmZvcm1EYXRhKVxuICAgICkge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtRWxlbWVudCA9IG51bGw7XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB0aGlzLmdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgbmV4dFByb3BzLmZvcm1EYXRhKTtcbiAgICBpZiAoXG4gICAgICAhZGVlcEVxdWFscyhuZXh0U3RhdGUuZm9ybURhdGEsIG5leHRQcm9wcy5mb3JtRGF0YSkgJiZcbiAgICAgICFkZWVwRXF1YWxzKG5leHRTdGF0ZS5mb3JtRGF0YSwgdGhpcy5zdGF0ZS5mb3JtRGF0YSkgJiZcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2VcbiAgICApIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UobmV4dFN0YXRlKTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICB9XG5cbiAgZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMsIGlucHV0Rm9ybURhdGEpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgY29uc3Qgc2NoZW1hID0gXCJzY2hlbWFcIiBpbiBwcm9wcyA/IHByb3BzLnNjaGVtYSA6IHRoaXMucHJvcHMuc2NoZW1hO1xuICAgIGNvbnN0IHVpU2NoZW1hID0gXCJ1aVNjaGVtYVwiIGluIHByb3BzID8gcHJvcHMudWlTY2hlbWEgOiB0aGlzLnByb3BzLnVpU2NoZW1hO1xuICAgIGNvbnN0IGVkaXQgPSB0eXBlb2YgaW5wdXRGb3JtRGF0YSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICBjb25zdCBsaXZlVmFsaWRhdGUgPVxuICAgICAgXCJsaXZlVmFsaWRhdGVcIiBpbiBwcm9wcyA/IHByb3BzLmxpdmVWYWxpZGF0ZSA6IHRoaXMucHJvcHMubGl2ZVZhbGlkYXRlO1xuICAgIGNvbnN0IG11c3RWYWxpZGF0ZSA9IGVkaXQgJiYgIXByb3BzLm5vVmFsaWRhdGUgJiYgbGl2ZVZhbGlkYXRlO1xuICAgIGNvbnN0IHJvb3RTY2hlbWEgPSBzY2hlbWE7XG4gICAgY29uc3QgZm9ybURhdGEgPSBnZXREZWZhdWx0Rm9ybVN0YXRlKHNjaGVtYSwgaW5wdXRGb3JtRGF0YSwgcm9vdFNjaGVtYSk7XG4gICAgY29uc3QgcmV0cmlldmVkU2NoZW1hID0gcmV0cmlldmVTY2hlbWEoc2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSk7XG4gICAgY29uc3QgY3VzdG9tRm9ybWF0cyA9IHByb3BzLmN1c3RvbUZvcm1hdHM7XG4gICAgY29uc3QgYWRkaXRpb25hbE1ldGFTY2hlbWFzID0gcHJvcHMuYWRkaXRpb25hbE1ldGFTY2hlbWFzO1xuXG4gICAgY29uc3QgZ2V0Q3VycmVudEVycm9ycyA9ICgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5ub1ZhbGlkYXRlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yczogW10sIGVycm9yU2NoZW1hOiB7fSB9O1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubGl2ZVZhbGlkYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBzdGF0ZS5zY2hlbWFWYWxpZGF0aW9uRXJyb3JzIHx8IFtdLFxuICAgICAgICAgIGVycm9yU2NoZW1hOiBzdGF0ZS5zY2hlbWFWYWxpZGF0aW9uRXJyb3JTY2hlbWEgfHwge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcnM6IHN0YXRlLmVycm9ycyB8fCBbXSxcbiAgICAgICAgZXJyb3JTY2hlbWE6IHN0YXRlLmVycm9yU2NoZW1hIHx8IHt9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgbGV0IGVycm9ycyxcbiAgICAgIGVycm9yU2NoZW1hLFxuICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9ycyxcbiAgICAgIHNjaGVtYVZhbGlkYXRpb25FcnJvclNjaGVtYTtcbiAgICBpZiAobXVzdFZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBzY2hlbWFWYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZShcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgYWRkaXRpb25hbE1ldGFTY2hlbWFzLFxuICAgICAgICBjdXN0b21Gb3JtYXRzXG4gICAgICApO1xuICAgICAgZXJyb3JzID0gc2NoZW1hVmFsaWRhdGlvbi5lcnJvcnM7XG4gICAgICBlcnJvclNjaGVtYSA9IHNjaGVtYVZhbGlkYXRpb24uZXJyb3JTY2hlbWE7XG4gICAgICBzY2hlbWFWYWxpZGF0aW9uRXJyb3JzID0gZXJyb3JzO1xuICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hID0gZXJyb3JTY2hlbWE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFcnJvcnMgPSBnZXRDdXJyZW50RXJyb3JzKCk7XG4gICAgICBlcnJvcnMgPSBjdXJyZW50RXJyb3JzLmVycm9ycztcbiAgICAgIGVycm9yU2NoZW1hID0gY3VycmVudEVycm9ycy5lcnJvclNjaGVtYTtcbiAgICAgIHNjaGVtYVZhbGlkYXRpb25FcnJvcnMgPSBzdGF0ZS5zY2hlbWFWYWxpZGF0aW9uRXJyb3JzO1xuICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hID0gc3RhdGUuc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZXh0cmFFcnJvcnMpIHtcbiAgICAgIGVycm9yU2NoZW1hID0gbWVyZ2VPYmplY3RzKFxuICAgICAgICBlcnJvclNjaGVtYSxcbiAgICAgICAgcHJvcHMuZXh0cmFFcnJvcnMsXG4gICAgICAgICEhXCJjb25jYXQgYXJyYXlzXCJcbiAgICAgICk7XG4gICAgICBlcnJvcnMgPSB0b0Vycm9yTGlzdChlcnJvclNjaGVtYSk7XG4gICAgfVxuICAgIGNvbnN0IGlkU2NoZW1hID0gdG9JZFNjaGVtYShcbiAgICAgIHJldHJpZXZlZFNjaGVtYSxcbiAgICAgIHVpU2NoZW1hW1widWk6cm9vdEZpZWxkSWRcIl0sXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBwcm9wcy5pZFByZWZpeCxcbiAgICAgIHByb3BzLmlkU2VwYXJhdG9yXG4gICAgKTtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7XG4gICAgICBzY2hlbWEsXG4gICAgICB1aVNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBlZGl0LFxuICAgICAgZXJyb3JzLFxuICAgICAgZXJyb3JTY2hlbWEsXG4gICAgICBhZGRpdGlvbmFsTWV0YVNjaGVtYXMsXG4gICAgfTtcbiAgICBpZiAoc2NoZW1hVmFsaWRhdGlvbkVycm9ycykge1xuICAgICAgbmV4dFN0YXRlLnNjaGVtYVZhbGlkYXRpb25FcnJvcnMgPSBzY2hlbWFWYWxpZGF0aW9uRXJyb3JzO1xuICAgICAgbmV4dFN0YXRlLnNjaGVtYVZhbGlkYXRpb25FcnJvclNjaGVtYSA9IHNjaGVtYVZhbGlkYXRpb25FcnJvclNjaGVtYTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIHJldHVybiBzaG91bGRSZW5kZXIodGhpcywgbmV4dFByb3BzLCBuZXh0U3RhdGUpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgZm9ybURhdGEsXG4gICAgc2NoZW1hID0gdGhpcy5wcm9wcy5zY2hlbWEsXG4gICAgYWRkaXRpb25hbE1ldGFTY2hlbWFzID0gdGhpcy5wcm9wcy5hZGRpdGlvbmFsTWV0YVNjaGVtYXMsXG4gICAgY3VzdG9tRm9ybWF0cyA9IHRoaXMucHJvcHMuY3VzdG9tRm9ybWF0c1xuICApIHtcbiAgICBjb25zdCB7IHZhbGlkYXRlLCB0cmFuc2Zvcm1FcnJvcnMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyByb290U2NoZW1hIH0gPSB0aGlzLmdldFJlZ2lzdHJ5KCk7XG4gICAgY29uc3QgcmVzb2x2ZWRTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICByZXR1cm4gdmFsaWRhdGVGb3JtRGF0YShcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgcmVzb2x2ZWRTY2hlbWEsXG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIHRyYW5zZm9ybUVycm9ycyxcbiAgICAgIGFkZGl0aW9uYWxNZXRhU2NoZW1hcyxcbiAgICAgIGN1c3RvbUZvcm1hdHNcbiAgICApO1xuICB9XG5cbiAgcmVuZGVyRXJyb3JzKCkge1xuICAgIGNvbnN0IHsgZXJyb3JzLCBlcnJvclNjaGVtYSwgc2NoZW1hLCB1aVNjaGVtYSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IEVycm9yTGlzdCwgc2hvd0Vycm9yTGlzdCwgZm9ybUNvbnRleHQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCAmJiBzaG93RXJyb3JMaXN0ICE9IGZhbHNlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RXJyb3JMaXN0XG4gICAgICAgICAgZXJyb3JzPXtlcnJvcnN9XG4gICAgICAgICAgZXJyb3JTY2hlbWE9e2Vycm9yU2NoZW1hfVxuICAgICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICAgIHVpU2NoZW1hPXt1aVNjaGVtYX1cbiAgICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldFVzZWRGb3JtRGF0YSA9IChmb3JtRGF0YSwgZmllbGRzKSA9PiB7XG4gICAgLy9mb3IgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgaW5wdXQgZm9ybVxuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwICYmIHR5cGVvZiBmb3JtRGF0YSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gX3BpY2soZm9ybURhdGEsIGZpZWxkcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybURhdGEpKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSkubWFwKGtleSA9PiBkYXRhW2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIGdldEZpZWxkTmFtZXMgPSAocGF0aFNjaGVtYSwgZm9ybURhdGEpID0+IHtcbiAgICBjb25zdCBnZXRBbGxQYXRocyA9IChfb2JqLCBhY2MgPSBbXSwgcGF0aHMgPSBbXCJcIl0pID0+IHtcbiAgICAgIE9iamVjdC5rZXlzKF9vYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBfb2JqW2tleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBsZXQgbmV3UGF0aHMgPSBwYXRocy5tYXAocGF0aCA9PiBgJHtwYXRofS4ke2tleX1gKTtcbiAgICAgICAgICAvLyBJZiBhbiBvYmplY3QgaXMgbWFya2VkIHdpdGggYWRkaXRpb25hbFByb3BlcnRpZXMsIGFsbCBpdHMga2V5cyBhcmUgdmFsaWRcbiAgICAgICAgICBpZiAoX29ialtrZXldLl9fcmpzZl9hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBfb2JqW2tleV0uJG5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKF9vYmpba2V5XS4kbmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldEFsbFBhdGhzKF9vYmpba2V5XSwgYWNjLCBuZXdQYXRocyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCIkbmFtZVwiICYmIF9vYmpba2V5XSAhPT0gXCJcIikge1xuICAgICAgICAgIHBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwuLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBfZ2V0KGZvcm1EYXRhLCBwYXRoKTtcbiAgICAgICAgICAgIC8vIGFkZHMgcGF0aCB0byBmaWVsZE5hbWVzIGlmIGl0IHBvaW50cyB0byBhIHZhbHVlXG4gICAgICAgICAgICAvLyBvciBhbiBlbXB0eSBvYmplY3QvYXJyYXlcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybVZhbHVlICE9PSBcIm9iamVjdFwiIHx8IF9pc0VtcHR5KGZvcm1WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2gocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9O1xuXG4gICAgcmV0dXJuIGdldEFsbFBhdGhzKHBhdGhTY2hlbWEpO1xuICB9O1xuXG4gIG9uQ2hhbmdlID0gKGZvcm1EYXRhLCBuZXdFcnJvclNjaGVtYSkgPT4ge1xuICAgIGlmIChpc09iamVjdChmb3JtRGF0YSkgfHwgQXJyYXkuaXNBcnJheShmb3JtRGF0YSkpIHtcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzLCBmb3JtRGF0YSk7XG4gICAgICBmb3JtRGF0YSA9IG5ld1N0YXRlLmZvcm1EYXRhO1xuICAgIH1cbiAgICBjb25zdCBtdXN0VmFsaWRhdGUgPSAhdGhpcy5wcm9wcy5ub1ZhbGlkYXRlICYmIHRoaXMucHJvcHMubGl2ZVZhbGlkYXRlO1xuICAgIGxldCBzdGF0ZSA9IHsgZm9ybURhdGEgfTtcbiAgICBsZXQgbmV3Rm9ybURhdGEgPSBmb3JtRGF0YTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9taXRFeHRyYURhdGEgPT09IHRydWUgJiYgdGhpcy5wcm9wcy5saXZlT21pdCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcmV0cmlldmVkU2NoZW1hID0gcmV0cmlldmVTY2hlbWEoXG4gICAgICAgIHRoaXMuc3RhdGUuc2NoZW1hLFxuICAgICAgICB0aGlzLnN0YXRlLnNjaGVtYSxcbiAgICAgICAgZm9ybURhdGFcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXRoU2NoZW1hID0gdG9QYXRoU2NoZW1hKFxuICAgICAgICByZXRyaWV2ZWRTY2hlbWEsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuc2NoZW1hLFxuICAgICAgICBmb3JtRGF0YVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZmllbGROYW1lcyA9IHRoaXMuZ2V0RmllbGROYW1lcyhwYXRoU2NoZW1hLCBmb3JtRGF0YSk7XG5cbiAgICAgIG5ld0Zvcm1EYXRhID0gdGhpcy5nZXRVc2VkRm9ybURhdGEoZm9ybURhdGEsIGZpZWxkTmFtZXMpO1xuICAgICAgc3RhdGUgPSB7XG4gICAgICAgIGZvcm1EYXRhOiBuZXdGb3JtRGF0YSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG11c3RWYWxpZGF0ZSkge1xuICAgICAgbGV0IHNjaGVtYVZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKG5ld0Zvcm1EYXRhKTtcbiAgICAgIGxldCBlcnJvcnMgPSBzY2hlbWFWYWxpZGF0aW9uLmVycm9ycztcbiAgICAgIGxldCBlcnJvclNjaGVtYSA9IHNjaGVtYVZhbGlkYXRpb24uZXJyb3JTY2hlbWE7XG4gICAgICBjb25zdCBzY2hlbWFWYWxpZGF0aW9uRXJyb3JzID0gZXJyb3JzO1xuICAgICAgY29uc3Qgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hID0gZXJyb3JTY2hlbWE7XG4gICAgICBpZiAodGhpcy5wcm9wcy5leHRyYUVycm9ycykge1xuICAgICAgICBlcnJvclNjaGVtYSA9IG1lcmdlT2JqZWN0cyhcbiAgICAgICAgICBlcnJvclNjaGVtYSxcbiAgICAgICAgICB0aGlzLnByb3BzLmV4dHJhRXJyb3JzLFxuICAgICAgICAgICEhXCJjb25jYXQgYXJyYXlzXCJcbiAgICAgICAgKTtcbiAgICAgICAgZXJyb3JzID0gdG9FcnJvckxpc3QoZXJyb3JTY2hlbWEpO1xuICAgICAgfVxuICAgICAgc3RhdGUgPSB7XG4gICAgICAgIGZvcm1EYXRhOiBuZXdGb3JtRGF0YSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBlcnJvclNjaGVtYSxcbiAgICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByb3BzLm5vVmFsaWRhdGUgJiYgbmV3RXJyb3JTY2hlbWEpIHtcbiAgICAgIGNvbnN0IGVycm9yU2NoZW1hID0gdGhpcy5wcm9wcy5leHRyYUVycm9yc1xuICAgICAgICA/IG1lcmdlT2JqZWN0cyhcbiAgICAgICAgICAgIG5ld0Vycm9yU2NoZW1hLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5leHRyYUVycm9ycyxcbiAgICAgICAgICAgICEhXCJjb25jYXQgYXJyYXlzXCJcbiAgICAgICAgICApXG4gICAgICAgIDogbmV3RXJyb3JTY2hlbWE7XG4gICAgICBzdGF0ZSA9IHtcbiAgICAgICAgZm9ybURhdGE6IG5ld0Zvcm1EYXRhLFxuICAgICAgICBlcnJvclNjaGVtYTogZXJyb3JTY2hlbWEsXG4gICAgICAgIGVycm9yczogdG9FcnJvckxpc3QoZXJyb3JTY2hlbWEpLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgKCkgPT4gdGhpcy5wcm9wcy5vbkNoYW5nZSAmJiB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMuc3RhdGUpXG4gICAgKTtcbiAgfTtcblxuICBvbkJsdXIgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgdGhpcy5wcm9wcy5vbkJsdXIoLi4uYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIG9uRm9jdXMgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLm9uRm9jdXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25Gb2N1cyguLi5hcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgb25TdWJtaXQgPSBldmVudCA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucGVyc2lzdCgpO1xuICAgIGxldCBuZXdGb3JtRGF0YSA9IHRoaXMuc3RhdGUuZm9ybURhdGE7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vbWl0RXh0cmFEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb25zdCByZXRyaWV2ZWRTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShcbiAgICAgICAgdGhpcy5zdGF0ZS5zY2hlbWEsXG4gICAgICAgIHRoaXMuc3RhdGUuc2NoZW1hLFxuICAgICAgICBuZXdGb3JtRGF0YVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhdGhTY2hlbWEgPSB0b1BhdGhTY2hlbWEoXG4gICAgICAgIHJldHJpZXZlZFNjaGVtYSxcbiAgICAgICAgXCJcIixcbiAgICAgICAgdGhpcy5zdGF0ZS5zY2hlbWEsXG4gICAgICAgIG5ld0Zvcm1EYXRhXG4gICAgICApO1xuXG4gICAgICBjb25zdCBmaWVsZE5hbWVzID0gdGhpcy5nZXRGaWVsZE5hbWVzKHBhdGhTY2hlbWEsIG5ld0Zvcm1EYXRhKTtcblxuICAgICAgbmV3Rm9ybURhdGEgPSB0aGlzLmdldFVzZWRGb3JtRGF0YShuZXdGb3JtRGF0YSwgZmllbGROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByb3BzLm5vVmFsaWRhdGUpIHtcbiAgICAgIGxldCBzY2hlbWFWYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZShuZXdGb3JtRGF0YSk7XG4gICAgICBsZXQgZXJyb3JzID0gc2NoZW1hVmFsaWRhdGlvbi5lcnJvcnM7XG4gICAgICBsZXQgZXJyb3JTY2hlbWEgPSBzY2hlbWFWYWxpZGF0aW9uLmVycm9yU2NoZW1hO1xuICAgICAgY29uc3Qgc2NoZW1hVmFsaWRhdGlvbkVycm9ycyA9IGVycm9ycztcbiAgICAgIGNvbnN0IHNjaGVtYVZhbGlkYXRpb25FcnJvclNjaGVtYSA9IGVycm9yU2NoZW1hO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5leHRyYUVycm9ycykge1xuICAgICAgICAgIGVycm9yU2NoZW1hID0gbWVyZ2VPYmplY3RzKFxuICAgICAgICAgICAgZXJyb3JTY2hlbWEsXG4gICAgICAgICAgICB0aGlzLnByb3BzLmV4dHJhRXJyb3JzLFxuICAgICAgICAgICAgISFcImNvbmNhdCBhcnJheXNcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyb3JzID0gdG9FcnJvckxpc3QoZXJyb3JTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgICAgZXJyb3JTY2hlbWEsXG4gICAgICAgICAgICBzY2hlbWFWYWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMub25FcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIHZhbGlkYXRpb24gZmFpbGVkXCIsIGVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlcmUgYXJlIG5vIGVycm9ycyBnZW5lcmF0ZWQgdGhyb3VnaCBzY2hlbWEgdmFsaWRhdGlvbi5cbiAgICAvLyBDaGVjayBmb3IgdXNlciBwcm92aWRlZCBlcnJvcnMgYW5kIHVwZGF0ZSBzdGF0ZSBhY2NvcmRpbmdseS5cbiAgICBsZXQgZXJyb3JTY2hlbWE7XG4gICAgbGV0IGVycm9ycztcbiAgICBpZiAodGhpcy5wcm9wcy5leHRyYUVycm9ycykge1xuICAgICAgZXJyb3JTY2hlbWEgPSB0aGlzLnByb3BzLmV4dHJhRXJyb3JzO1xuICAgICAgZXJyb3JzID0gdG9FcnJvckxpc3QoZXJyb3JTY2hlbWEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvclNjaGVtYSA9IHt9O1xuICAgICAgZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgZm9ybURhdGE6IG5ld0Zvcm1EYXRhLFxuICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgZXJyb3JTY2hlbWE6IGVycm9yU2NoZW1hLFxuICAgICAgICBzY2hlbWFWYWxpZGF0aW9uRXJyb3JzOiBbXSxcbiAgICAgICAgc2NoZW1hVmFsaWRhdGlvbkVycm9yU2NoZW1hOiB7fSxcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uU3VibWl0KSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblN1Ym1pdChcbiAgICAgICAgICAgIHsgLi4udGhpcy5zdGF0ZSwgZm9ybURhdGE6IG5ld0Zvcm1EYXRhLCBzdGF0dXM6IFwic3VibWl0dGVkXCIgfSxcbiAgICAgICAgICAgIGV2ZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgZ2V0UmVnaXN0cnkoKSB7XG4gICAgLy8gRm9yIEJDLCBhY2NlcHQgcGFzc2VkIFNjaGVtYUZpZWxkIGFuZCBUaXRsZUZpZWxkIHByb3BzIGFuZCBwYXNzIHRoZW0gdG9cbiAgICAvLyB0aGUgXCJmaWVsZHNcIiByZWdpc3RyeSBvbmUuXG4gICAgY29uc3QgeyBmaWVsZHMsIHdpZGdldHMgfSA9IGdldERlZmF1bHRSZWdpc3RyeSgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHsgLi4uZmllbGRzLCAuLi50aGlzLnByb3BzLmZpZWxkcyB9LFxuICAgICAgd2lkZ2V0czogeyAuLi53aWRnZXRzLCAuLi50aGlzLnByb3BzLndpZGdldHMgfSxcbiAgICAgIEFycmF5RmllbGRUZW1wbGF0ZTogdGhpcy5wcm9wcy5BcnJheUZpZWxkVGVtcGxhdGUsXG4gICAgICBPYmplY3RGaWVsZFRlbXBsYXRlOiB0aGlzLnByb3BzLk9iamVjdEZpZWxkVGVtcGxhdGUsXG4gICAgICBGaWVsZFRlbXBsYXRlOiB0aGlzLnByb3BzLkZpZWxkVGVtcGxhdGUsXG4gICAgICBkZWZpbml0aW9uczogdGhpcy5wcm9wcy5zY2hlbWEuZGVmaW5pdGlvbnMgfHwge30sXG4gICAgICByb290U2NoZW1hOiB0aGlzLnByb3BzLnNjaGVtYSxcbiAgICAgIGZvcm1Db250ZXh0OiB0aGlzLnByb3BzLmZvcm1Db250ZXh0IHx8IHt9LFxuICAgIH07XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KFwic3VibWl0XCIsIHtcbiAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBpZCxcbiAgICAgIGlkUHJlZml4LFxuICAgICAgaWRTZXBhcmF0b3IsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHRhcmdldCxcbiAgICAgIGFjdGlvbixcbiAgICAgIGF1dG9jb21wbGV0ZTogZGVwcmVjYXRlZEF1dG9jb21wbGV0ZSxcbiAgICAgIGF1dG9Db21wbGV0ZTogY3VycmVudEF1dG9Db21wbGV0ZSxcbiAgICAgIGVuY3R5cGUsXG4gICAgICBhY2NlcHRjaGFyc2V0LFxuICAgICAgbm9IdG1sNVZhbGlkYXRlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByZWFkb25seSxcbiAgICAgIGZvcm1Db250ZXh0LFxuICAgICAgLyoqXG4gICAgICAgKiBfaW50ZXJuYWxGb3JtV3JhcHBlciBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgbWF0ZXJpYWwtdWkgYW5kIHNlbWFudGljLXVpIHRoZW1lcyB0byBwcm92aWRlIGEgY3VzdG9tIHdyYXBwZXJcbiAgICAgICAqIGFyb3VuZCBgPEZvcm0gLz5gIHRoYXQgc3VwcG9ydHMgdGhlIHByb3BlciByZW5kZXJpbmcgb2YgdGhvc2UgdGhlbWVzLiBUbyB1c2UgdGhpcyBwcm9wLCBvbmUgbXVzdCBwYXNzIGFcbiAgICAgICAqIGNvbXBvbmVudCB0aGF0IHRha2VzIHR3byBwcm9wczogYGNoaWxkcmVuYCBhbmQgYGFzYC4gVGhhdCBjb21wb25lbnQsIGF0IG1pbmltdW0sIHNob3VsZCByZW5kZXIgdGhlIGBjaGlsZHJlbmBcbiAgICAgICAqIGluc2lkZSBvZiBhIDxmb3JtIC8+IHRhZyB1bmxlc3MgYGFzYCBpcyBwcm92aWRlZCwgaW4gd2hpY2ggY2FzZSwgdXNlIHRoZSBgYXNgIHByb3AgaW4gcGxhY2Ugb2YgYDxmb3JtIC8+YC5cbiAgICAgICAqIGkuZS46XG4gICAgICAgKiBgYGBcbiAgICAgICAqIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEludGVybmFsRm9ybSh7IGNoaWxkcmVuLCBhc30pIHtcbiAgICAgICAqICAgY29uc3QgRm9ybVRhZyA9IGFzIHx8ICdmb3JtJztcbiAgICAgICAqICAgcmV0dXJuIDxGb3JtVGFnPntjaGlsZHJlbn08L0Zvcm1UYWc+O1xuICAgICAgICogfVxuICAgICAgICogYGBgXG4gICAgICAgKi9cbiAgICAgIF9pbnRlcm5hbEZvcm1XcmFwcGVyLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgeyBzY2hlbWEsIHVpU2NoZW1hLCBmb3JtRGF0YSwgZXJyb3JTY2hlbWEsIGlkU2NoZW1hIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5nZXRSZWdpc3RyeSgpO1xuICAgIGNvbnN0IF9TY2hlbWFGaWVsZCA9IHJlZ2lzdHJ5LmZpZWxkcy5TY2hlbWFGaWVsZDtcbiAgICAvLyBUaGUgYHNlbWFudGljLXVpYCBhbmQgYG1hdGVyaWFsLXVpYCB0aGVtZXMgaGF2ZSBgX2ludGVybmFsRm9ybVdyYXBwZXJgcyB0aGF0IHRha2UgYW4gYGFzYCBwcm9wIHRoYXQgaXMgdGhlXG4gICAgLy8gUHJvcFR5cGVzLmVsZW1lbnRUeXBlIHRvIHVzZSBmb3IgdGhlIGlubmVyIHRhZyBzbyB3ZSdsbCBuZWVkIHRvIHBhc3MgYHRhZ05hbWVgIGFsb25nIGlmIGl0IGlzIHByb3ZpZGVkLlxuICAgIC8vIE5PVEUsIHRoZSBgYXNgIHByb3AgaXMgbmF0aXZlIHRvIGBzZW1hbnRpYy11aWAgYW5kIGlzIGVtdWxhdGVkIGluIHRoZSBgbWF0ZXJpYWwtdWlgIHRoZW1lXG4gICAgY29uc3QgYXMgPSBfaW50ZXJuYWxGb3JtV3JhcHBlciA/IHRhZ05hbWUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgRm9ybVRhZyA9IF9pbnRlcm5hbEZvcm1XcmFwcGVyIHx8IHRhZ05hbWUgfHwgXCJmb3JtXCI7XG4gICAgY29uc3QgU3VibWl0QnV0dG9uID0gcmVnaXN0cnkud2lkZ2V0cy5TdWJtaXRCdXR0b247XG4gICAgaWYgKGRlcHJlY2F0ZWRBdXRvY29tcGxldGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJVc2luZyBhdXRvY29tcGxldGUgcHJvcGVydHkgb2YgRm9ybSBpcyBkZXByZWNhdGVkLCB1c2UgYXV0b0NvbXBsZXRlIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGF1dG9Db21wbGV0ZSA9IGN1cnJlbnRBdXRvQ29tcGxldGVcbiAgICAgID8gY3VycmVudEF1dG9Db21wbGV0ZVxuICAgICAgOiBkZXByZWNhdGVkQXV0b2NvbXBsZXRlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxGb3JtVGFnXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lID8gY2xhc3NOYW1lIDogXCJyanNmXCJ9XG4gICAgICAgIGlkPXtpZH1cbiAgICAgICAgbmFtZT17bmFtZX1cbiAgICAgICAgbWV0aG9kPXttZXRob2R9XG4gICAgICAgIHRhcmdldD17dGFyZ2V0fVxuICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgYXV0b0NvbXBsZXRlPXthdXRvQ29tcGxldGV9XG4gICAgICAgIGVuY1R5cGU9e2VuY3R5cGV9XG4gICAgICAgIGFjY2VwdENoYXJzZXQ9e2FjY2VwdGNoYXJzZXR9XG4gICAgICAgIG5vVmFsaWRhdGU9e25vSHRtbDVWYWxpZGF0ZX1cbiAgICAgICAgb25TdWJtaXQ9e3RoaXMub25TdWJtaXR9XG4gICAgICAgIGFzPXthc31cbiAgICAgICAgcmVmPXtmb3JtID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50ID0gZm9ybTtcbiAgICAgICAgfX0+XG4gICAgICAgIHt0aGlzLnJlbmRlckVycm9ycygpfVxuICAgICAgICA8X1NjaGVtYUZpZWxkXG4gICAgICAgICAgc2NoZW1hPXtzY2hlbWF9XG4gICAgICAgICAgdWlTY2hlbWE9e3VpU2NoZW1hfVxuICAgICAgICAgIGVycm9yU2NoZW1hPXtlcnJvclNjaGVtYX1cbiAgICAgICAgICBpZFNjaGVtYT17aWRTY2hlbWF9XG4gICAgICAgICAgaWRQcmVmaXg9e2lkUHJlZml4fVxuICAgICAgICAgIGlkU2VwYXJhdG9yPXtpZFNlcGFyYXRvcn1cbiAgICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgICAgZm9ybURhdGE9e2Zvcm1EYXRhfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkJsdXJ9XG4gICAgICAgICAgb25Gb2N1cz17dGhpcy5vbkZvY3VzfVxuICAgICAgICAgIHJlZ2lzdHJ5PXtyZWdpc3RyeX1cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgcmVhZG9ubHk9e3JlYWRvbmx5fVxuICAgICAgICAvPlxuICAgICAgICB7Y2hpbGRyZW4gPyBjaGlsZHJlbiA6IDxTdWJtaXRCdXR0b24gdWlTY2hlbWE9e3VpU2NoZW1hfSAvPn1cbiAgICAgIDwvRm9ybVRhZz5cbiAgICApO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgRm9ybS5wcm9wVHlwZXMgPSB7XG4gICAgc2NoZW1hOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgdWlTY2hlbWE6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZm9ybURhdGE6IFByb3BUeXBlcy5hbnksXG4gICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHJlYWRvbmx5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICB3aWRnZXRzOiBQcm9wVHlwZXMub2JqZWN0T2YoXG4gICAgICBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdF0pXG4gICAgKSxcbiAgICBmaWVsZHM6IFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMuZWxlbWVudFR5cGUpLFxuICAgIEFycmF5RmllbGRUZW1wbGF0ZTogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuICAgIE9iamVjdEZpZWxkVGVtcGxhdGU6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcbiAgICBGaWVsZFRlbXBsYXRlOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG4gICAgRXJyb3JMaXN0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2hvd0Vycm9yTGlzdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25TdWJtaXQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0YWdOYW1lOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG4gICAgX2ludGVybmFsRm9ybVdyYXBwZXI6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG1ldGhvZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0YXJnZXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYWN0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGF1dG9jb21wbGV0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBhdXRvQ29tcGxldGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZW5jdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBhY2NlcHRjaGFyc2V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG5vVmFsaWRhdGU6IFByb3BUeXBlcy5ib29sLFxuICAgIG5vSHRtbDVWYWxpZGF0ZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgbGl2ZVZhbGlkYXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB2YWxpZGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgdHJhbnNmb3JtRXJyb3JzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBmb3JtQ29udGV4dDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjdXN0b21Gb3JtYXRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGFkZGl0aW9uYWxNZXRhU2NoZW1hczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgb21pdEV4dHJhRGF0YTogUHJvcFR5cGVzLmJvb2wsXG4gICAgZXh0cmFFcnJvcnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIH07XG59XG4iXX0=