@rjsf/core 4.2.0 → 4.2.1

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 (180) hide show
  1. package/dist/components/AddButton.d.ts +5 -0
  2. package/dist/components/ErrorList.d.ts +1 -0
  3. package/dist/components/Form.d.ts +48 -0
  4. package/dist/components/IconButton.d.ts +1 -0
  5. package/dist/components/fields/ArrayField.d.ts +51 -0
  6. package/dist/components/fields/BooleanField.d.ts +45 -0
  7. package/dist/components/fields/DescriptionField.d.ts +9 -0
  8. package/dist/components/fields/MultiSchemaField.d.ts +40 -0
  9. package/dist/components/fields/NullField.d.ts +6 -0
  10. package/dist/components/fields/NumberField.d.ts +63 -0
  11. package/dist/components/fields/ObjectField.d.ts +22 -0
  12. package/dist/components/fields/SchemaField.d.ts +39 -0
  13. package/dist/components/fields/StringField.d.ts +45 -0
  14. package/dist/components/fields/TitleField.d.ts +10 -0
  15. package/dist/components/fields/UnsupportedField.d.ts +14 -0
  16. package/dist/components/fields/index.d.ts +26 -0
  17. package/dist/components/widgets/AltDateTimeWidget.d.ts +22 -0
  18. package/dist/components/widgets/AltDateWidget.d.ts +22 -0
  19. package/dist/components/widgets/BaseInput.d.ts +23 -0
  20. package/dist/components/widgets/CheckboxWidget.d.ts +18 -0
  21. package/dist/components/widgets/CheckboxesWidget.d.ts +26 -0
  22. package/dist/components/widgets/ColorWidget.d.ts +15 -0
  23. package/dist/components/widgets/DateTimeWidget.d.ts +8 -0
  24. package/dist/components/widgets/DateWidget.d.ts +8 -0
  25. package/dist/components/widgets/EmailWidget.d.ts +8 -0
  26. package/dist/components/widgets/FileWidget.d.ts +19 -0
  27. package/dist/components/widgets/HiddenWidget.d.ts +12 -0
  28. package/dist/components/widgets/PasswordWidget.d.ts +8 -0
  29. package/dist/components/widgets/RadioWidget.d.ts +22 -0
  30. package/dist/components/widgets/RangeWidget.d.ts +8 -0
  31. package/dist/components/widgets/SelectWidget.d.ts +24 -0
  32. package/dist/components/widgets/SubmitButton.d.ts +3 -0
  33. package/dist/components/widgets/TextWidget.d.ts +9 -0
  34. package/dist/components/widgets/TextareaWidget.d.ts +25 -0
  35. package/dist/components/widgets/URLWidget.d.ts +8 -0
  36. package/dist/components/widgets/UpDownWidget.d.ts +8 -0
  37. package/dist/components/widgets/index.d.ts +43 -0
  38. package/dist/core.cjs.development.js +5714 -0
  39. package/dist/core.cjs.development.js.map +1 -0
  40. package/dist/core.cjs.production.min.js +2 -0
  41. package/dist/core.cjs.production.min.js.map +1 -0
  42. package/dist/core.esm.js +5706 -0
  43. package/dist/core.esm.js.map +1 -0
  44. package/dist/defaultRegistry.d.ts +41 -0
  45. package/dist/index.d.ts +71 -0
  46. package/dist/index.js +8 -0
  47. package/dist/types.d.ts +50 -0
  48. package/dist/utils.d.ts +81 -0
  49. package/dist/validate.d.ts +21 -0
  50. package/dist/withTheme.d.ts +10 -0
  51. package/index.d.ts +3 -3
  52. package/package.json +23 -24
  53. package/dist/cjs/components/AddButton.js +0 -32
  54. package/dist/cjs/components/ErrorList.js +0 -29
  55. package/dist/cjs/components/Form.js +0 -576
  56. package/dist/cjs/components/IconButton.js +0 -32
  57. package/dist/cjs/components/fields/ArrayField.js +0 -917
  58. package/dist/cjs/components/fields/BooleanField.js +0 -105
  59. package/dist/cjs/components/fields/DescriptionField.js +0 -44
  60. package/dist/cjs/components/fields/MultiSchemaField.js +0 -265
  61. package/dist/cjs/components/fields/NullField.js +0 -66
  62. package/dist/cjs/components/fields/NumberField.js +0 -153
  63. package/dist/cjs/components/fields/ObjectField.js +0 -345
  64. package/dist/cjs/components/fields/SchemaField.js +0 -475
  65. package/dist/cjs/components/fields/StringField.js +0 -96
  66. package/dist/cjs/components/fields/TitleField.js +0 -37
  67. package/dist/cjs/components/fields/UnsupportedField.js +0 -33
  68. package/dist/cjs/components/fields/index.js +0 -47
  69. package/dist/cjs/components/widgets/AltDateTimeWidget.js +0 -45
  70. package/dist/cjs/components/widgets/AltDateWidget.js +0 -282
  71. package/dist/cjs/components/widgets/BaseInput.js +0 -144
  72. package/dist/cjs/components/widgets/CheckboxWidget.js +0 -74
  73. package/dist/cjs/components/widgets/CheckboxesWidget.js +0 -106
  74. package/dist/cjs/components/widgets/ColorWidget.js +0 -42
  75. package/dist/cjs/components/widgets/DateTimeWidget.js +0 -40
  76. package/dist/cjs/components/widgets/DateWidget.js +0 -36
  77. package/dist/cjs/components/widgets/EmailWidget.js +0 -31
  78. package/dist/cjs/components/widgets/FileWidget.js +0 -198
  79. package/dist/cjs/components/widgets/HiddenWidget.js +0 -33
  80. package/dist/cjs/components/widgets/PasswordWidget.js +0 -31
  81. package/dist/cjs/components/widgets/RadioWidget.js +0 -92
  82. package/dist/cjs/components/widgets/RangeWidget.js +0 -39
  83. package/dist/cjs/components/widgets/SelectWidget.js +0 -143
  84. package/dist/cjs/components/widgets/SubmitButton.js +0 -30
  85. package/dist/cjs/components/widgets/TextWidget.js +0 -28
  86. package/dist/cjs/components/widgets/TextareaWidget.js +0 -78
  87. package/dist/cjs/components/widgets/URLWidget.js +0 -31
  88. package/dist/cjs/components/widgets/UpDownWidget.js +0 -33
  89. package/dist/cjs/components/widgets/index.js +0 -73
  90. package/dist/cjs/index.js +0 -28
  91. package/dist/cjs/types.js +0 -47
  92. package/dist/cjs/utils.js +0 -1419
  93. package/dist/cjs/validate.js +0 -354
  94. package/dist/cjs/withTheme.js +0 -50
  95. package/dist/es/components/AddButton.js +0 -21
  96. package/dist/es/components/ErrorList.js +0 -19
  97. package/dist/es/components/Form.js +0 -561
  98. package/dist/es/components/IconButton.js +0 -22
  99. package/dist/es/components/fields/ArrayField.js +0 -899
  100. package/dist/es/components/fields/BooleanField.js +0 -91
  101. package/dist/es/components/fields/DescriptionField.js +0 -33
  102. package/dist/es/components/fields/MultiSchemaField.js +0 -251
  103. package/dist/es/components/fields/NullField.js +0 -55
  104. package/dist/es/components/fields/NumberField.js +0 -138
  105. package/dist/es/components/fields/ObjectField.js +0 -330
  106. package/dist/es/components/fields/SchemaField.js +0 -457
  107. package/dist/es/components/fields/StringField.js +0 -82
  108. package/dist/es/components/fields/TitleField.js +0 -25
  109. package/dist/es/components/fields/UnsupportedField.js +0 -22
  110. package/dist/es/components/fields/index.js +0 -26
  111. package/dist/es/components/widgets/AltDateTimeWidget.js +0 -33
  112. package/dist/es/components/widgets/AltDateWidget.js +0 -268
  113. package/dist/es/components/widgets/BaseInput.js +0 -133
  114. package/dist/es/components/widgets/CheckboxWidget.js +0 -62
  115. package/dist/es/components/widgets/CheckboxesWidget.js +0 -93
  116. package/dist/es/components/widgets/ColorWidget.js +0 -31
  117. package/dist/es/components/widgets/DateTimeWidget.js +0 -28
  118. package/dist/es/components/widgets/DateWidget.js +0 -25
  119. package/dist/es/components/widgets/EmailWidget.js +0 -20
  120. package/dist/es/components/widgets/FileWidget.js +0 -184
  121. package/dist/es/components/widgets/HiddenWidget.js +0 -22
  122. package/dist/es/components/widgets/PasswordWidget.js +0 -20
  123. package/dist/es/components/widgets/RadioWidget.js +0 -79
  124. package/dist/es/components/widgets/RangeWidget.js +0 -27
  125. package/dist/es/components/widgets/SelectWidget.js +0 -130
  126. package/dist/es/components/widgets/SubmitButton.js +0 -19
  127. package/dist/es/components/widgets/TextWidget.js +0 -17
  128. package/dist/es/components/widgets/TextareaWidget.js +0 -67
  129. package/dist/es/components/widgets/URLWidget.js +0 -20
  130. package/dist/es/components/widgets/UpDownWidget.js +0 -21
  131. package/dist/es/components/widgets/index.js +0 -43
  132. package/dist/es/index.js +0 -6
  133. package/dist/es/types.js +0 -34
  134. package/dist/es/utils.js +0 -1317
  135. package/dist/es/validate.js +0 -338
  136. package/dist/es/withTheme.js +0 -36
  137. package/dist/react-jsonschema-form.js +0 -11
  138. package/dist/react-jsonschema-form.js.map +0 -1
  139. package/lib/components/AddButton.js +0 -21
  140. package/lib/components/ErrorList.js +0 -19
  141. package/lib/components/Form.js +0 -561
  142. package/lib/components/IconButton.js +0 -22
  143. package/lib/components/fields/ArrayField.js +0 -899
  144. package/lib/components/fields/BooleanField.js +0 -91
  145. package/lib/components/fields/DescriptionField.js +0 -33
  146. package/lib/components/fields/MultiSchemaField.js +0 -251
  147. package/lib/components/fields/NullField.js +0 -55
  148. package/lib/components/fields/NumberField.js +0 -138
  149. package/lib/components/fields/ObjectField.js +0 -330
  150. package/lib/components/fields/SchemaField.js +0 -457
  151. package/lib/components/fields/StringField.js +0 -82
  152. package/lib/components/fields/TitleField.js +0 -25
  153. package/lib/components/fields/UnsupportedField.js +0 -22
  154. package/lib/components/fields/index.js +0 -26
  155. package/lib/components/widgets/AltDateTimeWidget.js +0 -33
  156. package/lib/components/widgets/AltDateWidget.js +0 -268
  157. package/lib/components/widgets/BaseInput.js +0 -133
  158. package/lib/components/widgets/CheckboxWidget.js +0 -62
  159. package/lib/components/widgets/CheckboxesWidget.js +0 -93
  160. package/lib/components/widgets/ColorWidget.js +0 -31
  161. package/lib/components/widgets/DateTimeWidget.js +0 -28
  162. package/lib/components/widgets/DateWidget.js +0 -25
  163. package/lib/components/widgets/EmailWidget.js +0 -20
  164. package/lib/components/widgets/FileWidget.js +0 -184
  165. package/lib/components/widgets/HiddenWidget.js +0 -22
  166. package/lib/components/widgets/PasswordWidget.js +0 -20
  167. package/lib/components/widgets/RadioWidget.js +0 -79
  168. package/lib/components/widgets/RangeWidget.js +0 -27
  169. package/lib/components/widgets/SelectWidget.js +0 -130
  170. package/lib/components/widgets/SubmitButton.js +0 -19
  171. package/lib/components/widgets/TextWidget.js +0 -17
  172. package/lib/components/widgets/TextareaWidget.js +0 -67
  173. package/lib/components/widgets/URLWidget.js +0 -20
  174. package/lib/components/widgets/UpDownWidget.js +0 -21
  175. package/lib/components/widgets/index.js +0 -43
  176. package/lib/index.js +0 -6
  177. package/lib/types.js +0 -34
  178. package/lib/utils.js +0 -1317
  179. package/lib/validate.js +0 -338
  180. package/lib/withTheme.js +0 -36
package/dist/cjs/utils.js DELETED
@@ -1,1419 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.canExpand = canExpand;
7
- exports.getDefaultRegistry = getDefaultRegistry;
8
- exports.getSchemaType = getSchemaType;
9
- exports.getWidget = getWidget;
10
- exports.hasWidget = hasWidget;
11
- exports.getDefaultFormState = getDefaultFormState;
12
- exports.mergeDefaultsWithFormData = mergeDefaultsWithFormData;
13
- exports.getUiOptions = getUiOptions;
14
- exports.getSubmitButtonOptions = getSubmitButtonOptions;
15
- exports.getDisplayLabel = getDisplayLabel;
16
- exports.isObject = isObject;
17
- exports.mergeObjects = mergeObjects;
18
- exports.asNumber = asNumber;
19
- exports.orderProperties = orderProperties;
20
- exports.isConstant = isConstant;
21
- exports.toConstant = toConstant;
22
- exports.isSelect = isSelect;
23
- exports.isMultiSelect = isMultiSelect;
24
- exports.isFilesArray = isFilesArray;
25
- exports.isFixedItems = isFixedItems;
26
- exports.isCustomWidget = isCustomWidget;
27
- exports.allowAdditionalItems = allowAdditionalItems;
28
- exports.optionsList = optionsList;
29
- exports.findSchemaDefinition = findSchemaDefinition;
30
- exports.stubExistingAdditionalProperties = stubExistingAdditionalProperties;
31
- exports.resolveSchema = resolveSchema;
32
- exports.retrieveSchema = retrieveSchema;
33
- exports.mergeSchemas = mergeSchemas;
34
- exports.deepEquals = deepEquals;
35
- exports.shouldRender = shouldRender;
36
- exports.toIdSchema = toIdSchema;
37
- exports.toPathSchema = toPathSchema;
38
- exports.parseDateString = parseDateString;
39
- exports.toDateString = toDateString;
40
- exports.utcToLocal = utcToLocal;
41
- exports.localToUTC = localToUTC;
42
- exports.pad = pad;
43
- exports.dataURItoBlob = dataURItoBlob;
44
- exports.rangeSpec = rangeSpec;
45
- exports.getMatchingOption = getMatchingOption;
46
- exports.schemaRequiresTrueValue = schemaRequiresTrueValue;
47
- exports.guessType = exports.ADDITIONAL_PROPERTY_FLAG = void 0;
48
-
49
- var _react = _interopRequireDefault(require("react"));
50
-
51
- var ReactIs = _interopRequireWildcard(require("react-is"));
52
-
53
- var _jsonSchemaMergeAllof = _interopRequireDefault(require("json-schema-merge-allof"));
54
-
55
- var _fill = _interopRequireDefault(require("core-js-pure/features/array/fill"));
56
-
57
- var _union = _interopRequireDefault(require("lodash/union"));
58
-
59
- var _jsonpointer = _interopRequireDefault(require("jsonpointer"));
60
-
61
- var _fields = _interopRequireDefault(require("./components/fields"));
62
-
63
- var _widgets = _interopRequireDefault(require("./components/widgets"));
64
-
65
- var _validate = _interopRequireWildcard(require("./validate"));
66
-
67
- 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; } }
68
-
69
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
70
-
71
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
72
-
73
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
74
-
75
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
76
-
77
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
78
-
79
- function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
80
-
81
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
82
-
83
- 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); }
84
-
85
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
86
-
87
- 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; }
88
-
89
- 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; }
90
-
91
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
92
-
93
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
94
-
95
- var ADDITIONAL_PROPERTY_FLAG = "__additional_property";
96
- exports.ADDITIONAL_PROPERTY_FLAG = ADDITIONAL_PROPERTY_FLAG;
97
- var widgetMap = {
98
- "boolean": {
99
- checkbox: "CheckboxWidget",
100
- radio: "RadioWidget",
101
- select: "SelectWidget",
102
- hidden: "HiddenWidget"
103
- },
104
- string: {
105
- text: "TextWidget",
106
- password: "PasswordWidget",
107
- email: "EmailWidget",
108
- hostname: "TextWidget",
109
- ipv4: "TextWidget",
110
- ipv6: "TextWidget",
111
- uri: "URLWidget",
112
- "data-url": "FileWidget",
113
- radio: "RadioWidget",
114
- select: "SelectWidget",
115
- textarea: "TextareaWidget",
116
- hidden: "HiddenWidget",
117
- date: "DateWidget",
118
- datetime: "DateTimeWidget",
119
- "date-time": "DateTimeWidget",
120
- "alt-date": "AltDateWidget",
121
- "alt-datetime": "AltDateTimeWidget",
122
- color: "ColorWidget",
123
- file: "FileWidget"
124
- },
125
- number: {
126
- text: "TextWidget",
127
- select: "SelectWidget",
128
- updown: "UpDownWidget",
129
- range: "RangeWidget",
130
- radio: "RadioWidget",
131
- hidden: "HiddenWidget"
132
- },
133
- integer: {
134
- text: "TextWidget",
135
- select: "SelectWidget",
136
- updown: "UpDownWidget",
137
- range: "RangeWidget",
138
- radio: "RadioWidget",
139
- hidden: "HiddenWidget"
140
- },
141
- array: {
142
- select: "SelectWidget",
143
- checkboxes: "CheckboxesWidget",
144
- files: "FileWidget",
145
- hidden: "HiddenWidget"
146
- }
147
- };
148
-
149
- function canExpand(schema, uiSchema, formData) {
150
- if (!schema.additionalProperties) {
151
- return false;
152
- }
153
-
154
- var _getUiOptions = getUiOptions(uiSchema),
155
- expandable = _getUiOptions.expandable;
156
-
157
- if (expandable === false) {
158
- return expandable;
159
- } // if ui:options.expandable was not explicitly set to false, we can add
160
- // another property if we have not exceeded maxProperties yet
161
-
162
-
163
- if (schema.maxProperties !== undefined) {
164
- return Object.keys(formData).length < schema.maxProperties;
165
- }
166
-
167
- return true;
168
- }
169
-
170
- function getDefaultRegistry() {
171
- return {
172
- fields: _fields["default"],
173
- widgets: _widgets["default"],
174
- definitions: {},
175
- rootSchema: {},
176
- formContext: {}
177
- };
178
- }
179
- /* Gets the type of a given schema. */
180
-
181
-
182
- function getSchemaType(schema) {
183
- var type = schema.type;
184
-
185
- if (!type && schema["const"]) {
186
- return guessType(schema["const"]);
187
- }
188
-
189
- if (!type && schema["enum"]) {
190
- return "string";
191
- }
192
-
193
- if (!type && (schema.properties || schema.additionalProperties)) {
194
- return "object";
195
- }
196
-
197
- if (type instanceof Array && type.length === 2 && type.includes("null")) {
198
- return type.find(function (type) {
199
- return type !== "null";
200
- });
201
- }
202
-
203
- return type;
204
- }
205
-
206
- function getWidget(schema, widget) {
207
- var registeredWidgets = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
208
- var type = getSchemaType(schema);
209
-
210
- function mergeOptions(Widget) {
211
- // cache return value as property of widget for proper react reconciliation
212
- if (!Widget.MergedWidget) {
213
- var defaultOptions = Widget.defaultProps && Widget.defaultProps.options || {};
214
-
215
- Widget.MergedWidget = function (_ref) {
216
- var _ref$options = _ref.options,
217
- options = _ref$options === void 0 ? {} : _ref$options,
218
- props = _objectWithoutProperties(_ref, ["options"]);
219
-
220
- return _react["default"].createElement(Widget, _extends({
221
- options: _objectSpread({}, defaultOptions, options)
222
- }, props));
223
- };
224
- }
225
-
226
- return Widget.MergedWidget;
227
- }
228
-
229
- if (typeof widget === "function" || ReactIs.isForwardRef(_react["default"].createElement(widget)) || ReactIs.isMemo(widget)) {
230
- return mergeOptions(widget);
231
- }
232
-
233
- if (typeof widget !== "string") {
234
- throw new Error("Unsupported widget definition: ".concat(_typeof(widget)));
235
- }
236
-
237
- if (registeredWidgets.hasOwnProperty(widget)) {
238
- var registeredWidget = registeredWidgets[widget];
239
- return getWidget(schema, registeredWidget, registeredWidgets);
240
- }
241
-
242
- if (!widgetMap.hasOwnProperty(type)) {
243
- throw new Error("No widget for type \"".concat(type, "\""));
244
- }
245
-
246
- if (widgetMap[type].hasOwnProperty(widget)) {
247
- var _registeredWidget = registeredWidgets[widgetMap[type][widget]];
248
- return getWidget(schema, _registeredWidget, registeredWidgets);
249
- }
250
-
251
- throw new Error("No widget \"".concat(widget, "\" for type \"").concat(type, "\""));
252
- }
253
-
254
- function hasWidget(schema, widget) {
255
- var registeredWidgets = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
256
-
257
- try {
258
- getWidget(schema, widget, registeredWidgets);
259
- return true;
260
- } catch (e) {
261
- if (e.message && (e.message.startsWith("No widget") || e.message.startsWith("Unsupported widget"))) {
262
- return false;
263
- }
264
-
265
- throw e;
266
- }
267
- }
268
-
269
- function computeDefaults(_schema, parentDefaults, rootSchema) {
270
- var rawFormData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
271
- var includeUndefinedValues = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
272
- var schema = isObject(_schema) ? _schema : {};
273
- var formData = isObject(rawFormData) ? rawFormData : {}; // Compute the defaults recursively: give highest priority to deepest nodes.
274
-
275
- var defaults = parentDefaults;
276
-
277
- if (isObject(defaults) && isObject(schema["default"])) {
278
- // For object defaults, only override parent defaults that are defined in
279
- // schema.default.
280
- defaults = mergeObjects(defaults, schema["default"]);
281
- } else if ("default" in schema) {
282
- // Use schema defaults for this node.
283
- defaults = schema["default"];
284
- } else if ("$ref" in schema) {
285
- // Use referenced schema defaults for this node.
286
- var refSchema = findSchemaDefinition(schema.$ref, rootSchema);
287
- return computeDefaults(refSchema, defaults, rootSchema, formData, includeUndefinedValues);
288
- } else if ("dependencies" in schema) {
289
- var resolvedSchema = resolveDependencies(schema, rootSchema, formData);
290
- return computeDefaults(resolvedSchema, defaults, rootSchema, formData, includeUndefinedValues);
291
- } else if (isFixedItems(schema)) {
292
- defaults = schema.items.map(function (itemSchema, idx) {
293
- return computeDefaults(itemSchema, Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined, rootSchema, formData, includeUndefinedValues);
294
- });
295
- } else if ("oneOf" in schema) {
296
- schema = schema.oneOf[getMatchingOption(undefined, schema.oneOf, rootSchema)];
297
- } else if ("anyOf" in schema) {
298
- schema = schema.anyOf[getMatchingOption(undefined, schema.anyOf, rootSchema)];
299
- } // Not defaults defined for this node, fallback to generic typed ones.
300
-
301
-
302
- if (typeof defaults === "undefined") {
303
- defaults = schema["default"];
304
- }
305
-
306
- switch (getSchemaType(schema)) {
307
- // We need to recur for object schema inner default values.
308
- case "object":
309
- return Object.keys(schema.properties || {}).reduce(function (acc, key) {
310
- // Compute the defaults for this node, with the parent defaults we might
311
- // have from a previous run: defaults[key].
312
- var computedDefault = computeDefaults(schema.properties[key], (defaults || {})[key], rootSchema, (formData || {})[key], includeUndefinedValues);
313
-
314
- if (includeUndefinedValues || computedDefault !== undefined) {
315
- acc[key] = computedDefault;
316
- }
317
-
318
- return acc;
319
- }, {});
320
-
321
- case "array":
322
- // Inject defaults into existing array defaults
323
- if (Array.isArray(defaults)) {
324
- defaults = defaults.map(function (item, idx) {
325
- return computeDefaults(schema.items[idx] || schema.additionalItems || {}, item, rootSchema);
326
- });
327
- } // Deeply inject defaults into already existing form data
328
-
329
-
330
- if (Array.isArray(rawFormData)) {
331
- defaults = rawFormData.map(function (item, idx) {
332
- return computeDefaults(schema.items, (defaults || {})[idx], rootSchema, item);
333
- });
334
- }
335
-
336
- if (schema.minItems) {
337
- if (!isMultiSelect(schema, rootSchema)) {
338
- var defaultsLength = defaults ? defaults.length : 0;
339
-
340
- if (schema.minItems > defaultsLength) {
341
- var defaultEntries = defaults || []; // populate the array with the defaults
342
-
343
- var fillerSchema = Array.isArray(schema.items) ? schema.additionalItems : schema.items;
344
- var fillerEntries = (0, _fill["default"])(new Array(schema.minItems - defaultsLength), computeDefaults(fillerSchema, fillerSchema.defaults, rootSchema)); // then fill up the rest with either the item default or empty, up to minItems
345
-
346
- return defaultEntries.concat(fillerEntries);
347
- }
348
- } else {
349
- return defaults ? defaults : [];
350
- }
351
- }
352
-
353
- }
354
-
355
- return defaults;
356
- }
357
-
358
- function getDefaultFormState(_schema, formData) {
359
- var rootSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
360
- var includeUndefinedValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
361
-
362
- if (!isObject(_schema)) {
363
- throw new Error("Invalid schema: " + _schema);
364
- }
365
-
366
- var schema = retrieveSchema(_schema, rootSchema, formData);
367
- var defaults = computeDefaults(schema, _schema["default"], rootSchema, formData, includeUndefinedValues);
368
-
369
- if (typeof formData === "undefined") {
370
- // No form data? Use schema defaults.
371
- return defaults;
372
- }
373
-
374
- if (isObject(formData) || Array.isArray(formData)) {
375
- return mergeDefaultsWithFormData(defaults, formData);
376
- }
377
-
378
- if (formData === 0 || formData === false || formData === "") {
379
- return formData;
380
- }
381
-
382
- return formData || defaults;
383
- }
384
- /**
385
- * When merging defaults and form data, we want to merge in this specific way:
386
- * - objects are deeply merged
387
- * - arrays are merged in such a way that:
388
- * - when the array is set in form data, only array entries set in form data
389
- * are deeply merged; additional entries from the defaults are ignored
390
- * - when the array is not set in form data, the default is copied over
391
- * - scalars are overwritten/set by form data
392
- */
393
-
394
-
395
- function mergeDefaultsWithFormData(defaults, formData) {
396
- if (Array.isArray(formData)) {
397
- if (!Array.isArray(defaults)) {
398
- defaults = [];
399
- }
400
-
401
- return formData.map(function (value, idx) {
402
- if (defaults[idx]) {
403
- return mergeDefaultsWithFormData(defaults[idx], value);
404
- }
405
-
406
- return value;
407
- });
408
- } else if (isObject(formData)) {
409
- var acc = Object.assign({}, defaults); // Prevent mutation of source object.
410
-
411
- return Object.keys(formData).reduce(function (acc, key) {
412
- acc[key] = mergeDefaultsWithFormData(defaults ? defaults[key] : {}, formData[key]);
413
- return acc;
414
- }, acc);
415
- } else {
416
- return formData;
417
- }
418
- }
419
-
420
- function getUiOptions(uiSchema) {
421
- // get all passed options from ui:widget, ui:options, and ui:<optionName>
422
- return Object.keys(uiSchema).filter(function (key) {
423
- return key.indexOf("ui:") === 0;
424
- }).reduce(function (options, key) {
425
- var value = uiSchema[key];
426
-
427
- if (key === "ui:widget" && isObject(value)) {
428
- console.warn("Setting options via ui:widget object is deprecated, use ui:options instead");
429
- return _objectSpread({}, options, value.options || {}, {
430
- widget: value.component
431
- });
432
- }
433
-
434
- if (key === "ui:options" && isObject(value)) {
435
- return _objectSpread({}, options, value);
436
- }
437
-
438
- return _objectSpread({}, options, _defineProperty({}, key.substring(3), value));
439
- }, {});
440
- }
441
-
442
- function getSubmitButtonOptions(uiSchema) {
443
- var uiOptions = getUiOptions(uiSchema);
444
- var defaultOptions = {
445
- props: {
446
- disabled: false
447
- },
448
- submitText: "Submit",
449
- norender: false
450
- };
451
-
452
- if (uiOptions && uiOptions["submitButtonOptions"]) {
453
- return Object.assign({}, defaultOptions, uiOptions["submitButtonOptions"]);
454
- }
455
-
456
- return defaultOptions;
457
- }
458
-
459
- function getDisplayLabel(schema, uiSchema, rootSchema) {
460
- var uiOptions = getUiOptions(uiSchema);
461
- var _uiOptions$label = uiOptions.label,
462
- displayLabel = _uiOptions$label === void 0 ? true : _uiOptions$label;
463
- var schemaType = getSchemaType(schema);
464
-
465
- if (schemaType === "array") {
466
- displayLabel = isMultiSelect(schema, rootSchema) || isFilesArray(schema, uiSchema, rootSchema) || isCustomWidget(uiSchema);
467
- }
468
-
469
- if (schemaType === "object") {
470
- displayLabel = false;
471
- }
472
-
473
- if (schemaType === "boolean" && !uiSchema["ui:widget"]) {
474
- displayLabel = false;
475
- }
476
-
477
- if (uiSchema["ui:field"]) {
478
- displayLabel = false;
479
- }
480
-
481
- return displayLabel;
482
- }
483
-
484
- function isObject(thing) {
485
- if (typeof File !== "undefined" && thing instanceof File) {
486
- return false;
487
- }
488
-
489
- return _typeof(thing) === "object" && thing !== null && !Array.isArray(thing);
490
- }
491
-
492
- function mergeObjects(obj1, obj2) {
493
- var concatArrays = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
494
- // Recursively merge deeply nested objects.
495
- var acc = Object.assign({}, obj1); // Prevent mutation of source object.
496
-
497
- return Object.keys(obj2).reduce(function (acc, key) {
498
- var left = obj1 ? obj1[key] : {},
499
- right = obj2[key];
500
-
501
- if (obj1 && obj1.hasOwnProperty(key) && isObject(right)) {
502
- acc[key] = mergeObjects(left, right, concatArrays);
503
- } else if (concatArrays && Array.isArray(left) && Array.isArray(right)) {
504
- acc[key] = left.concat(right);
505
- } else {
506
- acc[key] = right;
507
- }
508
-
509
- return acc;
510
- }, acc);
511
- }
512
-
513
- function asNumber(value) {
514
- if (value === "") {
515
- return undefined;
516
- }
517
-
518
- if (value === null) {
519
- return null;
520
- }
521
-
522
- if (/\.$/.test(value)) {
523
- // "3." can't really be considered a number even if it parses in js. The
524
- // user is most likely entering a float.
525
- return value;
526
- }
527
-
528
- if (/\.0$/.test(value)) {
529
- // we need to return this as a string here, to allow for input like 3.07
530
- return value;
531
- }
532
-
533
- var n = Number(value);
534
- var valid = typeof n === "number" && !Number.isNaN(n);
535
-
536
- if (/\.\d*0$/.test(value)) {
537
- // It's a number, that's cool - but we need it as a string so it doesn't screw
538
- // with the user when entering dollar amounts or other values (such as those with
539
- // specific precision or number of significant digits)
540
- return value;
541
- }
542
-
543
- return valid ? n : value;
544
- }
545
-
546
- function orderProperties(properties, order) {
547
- if (!Array.isArray(order)) {
548
- return properties;
549
- }
550
-
551
- var arrayToHash = function arrayToHash(arr) {
552
- return arr.reduce(function (prev, curr) {
553
- prev[curr] = true;
554
- return prev;
555
- }, {});
556
- };
557
-
558
- var errorPropList = function errorPropList(arr) {
559
- return arr.length > 1 ? "properties '".concat(arr.join("', '"), "'") : "property '".concat(arr[0], "'");
560
- };
561
-
562
- var propertyHash = arrayToHash(properties);
563
- var orderFiltered = order.filter(function (prop) {
564
- return prop === "*" || propertyHash[prop];
565
- });
566
- var orderHash = arrayToHash(orderFiltered);
567
- var rest = properties.filter(function (prop) {
568
- return !orderHash[prop];
569
- });
570
- var restIndex = orderFiltered.indexOf("*");
571
-
572
- if (restIndex === -1) {
573
- if (rest.length) {
574
- throw new Error("uiSchema order list does not contain ".concat(errorPropList(rest)));
575
- }
576
-
577
- return orderFiltered;
578
- }
579
-
580
- if (restIndex !== orderFiltered.lastIndexOf("*")) {
581
- throw new Error("uiSchema order list contains more than one wildcard item");
582
- }
583
-
584
- var complete = _toConsumableArray(orderFiltered);
585
-
586
- complete.splice.apply(complete, [restIndex, 1].concat(_toConsumableArray(rest)));
587
- return complete;
588
- }
589
- /**
590
- * This function checks if the given schema matches a single
591
- * constant value.
592
- */
593
-
594
-
595
- function isConstant(schema) {
596
- return Array.isArray(schema["enum"]) && schema["enum"].length === 1 || schema.hasOwnProperty("const");
597
- }
598
-
599
- function toConstant(schema) {
600
- if (Array.isArray(schema["enum"]) && schema["enum"].length === 1) {
601
- return schema["enum"][0];
602
- } else if (schema.hasOwnProperty("const")) {
603
- return schema["const"];
604
- } else {
605
- throw new Error("schema cannot be inferred as a constant");
606
- }
607
- }
608
-
609
- function isSelect(_schema) {
610
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
611
- var schema = retrieveSchema(_schema, rootSchema);
612
- var altSchemas = schema.oneOf || schema.anyOf;
613
-
614
- if (Array.isArray(schema["enum"])) {
615
- return true;
616
- } else if (Array.isArray(altSchemas)) {
617
- return altSchemas.every(function (altSchemas) {
618
- return isConstant(altSchemas);
619
- });
620
- }
621
-
622
- return false;
623
- }
624
-
625
- function isMultiSelect(schema) {
626
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
627
-
628
- if (!schema.uniqueItems || !schema.items) {
629
- return false;
630
- }
631
-
632
- return isSelect(schema.items, rootSchema);
633
- }
634
-
635
- function isFilesArray(schema, uiSchema) {
636
- var rootSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
637
-
638
- if (uiSchema["ui:widget"] === "files") {
639
- return true;
640
- } else if (schema.items) {
641
- var itemsSchema = retrieveSchema(schema.items, rootSchema);
642
- return itemsSchema.type === "string" && itemsSchema.format === "data-url";
643
- }
644
-
645
- return false;
646
- }
647
-
648
- function isFixedItems(schema) {
649
- return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every(function (item) {
650
- return isObject(item);
651
- });
652
- }
653
-
654
- function isCustomWidget(uiSchema) {
655
- return (// TODO: Remove the `&& uiSchema["ui:widget"] !== "hidden"` once we support hidden widgets for arrays.
656
- // https://react-jsonschema-form.readthedocs.io/en/latest/usage/widgets/#hidden-widgets
657
- "widget" in getUiOptions(uiSchema) && getUiOptions(uiSchema)["widget"] !== "hidden"
658
- );
659
- }
660
-
661
- function allowAdditionalItems(schema) {
662
- if (schema.additionalItems === true) {
663
- console.warn("additionalItems=true is currently not supported");
664
- }
665
-
666
- return isObject(schema.additionalItems);
667
- }
668
-
669
- function optionsList(schema) {
670
- if (schema["enum"]) {
671
- return schema["enum"].map(function (value, i) {
672
- var label = schema.enumNames && schema.enumNames[i] || String(value);
673
- return {
674
- label: label,
675
- value: value
676
- };
677
- });
678
- } else {
679
- var altSchemas = schema.oneOf || schema.anyOf;
680
- return altSchemas.map(function (schema) {
681
- var value = toConstant(schema);
682
- var label = schema.title || String(value);
683
- return {
684
- schema: schema,
685
- label: label,
686
- value: value
687
- };
688
- });
689
- }
690
- }
691
-
692
- function findSchemaDefinition($ref) {
693
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
694
- var origRef = $ref;
695
-
696
- if ($ref.startsWith("#")) {
697
- // Decode URI fragment representation.
698
- $ref = decodeURIComponent($ref.substring(1));
699
- } else {
700
- throw new Error("Could not find a definition for ".concat(origRef, "."));
701
- }
702
-
703
- var current = _jsonpointer["default"].get(rootSchema, $ref);
704
-
705
- if (current === undefined) {
706
- throw new Error("Could not find a definition for ".concat(origRef, "."));
707
- }
708
-
709
- if (current.hasOwnProperty("$ref")) {
710
- return findSchemaDefinition(current.$ref, rootSchema);
711
- }
712
-
713
- return current;
714
- } // In the case where we have to implicitly create a schema, it is useful to know what type to use
715
- // based on the data we are defining
716
-
717
-
718
- var guessType = function guessType(value) {
719
- if (Array.isArray(value)) {
720
- return "array";
721
- } else if (typeof value === "string") {
722
- return "string";
723
- } else if (value == null) {
724
- return "null";
725
- } else if (typeof value === "boolean") {
726
- return "boolean";
727
- } else if (!isNaN(value)) {
728
- return "number";
729
- } else if (_typeof(value) === "object") {
730
- return "object";
731
- } // Default to string if we can't figure it out
732
-
733
-
734
- return "string";
735
- }; // This function will create new "properties" items for each key in our formData
736
-
737
-
738
- exports.guessType = guessType;
739
-
740
- function stubExistingAdditionalProperties(schema) {
741
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
742
- var formData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
743
- // Clone the schema so we don't ruin the consumer's original
744
- schema = _objectSpread({}, schema, {
745
- properties: _objectSpread({}, schema.properties)
746
- }); // make sure formData is an object
747
-
748
- formData = isObject(formData) ? formData : {};
749
- Object.keys(formData).forEach(function (key) {
750
- if (schema.properties.hasOwnProperty(key)) {
751
- // No need to stub, our schema already has the property
752
- return;
753
- }
754
-
755
- var additionalProperties;
756
-
757
- if (schema.additionalProperties.hasOwnProperty("$ref")) {
758
- additionalProperties = retrieveSchema({
759
- $ref: schema.additionalProperties["$ref"]
760
- }, rootSchema, formData);
761
- } else if (schema.additionalProperties.hasOwnProperty("type")) {
762
- additionalProperties = _objectSpread({}, schema.additionalProperties);
763
- } else {
764
- additionalProperties = {
765
- type: guessType(formData[key])
766
- };
767
- } // The type of our new key should match the additionalProperties value;
768
-
769
-
770
- schema.properties[key] = additionalProperties; // Set our additional property flag so we know it was dynamically added
771
-
772
- schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
773
- });
774
- return schema;
775
- }
776
- /**
777
- * Resolves a conditional block (if/else/then) by removing the condition and merging the appropriate conditional branch with the rest of the schema
778
- */
779
-
780
-
781
- var resolveCondition = function resolveCondition(schema, rootSchema, formData) {
782
- var expression = schema["if"],
783
- then = schema.then,
784
- otherwise = schema["else"],
785
- resolvedSchemaLessConditional = _objectWithoutProperties(schema, ["if", "then", "else"]);
786
-
787
- var conditionalSchema = (0, _validate.isValid)(expression, formData, rootSchema) ? then : otherwise;
788
-
789
- if (conditionalSchema) {
790
- return retrieveSchema(mergeSchemas(resolvedSchemaLessConditional, retrieveSchema(conditionalSchema, rootSchema, formData)), rootSchema, formData);
791
- } else {
792
- return retrieveSchema(resolvedSchemaLessConditional, rootSchema, formData);
793
- }
794
- };
795
- /**
796
- * Resolves references and dependencies within a schema and its 'allOf' children.
797
- *
798
- * Called internally by retrieveSchema.
799
- */
800
-
801
-
802
- function resolveSchema(schema) {
803
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
804
- var formData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
805
-
806
- if (schema.hasOwnProperty("$ref")) {
807
- return resolveReference(schema, rootSchema, formData);
808
- } else if (schema.hasOwnProperty("dependencies")) {
809
- var resolvedSchema = resolveDependencies(schema, rootSchema, formData);
810
- return retrieveSchema(resolvedSchema, rootSchema, formData);
811
- } else if (schema.hasOwnProperty("allOf")) {
812
- return _objectSpread({}, schema, {
813
- allOf: schema.allOf.map(function (allOfSubschema) {
814
- return retrieveSchema(allOfSubschema, rootSchema, formData);
815
- })
816
- });
817
- } else {
818
- // No $ref or dependencies attribute found, returning the original schema.
819
- return schema;
820
- }
821
- }
822
-
823
- function resolveReference(schema, rootSchema, formData) {
824
- // Retrieve the referenced schema definition.
825
- var $refSchema = findSchemaDefinition(schema.$ref, rootSchema); // Drop the $ref property of the source schema.
826
-
827
- var $ref = schema.$ref,
828
- localSchema = _objectWithoutProperties(schema, ["$ref"]); // Update referenced schema definition with local schema properties.
829
-
830
-
831
- return retrieveSchema(_objectSpread({}, $refSchema, localSchema), rootSchema, formData);
832
- }
833
-
834
- function retrieveSchema(schema) {
835
- var rootSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
836
- var formData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
837
-
838
- if (!isObject(schema)) {
839
- return {};
840
- }
841
-
842
- var resolvedSchema = resolveSchema(schema, rootSchema, formData);
843
-
844
- if (schema.hasOwnProperty("if")) {
845
- return resolveCondition(schema, rootSchema, formData);
846
- } // For each level of the dependency, we need to recursively determine the appropriate resolved schema given the current state of formData.
847
- // Otherwise, nested allOf subschemas will not be correctly displayed.
848
-
849
-
850
- if (resolvedSchema.properties) {
851
- var properties = {};
852
- Object.entries(resolvedSchema.properties).forEach(function (entries) {
853
- var propName = entries[0];
854
- var propSchema = entries[1];
855
- var rawPropData = formData && formData[propName];
856
- var propData = isObject(rawPropData) ? rawPropData : {};
857
- var resolvedPropSchema = retrieveSchema(propSchema, rootSchema, propData);
858
- properties[propName] = resolvedPropSchema;
859
-
860
- if (propSchema !== resolvedPropSchema && resolvedSchema.properties !== properties) {
861
- resolvedSchema = _objectSpread({}, resolvedSchema, {
862
- properties: properties
863
- });
864
- }
865
- });
866
- }
867
-
868
- if ("allOf" in schema) {
869
- try {
870
- resolvedSchema = (0, _jsonSchemaMergeAllof["default"])(_objectSpread({}, resolvedSchema, {
871
- allOf: resolvedSchema.allOf
872
- }));
873
- } catch (e) {
874
- console.warn("could not merge subschemas in allOf:\n" + e);
875
-
876
- var _resolvedSchema = resolvedSchema,
877
- allOf = _resolvedSchema.allOf,
878
- resolvedSchemaWithoutAllOf = _objectWithoutProperties(_resolvedSchema, ["allOf"]);
879
-
880
- return resolvedSchemaWithoutAllOf;
881
- }
882
- }
883
-
884
- var hasAdditionalProperties = resolvedSchema.hasOwnProperty("additionalProperties") && resolvedSchema.additionalProperties !== false;
885
-
886
- if (hasAdditionalProperties) {
887
- return stubExistingAdditionalProperties(resolvedSchema, rootSchema, formData);
888
- }
889
-
890
- return resolvedSchema;
891
- }
892
-
893
- function resolveDependencies(schema, rootSchema, formData) {
894
- // Drop the dependencies from the source schema.
895
- var _schema$dependencies = schema.dependencies,
896
- dependencies = _schema$dependencies === void 0 ? {} : _schema$dependencies,
897
- resolvedSchema = _objectWithoutProperties(schema, ["dependencies"]);
898
-
899
- if ("oneOf" in resolvedSchema) {
900
- resolvedSchema = resolvedSchema.oneOf[getMatchingOption(formData, resolvedSchema.oneOf, rootSchema)];
901
- } else if ("anyOf" in resolvedSchema) {
902
- resolvedSchema = resolvedSchema.anyOf[getMatchingOption(formData, resolvedSchema.anyOf, rootSchema)];
903
- }
904
-
905
- return processDependencies(dependencies, resolvedSchema, rootSchema, formData);
906
- }
907
-
908
- function processDependencies(dependencies, resolvedSchema, rootSchema, formData) {
909
- // Process dependencies updating the local schema properties as appropriate.
910
- for (var dependencyKey in dependencies) {
911
- // Skip this dependency if its trigger property is not present.
912
- if (formData[dependencyKey] === undefined) {
913
- continue;
914
- } // Skip this dependency if it is not included in the schema (such as when dependencyKey is itself a hidden dependency.)
915
-
916
-
917
- if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
918
- continue;
919
- }
920
-
921
- var dependencyValue = dependencies[dependencyKey],
922
- remainingDependencies = _objectWithoutProperties(dependencies, [dependencyKey].map(_toPropertyKey));
923
-
924
- if (Array.isArray(dependencyValue)) {
925
- resolvedSchema = withDependentProperties(resolvedSchema, dependencyValue);
926
- } else if (isObject(dependencyValue)) {
927
- resolvedSchema = withDependentSchema(resolvedSchema, rootSchema, formData, dependencyKey, dependencyValue);
928
- }
929
-
930
- return processDependencies(remainingDependencies, resolvedSchema, rootSchema, formData);
931
- }
932
-
933
- return resolvedSchema;
934
- }
935
-
936
- function withDependentProperties(schema, additionallyRequired) {
937
- if (!additionallyRequired) {
938
- return schema;
939
- }
940
-
941
- var required = Array.isArray(schema.required) ? Array.from(new Set([].concat(_toConsumableArray(schema.required), _toConsumableArray(additionallyRequired)))) : additionallyRequired;
942
- return _objectSpread({}, schema, {
943
- required: required
944
- });
945
- }
946
-
947
- function withDependentSchema(schema, rootSchema, formData, dependencyKey, dependencyValue) {
948
- var _retrieveSchema = retrieveSchema(dependencyValue, rootSchema, formData),
949
- oneOf = _retrieveSchema.oneOf,
950
- dependentSchema = _objectWithoutProperties(_retrieveSchema, ["oneOf"]);
951
-
952
- schema = mergeSchemas(schema, dependentSchema); // Since it does not contain oneOf, we return the original schema.
953
-
954
- if (oneOf === undefined) {
955
- return schema;
956
- } else if (!Array.isArray(oneOf)) {
957
- throw new Error("invalid: it is some ".concat(_typeof(oneOf), " instead of an array"));
958
- } // Resolve $refs inside oneOf.
959
-
960
-
961
- var resolvedOneOf = oneOf.map(function (subschema) {
962
- return subschema.hasOwnProperty("$ref") ? resolveReference(subschema, rootSchema, formData) : subschema;
963
- });
964
- return withExactlyOneSubschema(schema, rootSchema, formData, dependencyKey, resolvedOneOf);
965
- }
966
-
967
- function withExactlyOneSubschema(schema, rootSchema, formData, dependencyKey, oneOf) {
968
- var validSubschemas = oneOf.filter(function (subschema) {
969
- if (!subschema.properties) {
970
- return false;
971
- }
972
-
973
- var conditionPropertySchema = subschema.properties[dependencyKey];
974
-
975
- if (conditionPropertySchema) {
976
- var conditionSchema = {
977
- type: "object",
978
- properties: _defineProperty({}, dependencyKey, conditionPropertySchema)
979
- };
980
-
981
- var _validateFormData = (0, _validate["default"])(formData, conditionSchema),
982
- errors = _validateFormData.errors;
983
-
984
- return errors.length === 0;
985
- }
986
- });
987
-
988
- if (validSubschemas.length !== 1) {
989
- console.warn("ignoring oneOf in dependencies because there isn't exactly one subschema that is valid");
990
- return schema;
991
- }
992
-
993
- var subschema = validSubschemas[0];
994
-
995
- var _subschema$properties = subschema.properties,
996
- conditionPropertySchema = _subschema$properties[dependencyKey],
997
- dependentSubschema = _objectWithoutProperties(_subschema$properties, [dependencyKey].map(_toPropertyKey));
998
-
999
- var dependentSchema = _objectSpread({}, subschema, {
1000
- properties: dependentSubschema
1001
- });
1002
-
1003
- return mergeSchemas(schema, retrieveSchema(dependentSchema, rootSchema, formData));
1004
- } // Recursively merge deeply nested schemas.
1005
- // The difference between mergeSchemas and mergeObjects
1006
- // is that mergeSchemas only concats arrays for
1007
- // values under the "required" keyword, and when it does,
1008
- // it doesn't include duplicate values.
1009
-
1010
-
1011
- function mergeSchemas(obj1, obj2) {
1012
- var acc = Object.assign({}, obj1); // Prevent mutation of source object.
1013
-
1014
- return Object.keys(obj2).reduce(function (acc, key) {
1015
- var left = obj1 ? obj1[key] : {},
1016
- right = obj2[key];
1017
-
1018
- if (obj1 && obj1.hasOwnProperty(key) && isObject(right)) {
1019
- acc[key] = mergeSchemas(left, right);
1020
- } else if (obj1 && obj2 && (getSchemaType(obj1) === "object" || getSchemaType(obj2) === "object") && key === "required" && Array.isArray(left) && Array.isArray(right)) {
1021
- // Don't include duplicate values when merging
1022
- // "required" fields.
1023
- acc[key] = (0, _union["default"])(left, right);
1024
- } else {
1025
- acc[key] = right;
1026
- }
1027
-
1028
- return acc;
1029
- }, acc);
1030
- }
1031
-
1032
- function isArguments(object) {
1033
- return Object.prototype.toString.call(object) === "[object Arguments]";
1034
- }
1035
-
1036
- function deepEquals(a, b) {
1037
- var ca = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
1038
- var cb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
1039
-
1040
- // Partially extracted from node-deeper and adapted to exclude comparison
1041
- // checks for functions.
1042
- // https://github.com/othiym23/node-deeper
1043
- if (a === b) {
1044
- return true;
1045
- } else if (typeof a === "function" || typeof b === "function") {
1046
- // Assume all functions are equivalent
1047
- // see https://github.com/rjsf-team/react-jsonschema-form/issues/255
1048
- return true;
1049
- } else if (_typeof(a) !== "object" || _typeof(b) !== "object") {
1050
- return false;
1051
- } else if (a === null || b === null) {
1052
- return false;
1053
- } else if (a instanceof Date && b instanceof Date) {
1054
- return a.getTime() === b.getTime();
1055
- } else if (a instanceof RegExp && b instanceof RegExp) {
1056
- return a.source === b.source && a.global === b.global && a.multiline === b.multiline && a.lastIndex === b.lastIndex && a.ignoreCase === b.ignoreCase;
1057
- } else if (isArguments(a) || isArguments(b)) {
1058
- if (!(isArguments(a) && isArguments(b))) {
1059
- return false;
1060
- }
1061
-
1062
- var slice = Array.prototype.slice;
1063
- return deepEquals(slice.call(a), slice.call(b), ca, cb);
1064
- } else {
1065
- if (a.constructor !== b.constructor) {
1066
- return false;
1067
- }
1068
-
1069
- var ka = Object.keys(a);
1070
- var kb = Object.keys(b); // don't bother with stack acrobatics if there's nothing there
1071
-
1072
- if (ka.length === 0 && kb.length === 0) {
1073
- return true;
1074
- }
1075
-
1076
- if (ka.length !== kb.length) {
1077
- return false;
1078
- }
1079
-
1080
- var cal = ca.length;
1081
-
1082
- while (cal--) {
1083
- if (ca[cal] === a) {
1084
- return cb[cal] === b;
1085
- }
1086
- }
1087
-
1088
- ca.push(a);
1089
- cb.push(b);
1090
- ka.sort();
1091
- kb.sort();
1092
-
1093
- for (var j = ka.length - 1; j >= 0; j--) {
1094
- if (ka[j] !== kb[j]) {
1095
- return false;
1096
- }
1097
- }
1098
-
1099
- var _key;
1100
-
1101
- for (var k = ka.length - 1; k >= 0; k--) {
1102
- _key = ka[k];
1103
-
1104
- if (!deepEquals(a[_key], b[_key], ca, cb)) {
1105
- return false;
1106
- }
1107
- }
1108
-
1109
- ca.pop();
1110
- cb.pop();
1111
- return true;
1112
- }
1113
- }
1114
-
1115
- function shouldRender(comp, nextProps, nextState) {
1116
- var props = comp.props,
1117
- state = comp.state;
1118
- return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
1119
- }
1120
-
1121
- function toIdSchema(schema, id, rootSchema) {
1122
- var formData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
1123
- var idPrefix = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "root";
1124
- var idSeparator = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : "_";
1125
- var idSchema = {
1126
- $id: id || idPrefix
1127
- };
1128
-
1129
- if ("$ref" in schema || "dependencies" in schema || "allOf" in schema) {
1130
- var _schema = retrieveSchema(schema, rootSchema, formData);
1131
-
1132
- return toIdSchema(_schema, id, rootSchema, formData, idPrefix, idSeparator);
1133
- }
1134
-
1135
- if ("items" in schema && !schema.items.$ref) {
1136
- return toIdSchema(schema.items, id, rootSchema, formData, idPrefix, idSeparator);
1137
- }
1138
-
1139
- if (schema.type !== "object") {
1140
- return idSchema;
1141
- }
1142
-
1143
- for (var name in schema.properties || {}) {
1144
- var field = schema.properties[name];
1145
- var fieldId = idSchema.$id + idSeparator + name;
1146
- idSchema[name] = toIdSchema(isObject(field) ? field : {}, fieldId, rootSchema, // It's possible that formData is not an object -- this can happen if an
1147
- // array item has just been added, but not populated with data yet
1148
- (formData || {})[name], idPrefix, idSeparator);
1149
- }
1150
-
1151
- return idSchema;
1152
- }
1153
-
1154
- function toPathSchema(schema) {
1155
- var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
1156
- var rootSchema = arguments.length > 2 ? arguments[2] : undefined;
1157
- var formData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
1158
- var pathSchema = {
1159
- $name: name.replace(/^\./, "")
1160
- };
1161
-
1162
- if ("$ref" in schema || "dependencies" in schema || "allOf" in schema) {
1163
- var _schema = retrieveSchema(schema, rootSchema, formData);
1164
-
1165
- return toPathSchema(_schema, name, rootSchema, formData);
1166
- }
1167
-
1168
- if (schema.hasOwnProperty("additionalProperties")) {
1169
- pathSchema.__rjsf_additionalProperties = true;
1170
- }
1171
-
1172
- if (schema.hasOwnProperty("items") && Array.isArray(formData)) {
1173
- formData.forEach(function (element, i) {
1174
- pathSchema[i] = toPathSchema(schema.items, "".concat(name, ".").concat(i), rootSchema, element);
1175
- });
1176
- } else if (schema.hasOwnProperty("properties")) {
1177
- for (var property in schema.properties) {
1178
- pathSchema[property] = toPathSchema(schema.properties[property], "".concat(name, ".").concat(property), rootSchema, // It's possible that formData is not an object -- this can happen if an
1179
- // array item has just been added, but not populated with data yet
1180
- (formData || {})[property]);
1181
- }
1182
- }
1183
-
1184
- return pathSchema;
1185
- }
1186
-
1187
- function parseDateString(dateString) {
1188
- var includeTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1189
-
1190
- if (!dateString) {
1191
- return {
1192
- year: -1,
1193
- month: -1,
1194
- day: -1,
1195
- hour: includeTime ? -1 : 0,
1196
- minute: includeTime ? -1 : 0,
1197
- second: includeTime ? -1 : 0
1198
- };
1199
- }
1200
-
1201
- var date = new Date(dateString);
1202
-
1203
- if (Number.isNaN(date.getTime())) {
1204
- throw new Error("Unable to parse date " + dateString);
1205
- }
1206
-
1207
- return {
1208
- year: date.getUTCFullYear(),
1209
- month: date.getUTCMonth() + 1,
1210
- // oh you, javascript.
1211
- day: date.getUTCDate(),
1212
- hour: includeTime ? date.getUTCHours() : 0,
1213
- minute: includeTime ? date.getUTCMinutes() : 0,
1214
- second: includeTime ? date.getUTCSeconds() : 0
1215
- };
1216
- }
1217
-
1218
- function toDateString(_ref2) {
1219
- var year = _ref2.year,
1220
- month = _ref2.month,
1221
- day = _ref2.day,
1222
- _ref2$hour = _ref2.hour,
1223
- hour = _ref2$hour === void 0 ? 0 : _ref2$hour,
1224
- _ref2$minute = _ref2.minute,
1225
- minute = _ref2$minute === void 0 ? 0 : _ref2$minute,
1226
- _ref2$second = _ref2.second,
1227
- second = _ref2$second === void 0 ? 0 : _ref2$second;
1228
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1229
- var utcTime = Date.UTC(year, month - 1, day, hour, minute, second);
1230
- var datetime = new Date(utcTime).toJSON();
1231
- return time ? datetime : datetime.slice(0, 10);
1232
- }
1233
-
1234
- function utcToLocal(jsonDate) {
1235
- if (!jsonDate) {
1236
- return "";
1237
- } // required format of `"yyyy-MM-ddThh:mm" followed by optional ":ss" or ":ss.SSS"
1238
- // https://html.spec.whatwg.org/multipage/input.html#local-date-and-time-state-(type%3Ddatetime-local)
1239
- // > should be a _valid local date and time string_ (not GMT)
1240
- // Note - date constructor passed local ISO-8601 does not correctly
1241
- // change time to UTC in node pre-8
1242
-
1243
-
1244
- var date = new Date(jsonDate);
1245
- var yyyy = pad(date.getFullYear(), 4);
1246
- var MM = pad(date.getMonth() + 1, 2);
1247
- var dd = pad(date.getDate(), 2);
1248
- var hh = pad(date.getHours(), 2);
1249
- var mm = pad(date.getMinutes(), 2);
1250
- var ss = pad(date.getSeconds(), 2);
1251
- var SSS = pad(date.getMilliseconds(), 3);
1252
- return "".concat(yyyy, "-").concat(MM, "-").concat(dd, "T").concat(hh, ":").concat(mm, ":").concat(ss, ".").concat(SSS);
1253
- }
1254
-
1255
- function localToUTC(dateString) {
1256
- if (dateString) {
1257
- return new Date(dateString).toJSON();
1258
- }
1259
- }
1260
-
1261
- function pad(num, size) {
1262
- var s = String(num);
1263
-
1264
- while (s.length < size) {
1265
- s = "0" + s;
1266
- }
1267
-
1268
- return s;
1269
- }
1270
-
1271
- function dataURItoBlob(dataURI) {
1272
- // Split metadata from data
1273
- var splitted = dataURI.split(","); // Split params
1274
-
1275
- var params = splitted[0].split(";"); // Get mime-type from params
1276
-
1277
- var type = params[0].replace("data:", ""); // Filter the name property from params
1278
-
1279
- var properties = params.filter(function (param) {
1280
- return param.split("=")[0] === "name";
1281
- }); // Look for the name and use unknown if no name property.
1282
-
1283
- var name;
1284
-
1285
- if (properties.length !== 1) {
1286
- name = "unknown";
1287
- } else {
1288
- // Because we filtered out the other property,
1289
- // we only have the name case here.
1290
- name = properties[0].split("=")[1];
1291
- } // Built the Uint8Array Blob parameter from the base64 string.
1292
-
1293
-
1294
- var binary = atob(splitted[1]);
1295
- var array = [];
1296
-
1297
- for (var _i = 0; _i < binary.length; _i++) {
1298
- array.push(binary.charCodeAt(_i));
1299
- } // Create the blob object
1300
-
1301
-
1302
- var blob = new window.Blob([new Uint8Array(array)], {
1303
- type: type
1304
- });
1305
- return {
1306
- blob: blob,
1307
- name: name
1308
- };
1309
- }
1310
-
1311
- function rangeSpec(schema) {
1312
- var spec = {};
1313
-
1314
- if (schema.multipleOf) {
1315
- spec.step = schema.multipleOf;
1316
- }
1317
-
1318
- if (schema.minimum || schema.minimum === 0) {
1319
- spec.min = schema.minimum;
1320
- }
1321
-
1322
- if (schema.maximum || schema.maximum === 0) {
1323
- spec.max = schema.maximum;
1324
- }
1325
-
1326
- return spec;
1327
- }
1328
-
1329
- function getMatchingOption(formData, options, rootSchema) {
1330
- // For performance, skip validating subschemas if formData is undefined. We just
1331
- // want to get the first option in that case.
1332
- if (formData === undefined) {
1333
- return 0;
1334
- }
1335
-
1336
- for (var _i2 = 0; _i2 < options.length; _i2++) {
1337
- var option = options[_i2]; // If the schema describes an object then we need to add slightly more
1338
- // strict matching to the schema, because unless the schema uses the
1339
- // "requires" keyword, an object will match the schema as long as it
1340
- // doesn't have matching keys with a conflicting type. To do this we use an
1341
- // "anyOf" with an array of requires. This augmentation expresses that the
1342
- // schema should match if any of the keys in the schema are present on the
1343
- // object and pass validation.
1344
-
1345
- if (option.properties) {
1346
- // Create an "anyOf" schema that requires at least one of the keys in the
1347
- // "properties" object
1348
- var requiresAnyOf = {
1349
- anyOf: Object.keys(option.properties).map(function (key) {
1350
- return {
1351
- required: [key]
1352
- };
1353
- })
1354
- };
1355
- var augmentedSchema = void 0; // If the "anyOf" keyword already exists, wrap the augmentation in an "allOf"
1356
-
1357
- if (option.anyOf) {
1358
- // Create a shallow clone of the option
1359
- var shallowClone = _extends({}, option);
1360
-
1361
- if (!shallowClone.allOf) {
1362
- shallowClone.allOf = [];
1363
- } else {
1364
- // If "allOf" already exists, shallow clone the array
1365
- shallowClone.allOf = shallowClone.allOf.slice();
1366
- }
1367
-
1368
- shallowClone.allOf.push(requiresAnyOf);
1369
- augmentedSchema = shallowClone;
1370
- } else {
1371
- augmentedSchema = Object.assign({}, option, requiresAnyOf);
1372
- } // Remove the "required" field as it's likely that not all fields have
1373
- // been filled in yet, which will mean that the schema is not valid
1374
-
1375
-
1376
- delete augmentedSchema.required;
1377
-
1378
- if ((0, _validate.isValid)(augmentedSchema, formData, rootSchema)) {
1379
- return _i2;
1380
- }
1381
- } else if ((0, _validate.isValid)(option, formData, rootSchema)) {
1382
- return _i2;
1383
- }
1384
- }
1385
-
1386
- return 0;
1387
- } // Check to see if a schema specifies that a value must be true
1388
-
1389
-
1390
- function schemaRequiresTrueValue(schema) {
1391
- // Check if const is a truthy value
1392
- if (schema["const"]) {
1393
- return true;
1394
- } // Check if an enum has a single value of true
1395
-
1396
-
1397
- if (schema["enum"] && schema["enum"].length === 1 && schema["enum"][0] === true) {
1398
- return true;
1399
- } // If anyOf has a single value, evaluate the subschema
1400
-
1401
-
1402
- if (schema.anyOf && schema.anyOf.length === 1) {
1403
- return schemaRequiresTrueValue(schema.anyOf[0]);
1404
- } // If oneOf has a single value, evaluate the subschema
1405
-
1406
-
1407
- if (schema.oneOf && schema.oneOf.length === 1) {
1408
- return schemaRequiresTrueValue(schema.oneOf[0]);
1409
- } // Evaluate each subschema in allOf, to see if one of them requires a true
1410
- // value
1411
-
1412
-
1413
- if (schema.allOf) {
1414
- return schema.allOf.some(schemaRequiresTrueValue);
1415
- }
1416
-
1417
- return false;
1418
- }
1419
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1BST1BFUlRZX0ZMQUciLCJ3aWRnZXRNYXAiLCJjaGVja2JveCIsInJhZGlvIiwic2VsZWN0IiwiaGlkZGVuIiwic3RyaW5nIiwidGV4dCIsInBhc3N3b3JkIiwiZW1haWwiLCJob3N0bmFtZSIsImlwdjQiLCJpcHY2IiwidXJpIiwidGV4dGFyZWEiLCJkYXRlIiwiZGF0ZXRpbWUiLCJjb2xvciIsImZpbGUiLCJudW1iZXIiLCJ1cGRvd24iLCJyYW5nZSIsImludGVnZXIiLCJhcnJheSIsImNoZWNrYm94ZXMiLCJmaWxlcyIsImNhbkV4cGFuZCIsInNjaGVtYSIsInVpU2NoZW1hIiwiZm9ybURhdGEiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImdldFVpT3B0aW9ucyIsImV4cGFuZGFibGUiLCJtYXhQcm9wZXJ0aWVzIiwidW5kZWZpbmVkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImdldERlZmF1bHRSZWdpc3RyeSIsImZpZWxkcyIsIndpZGdldHMiLCJkZWZpbml0aW9ucyIsInJvb3RTY2hlbWEiLCJmb3JtQ29udGV4dCIsImdldFNjaGVtYVR5cGUiLCJ0eXBlIiwiZ3Vlc3NUeXBlIiwicHJvcGVydGllcyIsIkFycmF5IiwiaW5jbHVkZXMiLCJmaW5kIiwiZ2V0V2lkZ2V0Iiwid2lkZ2V0IiwicmVnaXN0ZXJlZFdpZGdldHMiLCJtZXJnZU9wdGlvbnMiLCJXaWRnZXQiLCJNZXJnZWRXaWRnZXQiLCJkZWZhdWx0T3B0aW9ucyIsImRlZmF1bHRQcm9wcyIsIm9wdGlvbnMiLCJwcm9wcyIsIlJlYWN0SXMiLCJpc0ZvcndhcmRSZWYiLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJpc01lbW8iLCJFcnJvciIsImhhc093blByb3BlcnR5IiwicmVnaXN0ZXJlZFdpZGdldCIsImhhc1dpZGdldCIsImUiLCJtZXNzYWdlIiwic3RhcnRzV2l0aCIsImNvbXB1dGVEZWZhdWx0cyIsIl9zY2hlbWEiLCJwYXJlbnREZWZhdWx0cyIsInJhd0Zvcm1EYXRhIiwiaW5jbHVkZVVuZGVmaW5lZFZhbHVlcyIsImlzT2JqZWN0IiwiZGVmYXVsdHMiLCJtZXJnZU9iamVjdHMiLCJyZWZTY2hlbWEiLCJmaW5kU2NoZW1hRGVmaW5pdGlvbiIsIiRyZWYiLCJyZXNvbHZlZFNjaGVtYSIsInJlc29sdmVEZXBlbmRlbmNpZXMiLCJpc0ZpeGVkSXRlbXMiLCJpdGVtcyIsIm1hcCIsIml0ZW1TY2hlbWEiLCJpZHgiLCJpc0FycmF5Iiwib25lT2YiLCJnZXRNYXRjaGluZ09wdGlvbiIsImFueU9mIiwicmVkdWNlIiwiYWNjIiwia2V5IiwiY29tcHV0ZWREZWZhdWx0IiwiaXRlbSIsImFkZGl0aW9uYWxJdGVtcyIsIm1pbkl0ZW1zIiwiaXNNdWx0aVNlbGVjdCIsImRlZmF1bHRzTGVuZ3RoIiwiZGVmYXVsdEVudHJpZXMiLCJmaWxsZXJTY2hlbWEiLCJmaWxsZXJFbnRyaWVzIiwiY29uY2F0IiwiZ2V0RGVmYXVsdEZvcm1TdGF0ZSIsInJldHJpZXZlU2NoZW1hIiwibWVyZ2VEZWZhdWx0c1dpdGhGb3JtRGF0YSIsInZhbHVlIiwiYXNzaWduIiwiZmlsdGVyIiwiaW5kZXhPZiIsImNvbnNvbGUiLCJ3YXJuIiwiY29tcG9uZW50Iiwic3Vic3RyaW5nIiwiZ2V0U3VibWl0QnV0dG9uT3B0aW9ucyIsInVpT3B0aW9ucyIsImRpc2FibGVkIiwic3VibWl0VGV4dCIsIm5vcmVuZGVyIiwiZ2V0RGlzcGxheUxhYmVsIiwibGFiZWwiLCJkaXNwbGF5TGFiZWwiLCJzY2hlbWFUeXBlIiwiaXNGaWxlc0FycmF5IiwiaXNDdXN0b21XaWRnZXQiLCJ0aGluZyIsIkZpbGUiLCJvYmoxIiwib2JqMiIsImNvbmNhdEFycmF5cyIsImxlZnQiLCJyaWdodCIsImFzTnVtYmVyIiwidGVzdCIsIm4iLCJOdW1iZXIiLCJ2YWxpZCIsImlzTmFOIiwib3JkZXJQcm9wZXJ0aWVzIiwib3JkZXIiLCJhcnJheVRvSGFzaCIsImFyciIsInByZXYiLCJjdXJyIiwiZXJyb3JQcm9wTGlzdCIsImpvaW4iLCJwcm9wZXJ0eUhhc2giLCJvcmRlckZpbHRlcmVkIiwicHJvcCIsIm9yZGVySGFzaCIsInJlc3QiLCJyZXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImNvbXBsZXRlIiwic3BsaWNlIiwiaXNDb25zdGFudCIsInRvQ29uc3RhbnQiLCJpc1NlbGVjdCIsImFsdFNjaGVtYXMiLCJldmVyeSIsInVuaXF1ZUl0ZW1zIiwiaXRlbXNTY2hlbWEiLCJmb3JtYXQiLCJhbGxvd0FkZGl0aW9uYWxJdGVtcyIsIm9wdGlvbnNMaXN0IiwiaSIsImVudW1OYW1lcyIsIlN0cmluZyIsInRpdGxlIiwib3JpZ1JlZiIsImRlY29kZVVSSUNvbXBvbmVudCIsImN1cnJlbnQiLCJqc29ucG9pbnRlciIsImdldCIsInN0dWJFeGlzdGluZ0FkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiZm9yRWFjaCIsInJlc29sdmVDb25kaXRpb24iLCJleHByZXNzaW9uIiwidGhlbiIsIm90aGVyd2lzZSIsInJlc29sdmVkU2NoZW1hTGVzc0NvbmRpdGlvbmFsIiwiY29uZGl0aW9uYWxTY2hlbWEiLCJtZXJnZVNjaGVtYXMiLCJyZXNvbHZlU2NoZW1hIiwicmVzb2x2ZVJlZmVyZW5jZSIsImFsbE9mIiwiYWxsT2ZTdWJzY2hlbWEiLCIkcmVmU2NoZW1hIiwibG9jYWxTY2hlbWEiLCJlbnRyaWVzIiwicHJvcE5hbWUiLCJwcm9wU2NoZW1hIiwicmF3UHJvcERhdGEiLCJwcm9wRGF0YSIsInJlc29sdmVkUHJvcFNjaGVtYSIsInJlc29sdmVkU2NoZW1hV2l0aG91dEFsbE9mIiwiaGFzQWRkaXRpb25hbFByb3BlcnRpZXMiLCJkZXBlbmRlbmNpZXMiLCJwcm9jZXNzRGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeUtleSIsImRlcGVuZGVuY3lWYWx1ZSIsInJlbWFpbmluZ0RlcGVuZGVuY2llcyIsIndpdGhEZXBlbmRlbnRQcm9wZXJ0aWVzIiwid2l0aERlcGVuZGVudFNjaGVtYSIsImFkZGl0aW9uYWxseVJlcXVpcmVkIiwicmVxdWlyZWQiLCJmcm9tIiwiU2V0IiwiZGVwZW5kZW50U2NoZW1hIiwicmVzb2x2ZWRPbmVPZiIsInN1YnNjaGVtYSIsIndpdGhFeGFjdGx5T25lU3Vic2NoZW1hIiwidmFsaWRTdWJzY2hlbWFzIiwiY29uZGl0aW9uUHJvcGVydHlTY2hlbWEiLCJjb25kaXRpb25TY2hlbWEiLCJlcnJvcnMiLCJkZXBlbmRlbnRTdWJzY2hlbWEiLCJpc0FyZ3VtZW50cyIsIm9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImRlZXBFcXVhbHMiLCJhIiwiYiIsImNhIiwiY2IiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInNvdXJjZSIsImdsb2JhbCIsIm11bHRpbGluZSIsImxhc3RJbmRleCIsImlnbm9yZUNhc2UiLCJzbGljZSIsImNvbnN0cnVjdG9yIiwia2EiLCJrYiIsImNhbCIsInB1c2giLCJzb3J0IiwiaiIsImsiLCJwb3AiLCJzaG91bGRSZW5kZXIiLCJjb21wIiwibmV4dFByb3BzIiwibmV4dFN0YXRlIiwic3RhdGUiLCJ0b0lkU2NoZW1hIiwiaWQiLCJpZFByZWZpeCIsImlkU2VwYXJhdG9yIiwiaWRTY2hlbWEiLCIkaWQiLCJuYW1lIiwiZmllbGQiLCJmaWVsZElkIiwidG9QYXRoU2NoZW1hIiwicGF0aFNjaGVtYSIsIiRuYW1lIiwicmVwbGFjZSIsIl9fcmpzZl9hZGRpdGlvbmFsUHJvcGVydGllcyIsImVsZW1lbnQiLCJwcm9wZXJ0eSIsInBhcnNlRGF0ZVN0cmluZyIsImRhdGVTdHJpbmciLCJpbmNsdWRlVGltZSIsInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJ0b0RhdGVTdHJpbmciLCJ0aW1lIiwidXRjVGltZSIsIlVUQyIsInRvSlNPTiIsInV0Y1RvTG9jYWwiLCJqc29uRGF0ZSIsInl5eXkiLCJwYWQiLCJnZXRGdWxsWWVhciIsIk1NIiwiZ2V0TW9udGgiLCJkZCIsImdldERhdGUiLCJoaCIsImdldEhvdXJzIiwibW0iLCJnZXRNaW51dGVzIiwic3MiLCJnZXRTZWNvbmRzIiwiU1NTIiwiZ2V0TWlsbGlzZWNvbmRzIiwibG9jYWxUb1VUQyIsIm51bSIsInNpemUiLCJzIiwiZGF0YVVSSXRvQmxvYiIsImRhdGFVUkkiLCJzcGxpdHRlZCIsInNwbGl0IiwicGFyYW1zIiwicGFyYW0iLCJiaW5hcnkiLCJhdG9iIiwiY2hhckNvZGVBdCIsImJsb2IiLCJ3aW5kb3ciLCJCbG9iIiwiVWludDhBcnJheSIsInJhbmdlU3BlYyIsInNwZWMiLCJtdWx0aXBsZU9mIiwic3RlcCIsIm1pbmltdW0iLCJtaW4iLCJtYXhpbXVtIiwibWF4Iiwib3B0aW9uIiwicmVxdWlyZXNBbnlPZiIsImF1Z21lbnRlZFNjaGVtYSIsInNoYWxsb3dDbG9uZSIsInNjaGVtYVJlcXVpcmVzVHJ1ZVZhbHVlIiwic29tZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVPLElBQU1BLHdCQUF3QixHQUFHLHVCQUFqQzs7QUFFUCxJQUFNQyxTQUFTLEdBQUc7QUFDaEIsYUFBUztBQUNQQyxJQUFBQSxRQUFRLEVBQUUsZ0JBREg7QUFFUEMsSUFBQUEsS0FBSyxFQUFFLGFBRkE7QUFHUEMsSUFBQUEsTUFBTSxFQUFFLGNBSEQ7QUFJUEMsSUFBQUEsTUFBTSxFQUFFO0FBSkQsR0FETztBQU9oQkMsRUFBQUEsTUFBTSxFQUFFO0FBQ05DLElBQUFBLElBQUksRUFBRSxZQURBO0FBRU5DLElBQUFBLFFBQVEsRUFBRSxnQkFGSjtBQUdOQyxJQUFBQSxLQUFLLEVBQUUsYUFIRDtBQUlO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TUFBTSxRQUFOLENBQVlVLE1BQVosS0FBdUIsQ0FBdEMsSUFBMkNWLE1BQU0sUUFBTixDQUFZLENBQVosTUFBbUIsSUFBbEUsRUFBd0U7QUFDdEUsV0FBTyxJQUFQO0FBQ0QsR0FUNkMsQ0FXOUM7OztBQUNBLE1BQUlBLE1BQU0sQ0FBQ21FLEtBQVAsSUFBZ0JuRSxNQUFNLENBQUNtRSxLQUFQLENBQWF6RCxNQUFiLEtBQXdCLENBQTVDLEVBQStDO0FBQzdDLFdBQU80Uyx1QkFBdUIsQ0FBQ3RULE1BQU0sQ0FBQ21FLEtBQVAsQ0FBYSxDQUFiLENBQUQsQ0FBOUI7QUFDRCxHQWQ2QyxDQWdCOUM7OztBQUNBLE1BQUluRSxNQUFNLENBQUNpRSxLQUFQLElBQWdCakUsTUFBTSxDQUFDaUUsS0FBUCxDQUFhdkQsTUFBYixLQUF3QixDQUE1QyxFQUErQztBQUM3QyxXQUFPNFMsdUJBQXVCLENBQUN0VCxNQUFNLENBQUNpRSxLQUFQLENBQWEsQ0FBYixDQUFELENBQTlCO0FBQ0QsR0FuQjZDLENBcUI5QztBQUNBOzs7QUFDQSxNQUFJakUsTUFBTSxDQUFDbUssS0FBWCxFQUFrQjtBQUNoQixXQUFPbkssTUFBTSxDQUFDbUssS0FBUCxDQUFhb0osSUFBYixDQUFrQkQsdUJBQWxCLENBQVA7QUFDRDs7QUFFRCxTQUFPLEtBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0SXMgZnJvbSBcInJlYWN0LWlzXCI7XG5pbXBvcnQgbWVyZ2VBbGxPZiBmcm9tIFwianNvbi1zY2hlbWEtbWVyZ2UtYWxsb2ZcIjtcbmltcG9ydCBmaWxsIGZyb20gXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvYXJyYXkvZmlsbFwiO1xuaW1wb3J0IHVuaW9uIGZyb20gXCJsb2Rhc2gvdW5pb25cIjtcbmltcG9ydCBqc29ucG9pbnRlciBmcm9tIFwianNvbnBvaW50ZXJcIjtcbmltcG9ydCBmaWVsZHMgZnJvbSBcIi4vY29tcG9uZW50cy9maWVsZHNcIjtcbmltcG9ydCB3aWRnZXRzIGZyb20gXCIuL2NvbXBvbmVudHMvd2lkZ2V0c1wiO1xuaW1wb3J0IHZhbGlkYXRlRm9ybURhdGEsIHsgaXNWYWxpZCB9IGZyb20gXCIuL3ZhbGlkYXRlXCI7XG5cbmV4cG9ydCBjb25zdCBBRERJVElPTkFMX1BST1BFUlRZX0ZMQUcgPSBcIl9fYWRkaXRpb25hbF9wcm9wZXJ0eVwiO1xuXG5jb25zdCB3aWRnZXRNYXAgPSB7XG4gIGJvb2xlYW46IHtcbiAgICBjaGVja2JveDogXCJDaGVja2JveFdpZGdldFwiLFxuICAgIHJhZGlvOiBcIlJhZGlvV2lkZ2V0XCIsXG4gICAgc2VsZWN0OiBcIlNlbGVjdFdpZGdldFwiLFxuICAgIGhpZGRlbjogXCJIaWRkZW5XaWRnZXRcIixcbiAgfSxcbiAgc3RyaW5nOiB7XG4gICAgdGV4dDogXCJUZXh0V2lkZ2V0XCIsXG4gICAgcGFzc3dvcmQ6IFwiUGFzc3dvcmRXaWRnZXRcIixcbiAgICBlbWFpbDogXCJFbWFpbFdpZGdldFwiLFxuICAgIGhvc3RuYW1lOiBcIlRleHRXaWRnZXRcIixcbiAgICBpcHY0OiBcIlRleHRXaWRnZXRcIixcbiAgICBpcHY2OiBcIlRleHRXaWRnZXRcIixcbiAgICB1cmk6IFwiVVJMV2lkZ2V0XCIsXG4gICAgXCJkYXRhLXVybFwiOiBcIkZpbGVXaWRnZXRcIixcbiAgICByYWRpbzogXCJSYWRpb1dpZGdldFwiLFxuICAgIHNlbGVjdDogXCJTZWxlY3RXaWRnZXRcIixcbiAgICB0ZXh0YXJlYTogXCJUZXh0YXJlYVdpZGdldFwiLFxuICAgIGhpZGRlbjogXCJIaWRkZW5XaWRnZXRcIixcbiAgICBkYXRlOiBcIkRhdGVXaWRnZXRcIixcbiAgICBkYXRldGltZTogXCJEYXRlVGltZVdpZGdldFwiLFxuICAgIFwiZGF0ZS10aW1lXCI6IFwiRGF0ZVRpbWVXaWRnZXRcIixcbiAgICBcImFsdC1kYXRlXCI6IFwiQWx0RGF0ZVdpZGdldFwiLFxuICAgIFwiYWx0LWRhdGV0aW1lXCI6IFwiQWx0RGF0ZVRpbWVXaWRnZXRcIixcbiAgICBjb2xvcjogXCJDb2xvcldpZGdldFwiLFxuICAgIGZpbGU6IFwiRmlsZVdpZGdldFwiLFxuICB9LFxuICBudW1iZXI6IHtcbiAgICB0ZXh0OiBcIlRleHRXaWRnZXRcIixcbiAgICBzZWxlY3Q6IFwiU2VsZWN0V2lkZ2V0XCIsXG4gICAgdXBkb3duOiBcIlVwRG93bldpZGdldFwiLFxuICAgIHJhbmdlOiBcIlJhbmdlV2lkZ2V0XCIsXG4gICAgcmFkaW86IFwiUmFkaW9XaWRnZXRcIixcbiAgICBoaWRkZW46IFwiSGlkZGVuV2lkZ2V0XCIsXG4gIH0sXG4gIGludGVnZXI6IHtcbiAgICB0ZXh0OiBcIlRleHRXaWRnZXRcIixcbiAgICBzZWxlY3Q6IFwiU2VsZWN0V2lkZ2V0XCIsXG4gICAgdXBkb3duOiBcIlVwRG93bldpZGdldFwiLFxuICAgIHJhbmdlOiBcIlJhbmdlV2lkZ2V0XCIsXG4gICAgcmFkaW86IFwiUmFkaW9XaWRnZXRcIixcbiAgICBoaWRkZW46IFwiSGlkZGVuV2lkZ2V0XCIsXG4gIH0sXG4gIGFycmF5OiB7XG4gICAgc2VsZWN0OiBcIlNlbGVjdFdpZGdldFwiLFxuICAgIGNoZWNrYm94ZXM6IFwiQ2hlY2tib3hlc1dpZGdldFwiLFxuICAgIGZpbGVzOiBcIkZpbGVXaWRnZXRcIixcbiAgICBoaWRkZW46IFwiSGlkZGVuV2lkZ2V0XCIsXG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuRXhwYW5kKHNjaGVtYSwgdWlTY2hlbWEsIGZvcm1EYXRhKSB7XG4gIGlmICghc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgZXhwYW5kYWJsZSB9ID0gZ2V0VWlPcHRpb25zKHVpU2NoZW1hKTtcbiAgaWYgKGV4cGFuZGFibGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGFibGU7XG4gIH1cbiAgLy8gaWYgdWk6b3B0aW9ucy5leHBhbmRhYmxlIHdhcyBub3QgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UsIHdlIGNhbiBhZGRcbiAgLy8gYW5vdGhlciBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG5vdCBleGNlZWRlZCBtYXhQcm9wZXJ0aWVzIHlldFxuICBpZiAoc2NoZW1hLm1heFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhmb3JtRGF0YSkubGVuZ3RoIDwgc2NoZW1hLm1heFByb3BlcnRpZXM7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UmVnaXN0cnkoKSB7XG4gIHJldHVybiB7XG4gICAgZmllbGRzLFxuICAgIHdpZGdldHMsXG4gICAgZGVmaW5pdGlvbnM6IHt9LFxuICAgIHJvb3RTY2hlbWE6IHt9LFxuICAgIGZvcm1Db250ZXh0OiB7fSxcbiAgfTtcbn1cblxuLyogR2V0cyB0aGUgdHlwZSBvZiBhIGdpdmVuIHNjaGVtYS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFUeXBlKHNjaGVtYSkge1xuICBsZXQgeyB0eXBlIH0gPSBzY2hlbWE7XG5cbiAgaWYgKCF0eXBlICYmIHNjaGVtYS5jb25zdCkge1xuICAgIHJldHVybiBndWVzc1R5cGUoc2NoZW1hLmNvbnN0KTtcbiAgfVxuXG4gIGlmICghdHlwZSAmJiBzY2hlbWEuZW51bSkge1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG5cbiAgaWYgKCF0eXBlICYmIChzY2hlbWEucHJvcGVydGllcyB8fCBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH1cblxuICBpZiAodHlwZSBpbnN0YW5jZW9mIEFycmF5ICYmIHR5cGUubGVuZ3RoID09PSAyICYmIHR5cGUuaW5jbHVkZXMoXCJudWxsXCIpKSB7XG4gICAgcmV0dXJuIHR5cGUuZmluZCh0eXBlID0+IHR5cGUgIT09IFwibnVsbFwiKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2lkZ2V0KHNjaGVtYSwgd2lkZ2V0LCByZWdpc3RlcmVkV2lkZ2V0cyA9IHt9KSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYSk7XG5cbiAgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKFdpZGdldCkge1xuICAgIC8vIGNhY2hlIHJldHVybiB2YWx1ZSBhcyBwcm9wZXJ0eSBvZiB3aWRnZXQgZm9yIHByb3BlciByZWFjdCByZWNvbmNpbGlhdGlvblxuICAgIGlmICghV2lkZ2V0Lk1lcmdlZFdpZGdldCkge1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPVxuICAgICAgICAoV2lkZ2V0LmRlZmF1bHRQcm9wcyAmJiBXaWRnZXQuZGVmYXVsdFByb3BzLm9wdGlvbnMpIHx8IHt9O1xuICAgICAgV2lkZ2V0Lk1lcmdlZFdpZGdldCA9ICh7IG9wdGlvbnMgPSB7fSwgLi4ucHJvcHMgfSkgPT4gKFxuICAgICAgICA8V2lkZ2V0IG9wdGlvbnM9e3sgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfX0gey4uLnByb3BzfSAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFdpZGdldC5NZXJnZWRXaWRnZXQ7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHdpZGdldCA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgUmVhY3RJcy5pc0ZvcndhcmRSZWYoUmVhY3QuY3JlYXRlRWxlbWVudCh3aWRnZXQpKSB8fFxuICAgIFJlYWN0SXMuaXNNZW1vKHdpZGdldClcbiAgKSB7XG4gICAgcmV0dXJuIG1lcmdlT3B0aW9ucyh3aWRnZXQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB3aWRnZXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHdpZGdldCBkZWZpbml0aW9uOiAke3R5cGVvZiB3aWRnZXR9YCk7XG4gIH1cblxuICBpZiAocmVnaXN0ZXJlZFdpZGdldHMuaGFzT3duUHJvcGVydHkod2lkZ2V0KSkge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRXaWRnZXQgPSByZWdpc3RlcmVkV2lkZ2V0c1t3aWRnZXRdO1xuICAgIHJldHVybiBnZXRXaWRnZXQoc2NoZW1hLCByZWdpc3RlcmVkV2lkZ2V0LCByZWdpc3RlcmVkV2lkZ2V0cyk7XG4gIH1cblxuICBpZiAoIXdpZGdldE1hcC5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gd2lkZ2V0IGZvciB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gIH1cblxuICBpZiAod2lkZ2V0TWFwW3R5cGVdLmhhc093blByb3BlcnR5KHdpZGdldCkpIHtcbiAgICBjb25zdCByZWdpc3RlcmVkV2lkZ2V0ID0gcmVnaXN0ZXJlZFdpZGdldHNbd2lkZ2V0TWFwW3R5cGVdW3dpZGdldF1dO1xuICAgIHJldHVybiBnZXRXaWRnZXQoc2NoZW1hLCByZWdpc3RlcmVkV2lkZ2V0LCByZWdpc3RlcmVkV2lkZ2V0cyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIHdpZGdldCBcIiR7d2lkZ2V0fVwiIGZvciB0eXBlIFwiJHt0eXBlfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNXaWRnZXQoc2NoZW1hLCB3aWRnZXQsIHJlZ2lzdGVyZWRXaWRnZXRzID0ge30pIHtcbiAgdHJ5IHtcbiAgICBnZXRXaWRnZXQoc2NoZW1hLCB3aWRnZXQsIHJlZ2lzdGVyZWRXaWRnZXRzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChcbiAgICAgIGUubWVzc2FnZSAmJlxuICAgICAgKGUubWVzc2FnZS5zdGFydHNXaXRoKFwiTm8gd2lkZ2V0XCIpIHx8XG4gICAgICAgIGUubWVzc2FnZS5zdGFydHNXaXRoKFwiVW5zdXBwb3J0ZWQgd2lkZ2V0XCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEZWZhdWx0cyhcbiAgX3NjaGVtYSxcbiAgcGFyZW50RGVmYXVsdHMsXG4gIHJvb3RTY2hlbWEsXG4gIHJhd0Zvcm1EYXRhID0ge30sXG4gIGluY2x1ZGVVbmRlZmluZWRWYWx1ZXMgPSBmYWxzZVxuKSB7XG4gIGxldCBzY2hlbWEgPSBpc09iamVjdChfc2NoZW1hKSA/IF9zY2hlbWEgOiB7fTtcbiAgY29uc3QgZm9ybURhdGEgPSBpc09iamVjdChyYXdGb3JtRGF0YSkgPyByYXdGb3JtRGF0YSA6IHt9O1xuICAvLyBDb21wdXRlIHRoZSBkZWZhdWx0cyByZWN1cnNpdmVseTogZ2l2ZSBoaWdoZXN0IHByaW9yaXR5IHRvIGRlZXBlc3Qgbm9kZXMuXG4gIGxldCBkZWZhdWx0cyA9IHBhcmVudERlZmF1bHRzO1xuICBpZiAoaXNPYmplY3QoZGVmYXVsdHMpICYmIGlzT2JqZWN0KHNjaGVtYS5kZWZhdWx0KSkge1xuICAgIC8vIEZvciBvYmplY3QgZGVmYXVsdHMsIG9ubHkgb3ZlcnJpZGUgcGFyZW50IGRlZmF1bHRzIHRoYXQgYXJlIGRlZmluZWQgaW5cbiAgICAvLyBzY2hlbWEuZGVmYXVsdC5cbiAgICBkZWZhdWx0cyA9IG1lcmdlT2JqZWN0cyhkZWZhdWx0cywgc2NoZW1hLmRlZmF1bHQpO1xuICB9IGVsc2UgaWYgKFwiZGVmYXVsdFwiIGluIHNjaGVtYSkge1xuICAgIC8vIFVzZSBzY2hlbWEgZGVmYXVsdHMgZm9yIHRoaXMgbm9kZS5cbiAgICBkZWZhdWx0cyA9IHNjaGVtYS5kZWZhdWx0O1xuICB9IGVsc2UgaWYgKFwiJHJlZlwiIGluIHNjaGVtYSkge1xuICAgIC8vIFVzZSByZWZlcmVuY2VkIHNjaGVtYSBkZWZhdWx0cyBmb3IgdGhpcyBub2RlLlxuICAgIGNvbnN0IHJlZlNjaGVtYSA9IGZpbmRTY2hlbWFEZWZpbml0aW9uKHNjaGVtYS4kcmVmLCByb290U2NoZW1hKTtcbiAgICByZXR1cm4gY29tcHV0ZURlZmF1bHRzKFxuICAgICAgcmVmU2NoZW1hLFxuICAgICAgZGVmYXVsdHMsXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBpbmNsdWRlVW5kZWZpbmVkVmFsdWVzXG4gICAgKTtcbiAgfSBlbHNlIGlmIChcImRlcGVuZGVuY2llc1wiIGluIHNjaGVtYSkge1xuICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gcmVzb2x2ZURlcGVuZGVuY2llcyhzY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICByZXR1cm4gY29tcHV0ZURlZmF1bHRzKFxuICAgICAgcmVzb2x2ZWRTY2hlbWEsXG4gICAgICBkZWZhdWx0cyxcbiAgICAgIHJvb3RTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGluY2x1ZGVVbmRlZmluZWRWYWx1ZXNcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzRml4ZWRJdGVtcyhzY2hlbWEpKSB7XG4gICAgZGVmYXVsdHMgPSBzY2hlbWEuaXRlbXMubWFwKChpdGVtU2NoZW1hLCBpZHgpID0+XG4gICAgICBjb21wdXRlRGVmYXVsdHMoXG4gICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyZW50RGVmYXVsdHMpID8gcGFyZW50RGVmYXVsdHNbaWR4XSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9vdFNjaGVtYSxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIGluY2x1ZGVVbmRlZmluZWRWYWx1ZXNcbiAgICAgIClcbiAgICApO1xuICB9IGVsc2UgaWYgKFwib25lT2ZcIiBpbiBzY2hlbWEpIHtcbiAgICBzY2hlbWEgPVxuICAgICAgc2NoZW1hLm9uZU9mW2dldE1hdGNoaW5nT3B0aW9uKHVuZGVmaW5lZCwgc2NoZW1hLm9uZU9mLCByb290U2NoZW1hKV07XG4gIH0gZWxzZSBpZiAoXCJhbnlPZlwiIGluIHNjaGVtYSkge1xuICAgIHNjaGVtYSA9XG4gICAgICBzY2hlbWEuYW55T2ZbZ2V0TWF0Y2hpbmdPcHRpb24odW5kZWZpbmVkLCBzY2hlbWEuYW55T2YsIHJvb3RTY2hlbWEpXTtcbiAgfVxuXG4gIC8vIE5vdCBkZWZhdWx0cyBkZWZpbmVkIGZvciB0aGlzIG5vZGUsIGZhbGxiYWNrIHRvIGdlbmVyaWMgdHlwZWQgb25lcy5cbiAgaWYgKHR5cGVvZiBkZWZhdWx0cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGRlZmF1bHRzID0gc2NoZW1hLmRlZmF1bHQ7XG4gIH1cblxuICBzd2l0Y2ggKGdldFNjaGVtYVR5cGUoc2NoZW1hKSkge1xuICAgIC8vIFdlIG5lZWQgdG8gcmVjdXIgZm9yIG9iamVjdCBzY2hlbWEgaW5uZXIgZGVmYXVsdCB2YWx1ZXMuXG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9KS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGRlZmF1bHRzIGZvciB0aGlzIG5vZGUsIHdpdGggdGhlIHBhcmVudCBkZWZhdWx0cyB3ZSBtaWdodFxuICAgICAgICAvLyBoYXZlIGZyb20gYSBwcmV2aW91cyBydW46IGRlZmF1bHRzW2tleV0uXG4gICAgICAgIGxldCBjb21wdXRlZERlZmF1bHQgPSBjb21wdXRlRGVmYXVsdHMoXG4gICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXNba2V5XSxcbiAgICAgICAgICAoZGVmYXVsdHMgfHwge30pW2tleV0sXG4gICAgICAgICAgcm9vdFNjaGVtYSxcbiAgICAgICAgICAoZm9ybURhdGEgfHwge30pW2tleV0sXG4gICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZFZhbHVlc1xuICAgICAgICApO1xuICAgICAgICBpZiAoaW5jbHVkZVVuZGVmaW5lZFZhbHVlcyB8fCBjb21wdXRlZERlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjY1trZXldID0gY29tcHV0ZWREZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG5cbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIC8vIEluamVjdCBkZWZhdWx0cyBpbnRvIGV4aXN0aW5nIGFycmF5IGRlZmF1bHRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZhdWx0cykpIHtcbiAgICAgICAgZGVmYXVsdHMgPSBkZWZhdWx0cy5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21wdXRlRGVmYXVsdHMoXG4gICAgICAgICAgICBzY2hlbWEuaXRlbXNbaWR4XSB8fCBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zIHx8IHt9LFxuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIHJvb3RTY2hlbWFcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVlcGx5IGluamVjdCBkZWZhdWx0cyBpbnRvIGFscmVhZHkgZXhpc3RpbmcgZm9ybSBkYXRhXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdGb3JtRGF0YSkpIHtcbiAgICAgICAgZGVmYXVsdHMgPSByYXdGb3JtRGF0YS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21wdXRlRGVmYXVsdHMoXG4gICAgICAgICAgICBzY2hlbWEuaXRlbXMsXG4gICAgICAgICAgICAoZGVmYXVsdHMgfHwge30pW2lkeF0sXG4gICAgICAgICAgICByb290U2NoZW1hLFxuICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgICBpZiAoIWlzTXVsdGlTZWxlY3Qoc2NoZW1hLCByb290U2NoZW1hKSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRzTGVuZ3RoID0gZGVmYXVsdHMgPyBkZWZhdWx0cy5sZW5ndGggOiAwO1xuICAgICAgICAgIGlmIChzY2hlbWEubWluSXRlbXMgPiBkZWZhdWx0c0xlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEVudHJpZXMgPSBkZWZhdWx0cyB8fCBbXTtcbiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBhcnJheSB3aXRoIHRoZSBkZWZhdWx0c1xuICAgICAgICAgICAgY29uc3QgZmlsbGVyU2NoZW1hID0gQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpXG4gICAgICAgICAgICAgID8gc2NoZW1hLmFkZGl0aW9uYWxJdGVtc1xuICAgICAgICAgICAgICA6IHNjaGVtYS5pdGVtcztcbiAgICAgICAgICAgIGNvbnN0IGZpbGxlckVudHJpZXMgPSBmaWxsKFxuICAgICAgICAgICAgICBuZXcgQXJyYXkoc2NoZW1hLm1pbkl0ZW1zIC0gZGVmYXVsdHNMZW5ndGgpLFxuICAgICAgICAgICAgICBjb21wdXRlRGVmYXVsdHMoZmlsbGVyU2NoZW1hLCBmaWxsZXJTY2hlbWEuZGVmYXVsdHMsIHJvb3RTY2hlbWEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdGhlbiBmaWxsIHVwIHRoZSByZXN0IHdpdGggZWl0aGVyIHRoZSBpdGVtIGRlZmF1bHQgb3IgZW1wdHksIHVwIHRvIG1pbkl0ZW1zXG5cbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RW50cmllcy5jb25jYXQoZmlsbGVyRW50cmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0cyA/IGRlZmF1bHRzIDogW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0Rm9ybVN0YXRlKFxuICBfc2NoZW1hLFxuICBmb3JtRGF0YSxcbiAgcm9vdFNjaGVtYSA9IHt9LFxuICBpbmNsdWRlVW5kZWZpbmVkVmFsdWVzID0gZmFsc2Vcbikge1xuICBpZiAoIWlzT2JqZWN0KF9zY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzY2hlbWE6IFwiICsgX3NjaGVtYSk7XG4gIH1cbiAgY29uc3Qgc2NoZW1hID0gcmV0cmlldmVTY2hlbWEoX3NjaGVtYSwgcm9vdFNjaGVtYSwgZm9ybURhdGEpO1xuICBjb25zdCBkZWZhdWx0cyA9IGNvbXB1dGVEZWZhdWx0cyhcbiAgICBzY2hlbWEsXG4gICAgX3NjaGVtYS5kZWZhdWx0LFxuICAgIHJvb3RTY2hlbWEsXG4gICAgZm9ybURhdGEsXG4gICAgaW5jbHVkZVVuZGVmaW5lZFZhbHVlc1xuICApO1xuICBpZiAodHlwZW9mIGZvcm1EYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgLy8gTm8gZm9ybSBkYXRhPyBVc2Ugc2NoZW1hIGRlZmF1bHRzLlxuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuICBpZiAoaXNPYmplY3QoZm9ybURhdGEpIHx8IEFycmF5LmlzQXJyYXkoZm9ybURhdGEpKSB7XG4gICAgcmV0dXJuIG1lcmdlRGVmYXVsdHNXaXRoRm9ybURhdGEoZGVmYXVsdHMsIGZvcm1EYXRhKTtcbiAgfVxuICBpZiAoZm9ybURhdGEgPT09IDAgfHwgZm9ybURhdGEgPT09IGZhbHNlIHx8IGZvcm1EYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xuICB9XG4gIHJldHVybiBmb3JtRGF0YSB8fCBkZWZhdWx0cztcbn1cblxuLyoqXG4gKiBXaGVuIG1lcmdpbmcgZGVmYXVsdHMgYW5kIGZvcm0gZGF0YSwgd2Ugd2FudCB0byBtZXJnZSBpbiB0aGlzIHNwZWNpZmljIHdheTpcbiAqIC0gb2JqZWN0cyBhcmUgZGVlcGx5IG1lcmdlZFxuICogLSBhcnJheXMgYXJlIG1lcmdlZCBpbiBzdWNoIGEgd2F5IHRoYXQ6XG4gKiAgIC0gd2hlbiB0aGUgYXJyYXkgaXMgc2V0IGluIGZvcm0gZGF0YSwgb25seSBhcnJheSBlbnRyaWVzIHNldCBpbiBmb3JtIGRhdGFcbiAqICAgICBhcmUgZGVlcGx5IG1lcmdlZDsgYWRkaXRpb25hbCBlbnRyaWVzIGZyb20gdGhlIGRlZmF1bHRzIGFyZSBpZ25vcmVkXG4gKiAgIC0gd2hlbiB0aGUgYXJyYXkgaXMgbm90IHNldCBpbiBmb3JtIGRhdGEsIHRoZSBkZWZhdWx0IGlzIGNvcGllZCBvdmVyXG4gKiAtIHNjYWxhcnMgYXJlIG92ZXJ3cml0dGVuL3NldCBieSBmb3JtIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVmYXVsdHNXaXRoRm9ybURhdGEoZGVmYXVsdHMsIGZvcm1EYXRhKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGZvcm1EYXRhKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkZWZhdWx0cykpIHtcbiAgICAgIGRlZmF1bHRzID0gW107XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YS5tYXAoKHZhbHVlLCBpZHgpID0+IHtcbiAgICAgIGlmIChkZWZhdWx0c1tpZHhdKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURlZmF1bHRzV2l0aEZvcm1EYXRhKGRlZmF1bHRzW2lkeF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChmb3JtRGF0YSkpIHtcbiAgICBjb25zdCBhY2MgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7IC8vIFByZXZlbnQgbXV0YXRpb24gb2Ygc291cmNlIG9iamVjdC5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybURhdGEpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gbWVyZ2VEZWZhdWx0c1dpdGhGb3JtRGF0YShcbiAgICAgICAgZGVmYXVsdHMgPyBkZWZhdWx0c1trZXldIDoge30sXG4gICAgICAgIGZvcm1EYXRhW2tleV1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIGFjYyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVaU9wdGlvbnModWlTY2hlbWEpIHtcbiAgLy8gZ2V0IGFsbCBwYXNzZWQgb3B0aW9ucyBmcm9tIHVpOndpZGdldCwgdWk6b3B0aW9ucywgYW5kIHVpOjxvcHRpb25OYW1lPlxuICByZXR1cm4gT2JqZWN0LmtleXModWlTY2hlbWEpXG4gICAgLmZpbHRlcihrZXkgPT4ga2V5LmluZGV4T2YoXCJ1aTpcIikgPT09IDApXG4gICAgLnJlZHVjZSgob3B0aW9ucywga2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHVpU2NoZW1hW2tleV07XG4gICAgICBpZiAoa2V5ID09PSBcInVpOndpZGdldFwiICYmIGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJTZXR0aW5nIG9wdGlvbnMgdmlhIHVpOndpZGdldCBvYmplY3QgaXMgZGVwcmVjYXRlZCwgdXNlIHVpOm9wdGlvbnMgaW5zdGVhZFwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAuLi4odmFsdWUub3B0aW9ucyB8fCB7fSksXG4gICAgICAgICAgd2lkZ2V0OiB2YWx1ZS5jb21wb25lbnQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcInVpOm9wdGlvbnNcIiAmJiBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub3B0aW9ucywgLi4udmFsdWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLm9wdGlvbnMsIFtrZXkuc3Vic3RyaW5nKDMpXTogdmFsdWUgfTtcbiAgICB9LCB7fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJtaXRCdXR0b25PcHRpb25zKHVpU2NoZW1hKSB7XG4gIGNvbnN0IHVpT3B0aW9ucyA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgICBzdWJtaXRUZXh0OiBcIlN1Ym1pdFwiLFxuICAgIG5vcmVuZGVyOiBmYWxzZSxcbiAgfTtcbiAgaWYgKHVpT3B0aW9ucyAmJiB1aU9wdGlvbnNbXCJzdWJtaXRCdXR0b25PcHRpb25zXCJdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCB1aU9wdGlvbnNbXCJzdWJtaXRCdXR0b25PcHRpb25zXCJdKTtcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlMYWJlbChzY2hlbWEsIHVpU2NoZW1hLCByb290U2NoZW1hKSB7XG4gIGNvbnN0IHVpT3B0aW9ucyA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gIGxldCB7IGxhYmVsOiBkaXNwbGF5TGFiZWwgPSB0cnVlIH0gPSB1aU9wdGlvbnM7XG4gIGNvbnN0IHNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYSk7XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGRpc3BsYXlMYWJlbCA9XG4gICAgICBpc011bHRpU2VsZWN0KHNjaGVtYSwgcm9vdFNjaGVtYSkgfHxcbiAgICAgIGlzRmlsZXNBcnJheShzY2hlbWEsIHVpU2NoZW1hLCByb290U2NoZW1hKSB8fFxuICAgICAgaXNDdXN0b21XaWRnZXQodWlTY2hlbWEpO1xuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBkaXNwbGF5TGFiZWwgPSBmYWxzZTtcbiAgfVxuICBpZiAoc2NoZW1hVHlwZSA9PT0gXCJib29sZWFuXCIgJiYgIXVpU2NoZW1hW1widWk6d2lkZ2V0XCJdKSB7XG4gICAgZGlzcGxheUxhYmVsID0gZmFsc2U7XG4gIH1cbiAgaWYgKHVpU2NoZW1hW1widWk6ZmllbGRcIl0pIHtcbiAgICBkaXNwbGF5TGFiZWwgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gZGlzcGxheUxhYmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcbiAgaWYgKHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaW5nIGluc3RhbmNlb2YgRmlsZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHRoaW5nICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHRoaW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyLCBjb25jYXRBcnJheXMgPSBmYWxzZSkge1xuICAvLyBSZWN1cnNpdmVseSBtZXJnZSBkZWVwbHkgbmVzdGVkIG9iamVjdHMuXG4gIHZhciBhY2MgPSBPYmplY3QuYXNzaWduKHt9LCBvYmoxKTsgLy8gUHJldmVudCBtdXRhdGlvbiBvZiBzb3VyY2Ugb2JqZWN0LlxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqMikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGxlZnQgPSBvYmoxID8gb2JqMVtrZXldIDoge30sXG4gICAgICByaWdodCA9IG9iajJba2V5XTtcbiAgICBpZiAob2JqMSAmJiBvYmoxLmhhc093blByb3BlcnR5KGtleSkgJiYgaXNPYmplY3QocmlnaHQpKSB7XG4gICAgICBhY2Nba2V5XSA9IG1lcmdlT2JqZWN0cyhsZWZ0LCByaWdodCwgY29uY2F0QXJyYXlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbmNhdEFycmF5cyAmJiBBcnJheS5pc0FycmF5KGxlZnQpICYmIEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgICBhY2Nba2V5XSA9IGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2tleV0gPSByaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgYWNjKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKC9cXC4kLy50ZXN0KHZhbHVlKSkge1xuICAgIC8vIFwiMy5cIiBjYW4ndCByZWFsbHkgYmUgY29uc2lkZXJlZCBhIG51bWJlciBldmVuIGlmIGl0IHBhcnNlcyBpbiBqcy4gVGhlXG4gICAgLy8gdXNlciBpcyBtb3N0IGxpa2VseSBlbnRlcmluZyBhIGZsb2F0LlxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoL1xcLjAkLy50ZXN0KHZhbHVlKSkge1xuICAgIC8vIHdlIG5lZWQgdG8gcmV0dXJuIHRoaXMgYXMgYSBzdHJpbmcgaGVyZSwgdG8gYWxsb3cgZm9yIGlucHV0IGxpa2UgMy4wN1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBjb25zdCBuID0gTnVtYmVyKHZhbHVlKTtcbiAgY29uc3QgdmFsaWQgPSB0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiAhTnVtYmVyLmlzTmFOKG4pO1xuXG4gIGlmICgvXFwuXFxkKjAkLy50ZXN0KHZhbHVlKSkge1xuICAgIC8vIEl0J3MgYSBudW1iZXIsIHRoYXQncyBjb29sIC0gYnV0IHdlIG5lZWQgaXQgYXMgYSBzdHJpbmcgc28gaXQgZG9lc24ndCBzY3Jld1xuICAgIC8vIHdpdGggdGhlIHVzZXIgd2hlbiBlbnRlcmluZyBkb2xsYXIgYW1vdW50cyBvciBvdGhlciB2YWx1ZXMgKHN1Y2ggYXMgdGhvc2Ugd2l0aFxuICAgIC8vIHNwZWNpZmljIHByZWNpc2lvbiBvciBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZCA/IG4gOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9yZGVyUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBvcmRlcikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXIpKSB7XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cblxuICBjb25zdCBhcnJheVRvSGFzaCA9IGFyciA9PlxuICAgIGFyci5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgIHByZXZbY3Vycl0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwge30pO1xuICBjb25zdCBlcnJvclByb3BMaXN0ID0gYXJyID0+XG4gICAgYXJyLmxlbmd0aCA+IDFcbiAgICAgID8gYHByb3BlcnRpZXMgJyR7YXJyLmpvaW4oXCInLCAnXCIpfSdgXG4gICAgICA6IGBwcm9wZXJ0eSAnJHthcnJbMF19J2A7XG4gIGNvbnN0IHByb3BlcnR5SGFzaCA9IGFycmF5VG9IYXNoKHByb3BlcnRpZXMpO1xuICBjb25zdCBvcmRlckZpbHRlcmVkID0gb3JkZXIuZmlsdGVyKFxuICAgIHByb3AgPT4gcHJvcCA9PT0gXCIqXCIgfHwgcHJvcGVydHlIYXNoW3Byb3BdXG4gICk7XG4gIGNvbnN0IG9yZGVySGFzaCA9IGFycmF5VG9IYXNoKG9yZGVyRmlsdGVyZWQpO1xuXG4gIGNvbnN0IHJlc3QgPSBwcm9wZXJ0aWVzLmZpbHRlcihwcm9wID0+ICFvcmRlckhhc2hbcHJvcF0pO1xuICBjb25zdCByZXN0SW5kZXggPSBvcmRlckZpbHRlcmVkLmluZGV4T2YoXCIqXCIpO1xuICBpZiAocmVzdEluZGV4ID09PSAtMSkge1xuICAgIGlmIChyZXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdWlTY2hlbWEgb3JkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluICR7ZXJyb3JQcm9wTGlzdChyZXN0KX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJGaWx0ZXJlZDtcbiAgfVxuICBpZiAocmVzdEluZGV4ICE9PSBvcmRlckZpbHRlcmVkLmxhc3RJbmRleE9mKFwiKlwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVpU2NoZW1hIG9yZGVyIGxpc3QgY29udGFpbnMgbW9yZSB0aGFuIG9uZSB3aWxkY2FyZCBpdGVtXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGxldGUgPSBbLi4ub3JkZXJGaWx0ZXJlZF07XG4gIGNvbXBsZXRlLnNwbGljZShyZXN0SW5kZXgsIDEsIC4uLnJlc3QpO1xuICByZXR1cm4gY29tcGxldGU7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGdpdmVuIHNjaGVtYSBtYXRjaGVzIGEgc2luZ2xlXG4gKiBjb25zdGFudCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RhbnQoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pICYmIHNjaGVtYS5lbnVtLmxlbmd0aCA9PT0gMSkgfHxcbiAgICBzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJjb25zdFwiKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Db25zdGFudChzY2hlbWEpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pICYmIHNjaGVtYS5lbnVtLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bVswXTtcbiAgfSBlbHNlIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJjb25zdFwiKSkge1xuICAgIHJldHVybiBzY2hlbWEuY29uc3Q7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2NoZW1hIGNhbm5vdCBiZSBpbmZlcnJlZCBhcyBhIGNvbnN0YW50XCIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGVjdChfc2NoZW1hLCByb290U2NoZW1hID0ge30pIHtcbiAgY29uc3Qgc2NoZW1hID0gcmV0cmlldmVTY2hlbWEoX3NjaGVtYSwgcm9vdFNjaGVtYSk7XG4gIGNvbnN0IGFsdFNjaGVtYXMgPSBzY2hlbWEub25lT2YgfHwgc2NoZW1hLmFueU9mO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFsdFNjaGVtYXMpKSB7XG4gICAgcmV0dXJuIGFsdFNjaGVtYXMuZXZlcnkoYWx0U2NoZW1hcyA9PiBpc0NvbnN0YW50KGFsdFNjaGVtYXMpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpU2VsZWN0KHNjaGVtYSwgcm9vdFNjaGVtYSA9IHt9KSB7XG4gIGlmICghc2NoZW1hLnVuaXF1ZUl0ZW1zIHx8ICFzY2hlbWEuaXRlbXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzU2VsZWN0KHNjaGVtYS5pdGVtcywgcm9vdFNjaGVtYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGVzQXJyYXkoc2NoZW1hLCB1aVNjaGVtYSwgcm9vdFNjaGVtYSA9IHt9KSB7XG4gIGlmICh1aVNjaGVtYVtcInVpOndpZGdldFwiXSA9PT0gXCJmaWxlc1wiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoc2NoZW1hLml0ZW1zKSB7XG4gICAgY29uc3QgaXRlbXNTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEuaXRlbXMsIHJvb3RTY2hlbWEpO1xuICAgIHJldHVybiBpdGVtc1NjaGVtYS50eXBlID09PSBcInN0cmluZ1wiICYmIGl0ZW1zU2NoZW1hLmZvcm1hdCA9PT0gXCJkYXRhLXVybFwiO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRml4ZWRJdGVtcyhzY2hlbWEpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykgJiZcbiAgICBzY2hlbWEuaXRlbXMubGVuZ3RoID4gMCAmJlxuICAgIHNjaGVtYS5pdGVtcy5ldmVyeShpdGVtID0+IGlzT2JqZWN0KGl0ZW0pKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21XaWRnZXQodWlTY2hlbWEpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGAmJiB1aVNjaGVtYVtcInVpOndpZGdldFwiXSAhPT0gXCJoaWRkZW5cImAgb25jZSB3ZSBzdXBwb3J0IGhpZGRlbiB3aWRnZXRzIGZvciBhcnJheXMuXG4gICAgLy8gaHR0cHM6Ly9yZWFjdC1qc29uc2NoZW1hLWZvcm0ucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3VzYWdlL3dpZGdldHMvI2hpZGRlbi13aWRnZXRzXG4gICAgXCJ3aWRnZXRcIiBpbiBnZXRVaU9wdGlvbnModWlTY2hlbWEpICYmXG4gICAgZ2V0VWlPcHRpb25zKHVpU2NoZW1hKVtcIndpZGdldFwiXSAhPT0gXCJoaWRkZW5cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dBZGRpdGlvbmFsSXRlbXMoc2NoZW1hKSB7XG4gIGlmIChzY2hlbWEuYWRkaXRpb25hbEl0ZW1zID09PSB0cnVlKSB7XG4gICAgY29uc29sZS53YXJuKFwiYWRkaXRpb25hbEl0ZW1zPXRydWUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uc0xpc3Qoc2NoZW1hKSB7XG4gIGlmIChzY2hlbWEuZW51bSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlLCBpKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IChzY2hlbWEuZW51bU5hbWVzICYmIHNjaGVtYS5lbnVtTmFtZXNbaV0pIHx8IFN0cmluZyh2YWx1ZSk7XG4gICAgICByZXR1cm4geyBsYWJlbCwgdmFsdWUgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhbHRTY2hlbWFzID0gc2NoZW1hLm9uZU9mIHx8IHNjaGVtYS5hbnlPZjtcbiAgICByZXR1cm4gYWx0U2NoZW1hcy5tYXAoc2NoZW1hID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdG9Db25zdGFudChzY2hlbWEpO1xuICAgICAgY29uc3QgbGFiZWwgPSBzY2hlbWEudGl0bGUgfHwgU3RyaW5nKHZhbHVlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNjaGVtYURlZmluaXRpb24oJHJlZiwgcm9vdFNjaGVtYSA9IHt9KSB7XG4gIGNvbnN0IG9yaWdSZWYgPSAkcmVmO1xuICBpZiAoJHJlZi5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgIC8vIERlY29kZSBVUkkgZnJhZ21lbnQgcmVwcmVzZW50YXRpb24uXG4gICAgJHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudCgkcmVmLnN1YnN0cmluZygxKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGRlZmluaXRpb24gZm9yICR7b3JpZ1JlZn0uYCk7XG4gIH1cbiAgY29uc3QgY3VycmVudCA9IGpzb25wb2ludGVyLmdldChyb290U2NoZW1hLCAkcmVmKTtcbiAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBkZWZpbml0aW9uIGZvciAke29yaWdSZWZ9LmApO1xuICB9XG4gIGlmIChjdXJyZW50Lmhhc093blByb3BlcnR5KFwiJHJlZlwiKSkge1xuICAgIHJldHVybiBmaW5kU2NoZW1hRGVmaW5pdGlvbihjdXJyZW50LiRyZWYsIHJvb3RTY2hlbWEpO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGltcGxpY2l0bHkgY3JlYXRlIGEgc2NoZW1hLCBpdCBpcyB1c2VmdWwgdG8ga25vdyB3aGF0IHR5cGUgdG8gdXNlXG4vLyAgYmFzZWQgb24gdGhlIGRhdGEgd2UgYXJlIGRlZmluaW5nXG5leHBvcnQgY29uc3QgZ3Vlc3NUeXBlID0gZnVuY3Rpb24gZ3Vlc3NUeXBlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBcImFycmF5XCI7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfVxuICAvLyBEZWZhdWx0IHRvIHN0cmluZyBpZiB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0XG4gIHJldHVybiBcInN0cmluZ1wiO1xufTtcblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBuZXcgXCJwcm9wZXJ0aWVzXCIgaXRlbXMgZm9yIGVhY2gga2V5IGluIG91ciBmb3JtRGF0YVxuZXhwb3J0IGZ1bmN0aW9uIHN0dWJFeGlzdGluZ0FkZGl0aW9uYWxQcm9wZXJ0aWVzKFxuICBzY2hlbWEsXG4gIHJvb3RTY2hlbWEgPSB7fSxcbiAgZm9ybURhdGEgPSB7fVxuKSB7XG4gIC8vIENsb25lIHRoZSBzY2hlbWEgc28gd2UgZG9uJ3QgcnVpbiB0aGUgY29uc3VtZXIncyBvcmlnaW5hbFxuICBzY2hlbWEgPSB7XG4gICAgLi4uc2NoZW1hLFxuICAgIHByb3BlcnRpZXM6IHsgLi4uc2NoZW1hLnByb3BlcnRpZXMgfSxcbiAgfTtcblxuICAvLyBtYWtlIHN1cmUgZm9ybURhdGEgaXMgYW4gb2JqZWN0XG4gIGZvcm1EYXRhID0gaXNPYmplY3QoZm9ybURhdGEpID8gZm9ybURhdGEgOiB7fTtcblxuICBPYmplY3Qua2V5cyhmb3JtRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmIChzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHN0dWIsIG91ciBzY2hlbWEgYWxyZWFkeSBoYXMgdGhlIHByb3BlcnR5XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoXCIkcmVmXCIpKSB7XG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IHJldHJpZXZlU2NoZW1hKFxuICAgICAgICB7ICRyZWY6IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllc1tcIiRyZWZcIl0gfSxcbiAgICAgICAgcm9vdFNjaGVtYSxcbiAgICAgICAgZm9ybURhdGFcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IHsgLi4uc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0geyB0eXBlOiBndWVzc1R5cGUoZm9ybURhdGFba2V5XSkgfTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdHlwZSBvZiBvdXIgbmV3IGtleSBzaG91bGQgbWF0Y2ggdGhlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHZhbHVlO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPSBhZGRpdGlvbmFsUHJvcGVydGllcztcbiAgICAvLyBTZXQgb3VyIGFkZGl0aW9uYWwgcHJvcGVydHkgZmxhZyBzbyB3ZSBrbm93IGl0IHdhcyBkeW5hbWljYWxseSBhZGRlZFxuICAgIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV1bQURESVRJT05BTF9QUk9QRVJUWV9GTEFHXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBjb25kaXRpb25hbCBibG9jayAoaWYvZWxzZS90aGVuKSBieSByZW1vdmluZyB0aGUgY29uZGl0aW9uIGFuZCBtZXJnaW5nIHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb25hbCBicmFuY2ggd2l0aCB0aGUgcmVzdCBvZiB0aGUgc2NoZW1hXG4gKi9cbmNvbnN0IHJlc29sdmVDb25kaXRpb24gPSAoc2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSkgPT4ge1xuICBsZXQge1xuICAgIGlmOiBleHByZXNzaW9uLFxuICAgIHRoZW4sXG4gICAgZWxzZTogb3RoZXJ3aXNlLFxuICAgIC4uLnJlc29sdmVkU2NoZW1hTGVzc0NvbmRpdGlvbmFsXG4gIH0gPSBzY2hlbWE7XG5cbiAgY29uc3QgY29uZGl0aW9uYWxTY2hlbWEgPSBpc1ZhbGlkKGV4cHJlc3Npb24sIGZvcm1EYXRhLCByb290U2NoZW1hKVxuICAgID8gdGhlblxuICAgIDogb3RoZXJ3aXNlO1xuXG4gIGlmIChjb25kaXRpb25hbFNjaGVtYSkge1xuICAgIHJldHVybiByZXRyaWV2ZVNjaGVtYShcbiAgICAgIG1lcmdlU2NoZW1hcyhcbiAgICAgICAgcmVzb2x2ZWRTY2hlbWFMZXNzQ29uZGl0aW9uYWwsXG4gICAgICAgIHJldHJpZXZlU2NoZW1hKGNvbmRpdGlvbmFsU2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSlcbiAgICAgICksXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGFcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXRyaWV2ZVNjaGVtYShyZXNvbHZlZFNjaGVtYUxlc3NDb25kaXRpb25hbCwgcm9vdFNjaGVtYSwgZm9ybURhdGEpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHJlZmVyZW5jZXMgYW5kIGRlcGVuZGVuY2llcyB3aXRoaW4gYSBzY2hlbWEgYW5kIGl0cyAnYWxsT2YnIGNoaWxkcmVuLlxuICpcbiAqIENhbGxlZCBpbnRlcm5hbGx5IGJ5IHJldHJpZXZlU2NoZW1hLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHJvb3RTY2hlbWEgPSB7fSwgZm9ybURhdGEgPSB7fSkge1xuICBpZiAoc2NoZW1hLmhhc093blByb3BlcnR5KFwiJHJlZlwiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVmZXJlbmNlKHNjaGVtYSwgcm9vdFNjaGVtYSwgZm9ybURhdGEpO1xuICB9IGVsc2UgaWYgKHNjaGVtYS5oYXNPd25Qcm9wZXJ0eShcImRlcGVuZGVuY2llc1wiKSkge1xuICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gcmVzb2x2ZURlcGVuZGVuY2llcyhzY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICByZXR1cm4gcmV0cmlldmVTY2hlbWEocmVzb2x2ZWRTY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgfSBlbHNlIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJhbGxPZlwiKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zY2hlbWEsXG4gICAgICBhbGxPZjogc2NoZW1hLmFsbE9mLm1hcChhbGxPZlN1YnNjaGVtYSA9PlxuICAgICAgICByZXRyaWV2ZVNjaGVtYShhbGxPZlN1YnNjaGVtYSwgcm9vdFNjaGVtYSwgZm9ybURhdGEpXG4gICAgICApLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gJHJlZiBvciBkZXBlbmRlbmNpZXMgYXR0cmlidXRlIGZvdW5kLCByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIHNjaGVtYS5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZWZlcmVuY2Uoc2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSkge1xuICAvLyBSZXRyaWV2ZSB0aGUgcmVmZXJlbmNlZCBzY2hlbWEgZGVmaW5pdGlvbi5cbiAgY29uc3QgJHJlZlNjaGVtYSA9IGZpbmRTY2hlbWFEZWZpbml0aW9uKHNjaGVtYS4kcmVmLCByb290U2NoZW1hKTtcbiAgLy8gRHJvcCB0aGUgJHJlZiBwcm9wZXJ0eSBvZiB0aGUgc291cmNlIHNjaGVtYS5cbiAgY29uc3QgeyAkcmVmLCAuLi5sb2NhbFNjaGVtYSB9ID0gc2NoZW1hO1xuICAvLyBVcGRhdGUgcmVmZXJlbmNlZCBzY2hlbWEgZGVmaW5pdGlvbiB3aXRoIGxvY2FsIHNjaGVtYSBwcm9wZXJ0aWVzLlxuICByZXR1cm4gcmV0cmlldmVTY2hlbWEoXG4gICAgeyAuLi4kcmVmU2NoZW1hLCAuLi5sb2NhbFNjaGVtYSB9LFxuICAgIHJvb3RTY2hlbWEsXG4gICAgZm9ybURhdGFcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldHJpZXZlU2NoZW1hKHNjaGVtYSwgcm9vdFNjaGVtYSA9IHt9LCBmb3JtRGF0YSA9IHt9KSB7XG4gIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBsZXQgcmVzb2x2ZWRTY2hlbWEgPSByZXNvbHZlU2NoZW1hKHNjaGVtYSwgcm9vdFNjaGVtYSwgZm9ybURhdGEpO1xuXG4gIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJpZlwiKSkge1xuICAgIHJldHVybiByZXNvbHZlQ29uZGl0aW9uKHNjaGVtYSwgcm9vdFNjaGVtYSwgZm9ybURhdGEpO1xuICB9XG5cbiAgLy8gRm9yIGVhY2ggbGV2ZWwgb2YgdGhlIGRlcGVuZGVuY3ksIHdlIG5lZWQgdG8gcmVjdXJzaXZlbHkgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSByZXNvbHZlZCBzY2hlbWEgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgZm9ybURhdGEuXG4gIC8vIE90aGVyd2lzZSwgbmVzdGVkIGFsbE9mIHN1YnNjaGVtYXMgd2lsbCBub3QgYmUgY29ycmVjdGx5IGRpc3BsYXllZC5cbiAgaWYgKHJlc29sdmVkU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge307XG5cbiAgICBPYmplY3QuZW50cmllcyhyZXNvbHZlZFNjaGVtYS5wcm9wZXJ0aWVzKS5mb3JFYWNoKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBlbnRyaWVzWzBdO1xuICAgICAgY29uc3QgcHJvcFNjaGVtYSA9IGVudHJpZXNbMV07XG4gICAgICBjb25zdCByYXdQcm9wRGF0YSA9IGZvcm1EYXRhICYmIGZvcm1EYXRhW3Byb3BOYW1lXTtcbiAgICAgIGNvbnN0IHByb3BEYXRhID0gaXNPYmplY3QocmF3UHJvcERhdGEpID8gcmF3UHJvcERhdGEgOiB7fTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUHJvcFNjaGVtYSA9IHJldHJpZXZlU2NoZW1hKFxuICAgICAgICBwcm9wU2NoZW1hLFxuICAgICAgICByb290U2NoZW1hLFxuICAgICAgICBwcm9wRGF0YVxuICAgICAgKTtcblxuICAgICAgcHJvcGVydGllc1twcm9wTmFtZV0gPSByZXNvbHZlZFByb3BTY2hlbWE7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcFNjaGVtYSAhPT0gcmVzb2x2ZWRQcm9wU2NoZW1hICYmXG4gICAgICAgIHJlc29sdmVkU2NoZW1hLnByb3BlcnRpZXMgIT09IHByb3BlcnRpZXNcbiAgICAgICkge1xuICAgICAgICByZXNvbHZlZFNjaGVtYSA9IHsgLi4ucmVzb2x2ZWRTY2hlbWEsIHByb3BlcnRpZXMgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChcImFsbE9mXCIgaW4gc2NoZW1hKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkU2NoZW1hID0gbWVyZ2VBbGxPZih7XG4gICAgICAgIC4uLnJlc29sdmVkU2NoZW1hLFxuICAgICAgICBhbGxPZjogcmVzb2x2ZWRTY2hlbWEuYWxsT2YsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJjb3VsZCBub3QgbWVyZ2Ugc3Vic2NoZW1hcyBpbiBhbGxPZjpcXG5cIiArIGUpO1xuICAgICAgY29uc3QgeyBhbGxPZiwgLi4ucmVzb2x2ZWRTY2hlbWFXaXRob3V0QWxsT2YgfSA9IHJlc29sdmVkU2NoZW1hO1xuICAgICAgcmV0dXJuIHJlc29sdmVkU2NoZW1hV2l0aG91dEFsbE9mO1xuICAgIH1cbiAgfVxuICBjb25zdCBoYXNBZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgcmVzb2x2ZWRTY2hlbWEuaGFzT3duUHJvcGVydHkoXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiKSAmJlxuICAgIHJlc29sdmVkU2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSBmYWxzZTtcbiAgaWYgKGhhc0FkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIHN0dWJFeGlzdGluZ0FkZGl0aW9uYWxQcm9wZXJ0aWVzKFxuICAgICAgcmVzb2x2ZWRTY2hlbWEsXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGFcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZFNjaGVtYTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlcGVuZGVuY2llcyhzY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKSB7XG4gIC8vIERyb3AgdGhlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzb3VyY2Ugc2NoZW1hLlxuICBsZXQgeyBkZXBlbmRlbmNpZXMgPSB7fSwgLi4ucmVzb2x2ZWRTY2hlbWEgfSA9IHNjaGVtYTtcbiAgaWYgKFwib25lT2ZcIiBpbiByZXNvbHZlZFNjaGVtYSkge1xuICAgIHJlc29sdmVkU2NoZW1hID1cbiAgICAgIHJlc29sdmVkU2NoZW1hLm9uZU9mW1xuICAgICAgICBnZXRNYXRjaGluZ09wdGlvbihmb3JtRGF0YSwgcmVzb2x2ZWRTY2hlbWEub25lT2YsIHJvb3RTY2hlbWEpXG4gICAgICBdO1xuICB9IGVsc2UgaWYgKFwiYW55T2ZcIiBpbiByZXNvbHZlZFNjaGVtYSkge1xuICAgIHJlc29sdmVkU2NoZW1hID1cbiAgICAgIHJlc29sdmVkU2NoZW1hLmFueU9mW1xuICAgICAgICBnZXRNYXRjaGluZ09wdGlvbihmb3JtRGF0YSwgcmVzb2x2ZWRTY2hlbWEuYW55T2YsIHJvb3RTY2hlbWEpXG4gICAgICBdO1xuICB9XG4gIHJldHVybiBwcm9jZXNzRGVwZW5kZW5jaWVzKFxuICAgIGRlcGVuZGVuY2llcyxcbiAgICByZXNvbHZlZFNjaGVtYSxcbiAgICByb290U2NoZW1hLFxuICAgIGZvcm1EYXRhXG4gICk7XG59XG5mdW5jdGlvbiBwcm9jZXNzRGVwZW5kZW5jaWVzKFxuICBkZXBlbmRlbmNpZXMsXG4gIHJlc29sdmVkU2NoZW1hLFxuICByb290U2NoZW1hLFxuICBmb3JtRGF0YVxuKSB7XG4gIC8vIFByb2Nlc3MgZGVwZW5kZW5jaWVzIHVwZGF0aW5nIHRoZSBsb2NhbCBzY2hlbWEgcHJvcGVydGllcyBhcyBhcHByb3ByaWF0ZS5cbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5S2V5IGluIGRlcGVuZGVuY2llcykge1xuICAgIC8vIFNraXAgdGhpcyBkZXBlbmRlbmN5IGlmIGl0cyB0cmlnZ2VyIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LlxuICAgIGlmIChmb3JtRGF0YVtkZXBlbmRlbmN5S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGlzIGRlcGVuZGVuY3kgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBzY2hlbWEgKHN1Y2ggYXMgd2hlbiBkZXBlbmRlbmN5S2V5IGlzIGl0c2VsZiBhIGhpZGRlbiBkZXBlbmRlbmN5LilcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZFNjaGVtYS5wcm9wZXJ0aWVzICYmXG4gICAgICAhKGRlcGVuZGVuY3lLZXkgaW4gcmVzb2x2ZWRTY2hlbWEucHJvcGVydGllcylcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBbZGVwZW5kZW5jeUtleV06IGRlcGVuZGVuY3lWYWx1ZSxcbiAgICAgIC4uLnJlbWFpbmluZ0RlcGVuZGVuY2llc1xuICAgIH0gPSBkZXBlbmRlbmNpZXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeVZhbHVlKSkge1xuICAgICAgcmVzb2x2ZWRTY2hlbWEgPSB3aXRoRGVwZW5kZW50UHJvcGVydGllcyhyZXNvbHZlZFNjaGVtYSwgZGVwZW5kZW5jeVZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRlcGVuZGVuY3lWYWx1ZSkpIHtcbiAgICAgIHJlc29sdmVkU2NoZW1hID0gd2l0aERlcGVuZGVudFNjaGVtYShcbiAgICAgICAgcmVzb2x2ZWRTY2hlbWEsXG4gICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgIGZvcm1EYXRhLFxuICAgICAgICBkZXBlbmRlbmN5S2V5LFxuICAgICAgICBkZXBlbmRlbmN5VmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzRGVwZW5kZW5jaWVzKFxuICAgICAgcmVtYWluaW5nRGVwZW5kZW5jaWVzLFxuICAgICAgcmVzb2x2ZWRTY2hlbWEsXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGFcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZFNjaGVtYTtcbn1cblxuZnVuY3Rpb24gd2l0aERlcGVuZGVudFByb3BlcnRpZXMoc2NoZW1hLCBhZGRpdGlvbmFsbHlSZXF1aXJlZCkge1xuICBpZiAoIWFkZGl0aW9uYWxseVJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICBjb25zdCByZXF1aXJlZCA9IEFycmF5LmlzQXJyYXkoc2NoZW1hLnJlcXVpcmVkKVxuICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5zY2hlbWEucmVxdWlyZWQsIC4uLmFkZGl0aW9uYWxseVJlcXVpcmVkXSkpXG4gICAgOiBhZGRpdGlvbmFsbHlSZXF1aXJlZDtcbiAgcmV0dXJuIHsgLi4uc2NoZW1hLCByZXF1aXJlZDogcmVxdWlyZWQgfTtcbn1cblxuZnVuY3Rpb24gd2l0aERlcGVuZGVudFNjaGVtYShcbiAgc2NoZW1hLFxuICByb290U2NoZW1hLFxuICBmb3JtRGF0YSxcbiAgZGVwZW5kZW5jeUtleSxcbiAgZGVwZW5kZW5jeVZhbHVlXG4pIHtcbiAgbGV0IHsgb25lT2YsIC4uLmRlcGVuZGVudFNjaGVtYSB9ID0gcmV0cmlldmVTY2hlbWEoXG4gICAgZGVwZW5kZW5jeVZhbHVlLFxuICAgIHJvb3RTY2hlbWEsXG4gICAgZm9ybURhdGFcbiAgKTtcbiAgc2NoZW1hID0gbWVyZ2VTY2hlbWFzKHNjaGVtYSwgZGVwZW5kZW50U2NoZW1hKTtcbiAgLy8gU2luY2UgaXQgZG9lcyBub3QgY29udGFpbiBvbmVPZiwgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBzY2hlbWEuXG4gIGlmIChvbmVPZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvbmVPZikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQ6IGl0IGlzIHNvbWUgJHt0eXBlb2Ygb25lT2Z9IGluc3RlYWQgb2YgYW4gYXJyYXlgKTtcbiAgfVxuICAvLyBSZXNvbHZlICRyZWZzIGluc2lkZSBvbmVPZi5cbiAgY29uc3QgcmVzb2x2ZWRPbmVPZiA9IG9uZU9mLm1hcChzdWJzY2hlbWEgPT5cbiAgICBzdWJzY2hlbWEuaGFzT3duUHJvcGVydHkoXCIkcmVmXCIpXG4gICAgICA/IHJlc29sdmVSZWZlcmVuY2Uoc3Vic2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSlcbiAgICAgIDogc3Vic2NoZW1hXG4gICk7XG4gIHJldHVybiB3aXRoRXhhY3RseU9uZVN1YnNjaGVtYShcbiAgICBzY2hlbWEsXG4gICAgcm9vdFNjaGVtYSxcbiAgICBmb3JtRGF0YSxcbiAgICBkZXBlbmRlbmN5S2V5LFxuICAgIHJlc29sdmVkT25lT2ZcbiAgKTtcbn1cblxuZnVuY3Rpb24gd2l0aEV4YWN0bHlPbmVTdWJzY2hlbWEoXG4gIHNjaGVtYSxcbiAgcm9vdFNjaGVtYSxcbiAgZm9ybURhdGEsXG4gIGRlcGVuZGVuY3lLZXksXG4gIG9uZU9mXG4pIHtcbiAgY29uc3QgdmFsaWRTdWJzY2hlbWFzID0gb25lT2YuZmlsdGVyKHN1YnNjaGVtYSA9PiB7XG4gICAgaWYgKCFzdWJzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IFtkZXBlbmRlbmN5S2V5XTogY29uZGl0aW9uUHJvcGVydHlTY2hlbWEgfSA9IHN1YnNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmIChjb25kaXRpb25Qcm9wZXJ0eVNjaGVtYSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uU2NoZW1hID0ge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgW2RlcGVuZGVuY3lLZXldOiBjb25kaXRpb25Qcm9wZXJ0eVNjaGVtYSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGVycm9ycyB9ID0gdmFsaWRhdGVGb3JtRGF0YShmb3JtRGF0YSwgY29uZGl0aW9uU2NoZW1hKTtcbiAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgfSk7XG4gIGlmICh2YWxpZFN1YnNjaGVtYXMubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJpZ25vcmluZyBvbmVPZiBpbiBkZXBlbmRlbmNpZXMgYmVjYXVzZSB0aGVyZSBpc24ndCBleGFjdGx5IG9uZSBzdWJzY2hlbWEgdGhhdCBpcyB2YWxpZFwiXG4gICAgKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG4gIGNvbnN0IHN1YnNjaGVtYSA9IHZhbGlkU3Vic2NoZW1hc1swXTtcbiAgY29uc3Qge1xuICAgIFtkZXBlbmRlbmN5S2V5XTogY29uZGl0aW9uUHJvcGVydHlTY2hlbWEsXG4gICAgLi4uZGVwZW5kZW50U3Vic2NoZW1hXG4gIH0gPSBzdWJzY2hlbWEucHJvcGVydGllcztcbiAgY29uc3QgZGVwZW5kZW50U2NoZW1hID0geyAuLi5zdWJzY2hlbWEsIHByb3BlcnRpZXM6IGRlcGVuZGVudFN1YnNjaGVtYSB9O1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHNjaGVtYSxcbiAgICByZXRyaWV2ZVNjaGVtYShkZXBlbmRlbnRTY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKVxuICApO1xufVxuXG4vLyBSZWN1cnNpdmVseSBtZXJnZSBkZWVwbHkgbmVzdGVkIHNjaGVtYXMuXG4vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG1lcmdlU2NoZW1hcyBhbmQgbWVyZ2VPYmplY3RzXG4vLyBpcyB0aGF0IG1lcmdlU2NoZW1hcyBvbmx5IGNvbmNhdHMgYXJyYXlzIGZvclxuLy8gdmFsdWVzIHVuZGVyIHRoZSBcInJlcXVpcmVkXCIga2V5d29yZCwgYW5kIHdoZW4gaXQgZG9lcyxcbi8vIGl0IGRvZXNuJ3QgaW5jbHVkZSBkdXBsaWNhdGUgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU2NoZW1hcyhvYmoxLCBvYmoyKSB7XG4gIHZhciBhY2MgPSBPYmplY3QuYXNzaWduKHt9LCBvYmoxKTsgLy8gUHJldmVudCBtdXRhdGlvbiBvZiBzb3VyY2Ugb2JqZWN0LlxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqMikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGxlZnQgPSBvYmoxID8gb2JqMVtrZXldIDoge30sXG4gICAgICByaWdodCA9IG9iajJba2V5XTtcbiAgICBpZiAob2JqMSAmJiBvYmoxLmhhc093blByb3BlcnR5KGtleSkgJiYgaXNPYmplY3QocmlnaHQpKSB7XG4gICAgICBhY2Nba2V5XSA9IG1lcmdlU2NoZW1hcyhsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG9iajEgJiZcbiAgICAgIG9iajIgJiZcbiAgICAgIChnZXRTY2hlbWFUeXBlKG9iajEpID09PSBcIm9iamVjdFwiIHx8IGdldFNjaGVtYVR5cGUob2JqMikgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBrZXkgPT09IFwicmVxdWlyZWRcIiAmJlxuICAgICAgQXJyYXkuaXNBcnJheShsZWZ0KSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShyaWdodClcbiAgICApIHtcbiAgICAgIC8vIERvbid0IGluY2x1ZGUgZHVwbGljYXRlIHZhbHVlcyB3aGVuIG1lcmdpbmdcbiAgICAgIC8vIFwicmVxdWlyZWRcIiBmaWVsZHMuXG4gICAgICBhY2Nba2V5XSA9IHVuaW9uKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2tleV0gPSByaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgYWNjKTtcbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbHMoYSwgYiwgY2EgPSBbXSwgY2IgPSBbXSkge1xuICAvLyBQYXJ0aWFsbHkgZXh0cmFjdGVkIGZyb20gbm9kZS1kZWVwZXIgYW5kIGFkYXB0ZWQgdG8gZXhjbHVkZSBjb21wYXJpc29uXG4gIC8vIGNoZWNrcyBmb3IgZnVuY3Rpb25zLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vb3RoaXltMjMvbm9kZS1kZWVwZXJcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBBc3N1bWUgYWxsIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudFxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmpzZi10ZWFtL3JlYWN0LWpzb25zY2hlbWEtZm9ybS9pc3N1ZXMvMjU1XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwICYmIGIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5zb3VyY2UgPT09IGIuc291cmNlICYmXG4gICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJlxuICAgICAgYS5sYXN0SW5kZXggPT09IGIubGFzdEluZGV4ICYmXG4gICAgICBhLmlnbm9yZUNhc2UgPT09IGIuaWdub3JlQ2FzZVxuICAgICk7XG4gIH0gZWxzZSBpZiAoaXNBcmd1bWVudHMoYSkgfHwgaXNBcmd1bWVudHMoYikpIHtcbiAgICBpZiAoIShpc0FyZ3VtZW50cyhhKSAmJiBpc0FyZ3VtZW50cyhiKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuICAgIHJldHVybiBkZWVwRXF1YWxzKHNsaWNlLmNhbGwoYSksIHNsaWNlLmNhbGwoYiksIGNhLCBjYik7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQga2EgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZXQga2IgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAvLyBkb24ndCBib3RoZXIgd2l0aCBzdGFjayBhY3JvYmF0aWNzIGlmIHRoZXJlJ3Mgbm90aGluZyB0aGVyZVxuICAgIGlmIChrYS5sZW5ndGggPT09IDAgJiYga2IubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGNhbCA9IGNhLmxlbmd0aDtcbiAgICB3aGlsZSAoY2FsLS0pIHtcbiAgICAgIGlmIChjYVtjYWxdID09PSBhKSB7XG4gICAgICAgIHJldHVybiBjYltjYWxdID09PSBiO1xuICAgICAgfVxuICAgIH1cbiAgICBjYS5wdXNoKGEpO1xuICAgIGNiLnB1c2goYik7XG5cbiAgICBrYS5zb3J0KCk7XG4gICAga2Iuc29ydCgpO1xuICAgIGZvciAodmFyIGogPSBrYS5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgaWYgKGthW2pdICE9PSBrYltqXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGxldCBrID0ga2EubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgIGtleSA9IGthW2tdO1xuICAgICAgaWYgKCFkZWVwRXF1YWxzKGFba2V5XSwgYltrZXldLCBjYSwgY2IpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYS5wb3AoKTtcbiAgICBjYi5wb3AoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZW5kZXIoY29tcCwgbmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgY29uc3QgeyBwcm9wcywgc3RhdGUgfSA9IGNvbXA7XG4gIHJldHVybiAhZGVlcEVxdWFscyhwcm9wcywgbmV4dFByb3BzKSB8fCAhZGVlcEVxdWFscyhzdGF0ZSwgbmV4dFN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSWRTY2hlbWEoXG4gIHNjaGVtYSxcbiAgaWQsXG4gIHJvb3RTY2hlbWEsXG4gIGZvcm1EYXRhID0ge30sXG4gIGlkUHJlZml4ID0gXCJyb290XCIsXG4gIGlkU2VwYXJhdG9yID0gXCJfXCJcbikge1xuICBjb25zdCBpZFNjaGVtYSA9IHtcbiAgICAkaWQ6IGlkIHx8IGlkUHJlZml4LFxuICB9O1xuICBpZiAoXCIkcmVmXCIgaW4gc2NoZW1hIHx8IFwiZGVwZW5kZW5jaWVzXCIgaW4gc2NoZW1hIHx8IFwiYWxsT2ZcIiBpbiBzY2hlbWEpIHtcbiAgICBjb25zdCBfc2NoZW1hID0gcmV0cmlldmVTY2hlbWEoc2NoZW1hLCByb290U2NoZW1hLCBmb3JtRGF0YSk7XG4gICAgcmV0dXJuIHRvSWRTY2hlbWEoX3NjaGVtYSwgaWQsIHJvb3RTY2hlbWEsIGZvcm1EYXRhLCBpZFByZWZpeCwgaWRTZXBhcmF0b3IpO1xuICB9XG4gIGlmIChcIml0ZW1zXCIgaW4gc2NoZW1hICYmICFzY2hlbWEuaXRlbXMuJHJlZikge1xuICAgIHJldHVybiB0b0lkU2NoZW1hKFxuICAgICAgc2NoZW1hLml0ZW1zLFxuICAgICAgaWQsXG4gICAgICByb290U2NoZW1hLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBpZFByZWZpeCxcbiAgICAgIGlkU2VwYXJhdG9yXG4gICAgKTtcbiAgfVxuICBpZiAoc2NoZW1hLnR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gaWRTY2hlbWE7XG4gIH1cbiAgZm9yIChjb25zdCBuYW1lIGluIHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9KSB7XG4gICAgY29uc3QgZmllbGQgPSBzY2hlbWEucHJvcGVydGllc1tuYW1lXTtcbiAgICBjb25zdCBmaWVsZElkID0gaWRTY2hlbWEuJGlkICsgaWRTZXBhcmF0b3IgKyBuYW1lO1xuICAgIGlkU2NoZW1hW25hbWVdID0gdG9JZFNjaGVtYShcbiAgICAgIGlzT2JqZWN0KGZpZWxkKSA/IGZpZWxkIDoge30sXG4gICAgICBmaWVsZElkLFxuICAgICAgcm9vdFNjaGVtYSxcbiAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBmb3JtRGF0YSBpcyBub3QgYW4gb2JqZWN0IC0tIHRoaXMgY2FuIGhhcHBlbiBpZiBhblxuICAgICAgLy8gYXJyYXkgaXRlbSBoYXMganVzdCBiZWVuIGFkZGVkLCBidXQgbm90IHBvcHVsYXRlZCB3aXRoIGRhdGEgeWV0XG4gICAgICAoZm9ybURhdGEgfHwge30pW25hbWVdLFxuICAgICAgaWRQcmVmaXgsXG4gICAgICBpZFNlcGFyYXRvclxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlkU2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYXRoU2NoZW1hKHNjaGVtYSwgbmFtZSA9IFwiXCIsIHJvb3RTY2hlbWEsIGZvcm1EYXRhID0ge30pIHtcbiAgY29uc3QgcGF0aFNjaGVtYSA9IHtcbiAgICAkbmFtZTogbmFtZS5yZXBsYWNlKC9eXFwuLywgXCJcIiksXG4gIH07XG4gIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEgfHwgXCJkZXBlbmRlbmNpZXNcIiBpbiBzY2hlbWEgfHwgXCJhbGxPZlwiIGluIHNjaGVtYSkge1xuICAgIGNvbnN0IF9zY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICByZXR1cm4gdG9QYXRoU2NoZW1hKF9zY2hlbWEsIG5hbWUsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgfVxuXG4gIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiKSkge1xuICAgIHBhdGhTY2hlbWEuX19yanNmX2FkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoXCJpdGVtc1wiKSAmJiBBcnJheS5pc0FycmF5KGZvcm1EYXRhKSkge1xuICAgIGZvcm1EYXRhLmZvckVhY2goKGVsZW1lbnQsIGkpID0+IHtcbiAgICAgIHBhdGhTY2hlbWFbaV0gPSB0b1BhdGhTY2hlbWEoXG4gICAgICAgIHNjaGVtYS5pdGVtcyxcbiAgICAgICAgYCR7bmFtZX0uJHtpfWAsXG4gICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgIGVsZW1lbnRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2NoZW1hLmhhc093blByb3BlcnR5KFwicHJvcGVydGllc1wiKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgIHBhdGhTY2hlbWFbcHJvcGVydHldID0gdG9QYXRoU2NoZW1hKFxuICAgICAgICBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0sXG4gICAgICAgIGAke25hbWV9LiR7cHJvcGVydHl9YCxcbiAgICAgICAgcm9vdFNjaGVtYSxcbiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IGZvcm1EYXRhIGlzIG5vdCBhbiBvYmplY3QgLS0gdGhpcyBjYW4gaGFwcGVuIGlmIGFuXG4gICAgICAgIC8vIGFycmF5IGl0ZW0gaGFzIGp1c3QgYmVlbiBhZGRlZCwgYnV0IG5vdCBwb3B1bGF0ZWQgd2l0aCBkYXRhIHlldFxuICAgICAgICAoZm9ybURhdGEgfHwge30pW3Byb3BlcnR5XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhdGhTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZywgaW5jbHVkZVRpbWUgPSB0cnVlKSB7XG4gIGlmICghZGF0ZVN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICB5ZWFyOiAtMSxcbiAgICAgIG1vbnRoOiAtMSxcbiAgICAgIGRheTogLTEsXG4gICAgICBob3VyOiBpbmNsdWRlVGltZSA/IC0xIDogMCxcbiAgICAgIG1pbnV0ZTogaW5jbHVkZVRpbWUgPyAtMSA6IDAsXG4gICAgICBzZWNvbmQ6IGluY2x1ZGVUaW1lID8gLTEgOiAwLFxuICAgIH07XG4gIH1cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSBkYXRlIFwiICsgZGF0ZVN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIC8vIG9oIHlvdSwgamF2YXNjcmlwdC5cbiAgICBkYXk6IGRhdGUuZ2V0VVRDRGF0ZSgpLFxuICAgIGhvdXI6IGluY2x1ZGVUaW1lID8gZGF0ZS5nZXRVVENIb3VycygpIDogMCxcbiAgICBtaW51dGU6IGluY2x1ZGVUaW1lID8gZGF0ZS5nZXRVVENNaW51dGVzKCkgOiAwLFxuICAgIHNlY29uZDogaW5jbHVkZVRpbWUgPyBkYXRlLmdldFVUQ1NlY29uZHMoKSA6IDAsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGVTdHJpbmcoXG4gIHsgeWVhciwgbW9udGgsIGRheSwgaG91ciA9IDAsIG1pbnV0ZSA9IDAsIHNlY29uZCA9IDAgfSxcbiAgdGltZSA9IHRydWVcbikge1xuICBjb25zdCB1dGNUaW1lID0gRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTtcbiAgY29uc3QgZGF0ZXRpbWUgPSBuZXcgRGF0ZSh1dGNUaW1lKS50b0pTT04oKTtcbiAgcmV0dXJuIHRpbWUgPyBkYXRldGltZSA6IGRhdGV0aW1lLnNsaWNlKDAsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHV0Y1RvTG9jYWwoanNvbkRhdGUpIHtcbiAgaWYgKCFqc29uRGF0ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgLy8gcmVxdWlyZWQgZm9ybWF0IG9mIGBcInl5eXktTU0tZGRUaGg6bW1cIiBmb2xsb3dlZCBieSBvcHRpb25hbCBcIjpzc1wiIG9yIFwiOnNzLlNTU1wiXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2lucHV0Lmh0bWwjbG9jYWwtZGF0ZS1hbmQtdGltZS1zdGF0ZS0odHlwZSUzRGRhdGV0aW1lLWxvY2FsKVxuICAvLyA+IHNob3VsZCBiZSBhIF92YWxpZCBsb2NhbCBkYXRlIGFuZCB0aW1lIHN0cmluZ18gKG5vdCBHTVQpXG5cbiAgLy8gTm90ZSAtIGRhdGUgY29uc3RydWN0b3IgcGFzc2VkIGxvY2FsIElTTy04NjAxIGRvZXMgbm90IGNvcnJlY3RseVxuICAvLyBjaGFuZ2UgdGltZSB0byBVVEMgaW4gbm9kZSBwcmUtOFxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoanNvbkRhdGUpO1xuXG4gIGNvbnN0IHl5eXkgPSBwYWQoZGF0ZS5nZXRGdWxsWWVhcigpLCA0KTtcbiAgY29uc3QgTU0gPSBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSwgMik7XG4gIGNvbnN0IGRkID0gcGFkKGRhdGUuZ2V0RGF0ZSgpLCAyKTtcbiAgY29uc3QgaGggPSBwYWQoZGF0ZS5nZXRIb3VycygpLCAyKTtcbiAgY29uc3QgbW0gPSBwYWQoZGF0ZS5nZXRNaW51dGVzKCksIDIpO1xuICBjb25zdCBzcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSwgMik7XG4gIGNvbnN0IFNTUyA9IHBhZChkYXRlLmdldE1pbGxpc2Vjb25kcygpLCAzKTtcblxuICByZXR1cm4gYCR7eXl5eX0tJHtNTX0tJHtkZH1UJHtoaH06JHttbX06JHtzc30uJHtTU1N9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsVG9VVEMoZGF0ZVN0cmluZykge1xuICBpZiAoZGF0ZVN0cmluZykge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS50b0pTT04oKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkKG51bSwgc2l6ZSkge1xuICBsZXQgcyA9IFN0cmluZyhudW0pO1xuICB3aGlsZSAocy5sZW5ndGggPCBzaXplKSB7XG4gICAgcyA9IFwiMFwiICsgcztcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFVUkl0b0Jsb2IoZGF0YVVSSSkge1xuICAvLyBTcGxpdCBtZXRhZGF0YSBmcm9tIGRhdGFcbiAgY29uc3Qgc3BsaXR0ZWQgPSBkYXRhVVJJLnNwbGl0KFwiLFwiKTtcbiAgLy8gU3BsaXQgcGFyYW1zXG4gIGNvbnN0IHBhcmFtcyA9IHNwbGl0dGVkWzBdLnNwbGl0KFwiO1wiKTtcbiAgLy8gR2V0IG1pbWUtdHlwZSBmcm9tIHBhcmFtc1xuICBjb25zdCB0eXBlID0gcGFyYW1zWzBdLnJlcGxhY2UoXCJkYXRhOlwiLCBcIlwiKTtcbiAgLy8gRmlsdGVyIHRoZSBuYW1lIHByb3BlcnR5IGZyb20gcGFyYW1zXG4gIGNvbnN0IHByb3BlcnRpZXMgPSBwYXJhbXMuZmlsdGVyKHBhcmFtID0+IHtcbiAgICByZXR1cm4gcGFyYW0uc3BsaXQoXCI9XCIpWzBdID09PSBcIm5hbWVcIjtcbiAgfSk7XG4gIC8vIExvb2sgZm9yIHRoZSBuYW1lIGFuZCB1c2UgdW5rbm93biBpZiBubyBuYW1lIHByb3BlcnR5LlxuICBsZXQgbmFtZTtcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgbmFtZSA9IFwidW5rbm93blwiO1xuICB9IGVsc2Uge1xuICAgIC8vIEJlY2F1c2Ugd2UgZmlsdGVyZWQgb3V0IHRoZSBvdGhlciBwcm9wZXJ0eSxcbiAgICAvLyB3ZSBvbmx5IGhhdmUgdGhlIG5hbWUgY2FzZSBoZXJlLlxuICAgIG5hbWUgPSBwcm9wZXJ0aWVzWzBdLnNwbGl0KFwiPVwiKVsxXTtcbiAgfVxuXG4gIC8vIEJ1aWx0IHRoZSBVaW50OEFycmF5IEJsb2IgcGFyYW1ldGVyIGZyb20gdGhlIGJhc2U2NCBzdHJpbmcuXG4gIGNvbnN0IGJpbmFyeSA9IGF0b2Ioc3BsaXR0ZWRbMV0pO1xuICBjb25zdCBhcnJheSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgIGFycmF5LnB1c2goYmluYXJ5LmNoYXJDb2RlQXQoaSkpO1xuICB9XG4gIC8vIENyZWF0ZSB0aGUgYmxvYiBvYmplY3RcbiAgY29uc3QgYmxvYiA9IG5ldyB3aW5kb3cuQmxvYihbbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXSwgeyB0eXBlIH0pO1xuXG4gIHJldHVybiB7IGJsb2IsIG5hbWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlU3BlYyhzY2hlbWEpIHtcbiAgY29uc3Qgc3BlYyA9IHt9O1xuICBpZiAoc2NoZW1hLm11bHRpcGxlT2YpIHtcbiAgICBzcGVjLnN0ZXAgPSBzY2hlbWEubXVsdGlwbGVPZjtcbiAgfVxuICBpZiAoc2NoZW1hLm1pbmltdW0gfHwgc2NoZW1hLm1pbmltdW0gPT09IDApIHtcbiAgICBzcGVjLm1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICB9XG4gIGlmIChzY2hlbWEubWF4aW11bSB8fCBzY2hlbWEubWF4aW11bSA9PT0gMCkge1xuICAgIHNwZWMubWF4ID0gc2NoZW1hLm1heGltdW07XG4gIH1cbiAgcmV0dXJuIHNwZWM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXRjaGluZ09wdGlvbihmb3JtRGF0YSwgb3B0aW9ucywgcm9vdFNjaGVtYSkge1xuICAvLyBGb3IgcGVyZm9ybWFuY2UsIHNraXAgdmFsaWRhdGluZyBzdWJzY2hlbWFzIGlmIGZvcm1EYXRhIGlzIHVuZGVmaW5lZC4gV2UganVzdFxuICAvLyB3YW50IHRvIGdldCB0aGUgZmlyc3Qgb3B0aW9uIGluIHRoYXQgY2FzZS5cbiAgaWYgKGZvcm1EYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zW2ldO1xuXG4gICAgLy8gSWYgdGhlIHNjaGVtYSBkZXNjcmliZXMgYW4gb2JqZWN0IHRoZW4gd2UgbmVlZCB0byBhZGQgc2xpZ2h0bHkgbW9yZVxuICAgIC8vIHN0cmljdCBtYXRjaGluZyB0byB0aGUgc2NoZW1hLCBiZWNhdXNlIHVubGVzcyB0aGUgc2NoZW1hIHVzZXMgdGhlXG4gICAgLy8gXCJyZXF1aXJlc1wiIGtleXdvcmQsIGFuIG9iamVjdCB3aWxsIG1hdGNoIHRoZSBzY2hlbWEgYXMgbG9uZyBhcyBpdFxuICAgIC8vIGRvZXNuJ3QgaGF2ZSBtYXRjaGluZyBrZXlzIHdpdGggYSBjb25mbGljdGluZyB0eXBlLiBUbyBkbyB0aGlzIHdlIHVzZSBhblxuICAgIC8vIFwiYW55T2ZcIiB3aXRoIGFuIGFycmF5IG9mIHJlcXVpcmVzLiBUaGlzIGF1Z21lbnRhdGlvbiBleHByZXNzZXMgdGhhdCB0aGVcbiAgICAvLyBzY2hlbWEgc2hvdWxkIG1hdGNoIGlmIGFueSBvZiB0aGUga2V5cyBpbiB0aGUgc2NoZW1hIGFyZSBwcmVzZW50IG9uIHRoZVxuICAgIC8vIG9iamVjdCBhbmQgcGFzcyB2YWxpZGF0aW9uLlxuICAgIGlmIChvcHRpb24ucHJvcGVydGllcykge1xuICAgICAgLy8gQ3JlYXRlIGFuIFwiYW55T2ZcIiBzY2hlbWEgdGhhdCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIGtleXMgaW4gdGhlXG4gICAgICAvLyBcInByb3BlcnRpZXNcIiBvYmplY3RcbiAgICAgIGNvbnN0IHJlcXVpcmVzQW55T2YgPSB7XG4gICAgICAgIGFueU9mOiBPYmplY3Qua2V5cyhvcHRpb24ucHJvcGVydGllcykubWFwKGtleSA9PiAoe1xuICAgICAgICAgIHJlcXVpcmVkOiBba2V5XSxcbiAgICAgICAgfSkpLFxuICAgICAgfTtcblxuICAgICAgbGV0IGF1Z21lbnRlZFNjaGVtYTtcblxuICAgICAgLy8gSWYgdGhlIFwiYW55T2ZcIiBrZXl3b3JkIGFscmVhZHkgZXhpc3RzLCB3cmFwIHRoZSBhdWdtZW50YXRpb24gaW4gYW4gXCJhbGxPZlwiXG4gICAgICBpZiAob3B0aW9uLmFueU9mKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIG9wdGlvblxuICAgICAgICBjb25zdCB7IC4uLnNoYWxsb3dDbG9uZSB9ID0gb3B0aW9uO1xuXG4gICAgICAgIGlmICghc2hhbGxvd0Nsb25lLmFsbE9mKSB7XG4gICAgICAgICAgc2hhbGxvd0Nsb25lLmFsbE9mID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgXCJhbGxPZlwiIGFscmVhZHkgZXhpc3RzLCBzaGFsbG93IGNsb25lIHRoZSBhcnJheVxuICAgICAgICAgIHNoYWxsb3dDbG9uZS5hbGxPZiA9IHNoYWxsb3dDbG9uZS5hbGxPZi5zbGljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hhbGxvd0Nsb25lLmFsbE9mLnB1c2gocmVxdWlyZXNBbnlPZik7XG5cbiAgICAgICAgYXVnbWVudGVkU2NoZW1hID0gc2hhbGxvd0Nsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXVnbWVudGVkU2NoZW1hID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9uLCByZXF1aXJlc0FueU9mKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSBcInJlcXVpcmVkXCIgZmllbGQgYXMgaXQncyBsaWtlbHkgdGhhdCBub3QgYWxsIGZpZWxkcyBoYXZlXG4gICAgICAvLyBiZWVuIGZpbGxlZCBpbiB5ZXQsIHdoaWNoIHdpbGwgbWVhbiB0aGF0IHRoZSBzY2hlbWEgaXMgbm90IHZhbGlkXG4gICAgICBkZWxldGUgYXVnbWVudGVkU2NoZW1hLnJlcXVpcmVkO1xuXG4gICAgICBpZiAoaXNWYWxpZChhdWdtZW50ZWRTY2hlbWEsIGZvcm1EYXRhLCByb290U2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVmFsaWQob3B0aW9uLCBmb3JtRGF0YSwgcm9vdFNjaGVtYSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gQ2hlY2sgdG8gc2VlIGlmIGEgc2NoZW1hIHNwZWNpZmllcyB0aGF0IGEgdmFsdWUgbXVzdCBiZSB0cnVlXG5leHBvcnQgZnVuY3Rpb24gc2NoZW1hUmVxdWlyZXNUcnVlVmFsdWUoc2NoZW1hKSB7XG4gIC8vIENoZWNrIGlmIGNvbnN0IGlzIGEgdHJ1dGh5IHZhbHVlXG4gIGlmIChzY2hlbWEuY29uc3QpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFuIGVudW0gaGFzIGEgc2luZ2xlIHZhbHVlIG9mIHRydWVcbiAgaWYgKHNjaGVtYS5lbnVtICYmIHNjaGVtYS5lbnVtLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWEuZW51bVswXSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSWYgYW55T2YgaGFzIGEgc2luZ2xlIHZhbHVlLCBldmFsdWF0ZSB0aGUgc3Vic2NoZW1hXG4gIGlmIChzY2hlbWEuYW55T2YgJiYgc2NoZW1hLmFueU9mLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBzY2hlbWFSZXF1aXJlc1RydWVWYWx1ZShzY2hlbWEuYW55T2ZbMF0pO1xuICB9XG5cbiAgLy8gSWYgb25lT2YgaGFzIGEgc2luZ2xlIHZhbHVlLCBldmFsdWF0ZSB0aGUgc3Vic2NoZW1hXG4gIGlmIChzY2hlbWEub25lT2YgJiYgc2NoZW1hLm9uZU9mLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBzY2hlbWFSZXF1aXJlc1RydWVWYWx1ZShzY2hlbWEub25lT2ZbMF0pO1xuICB9XG5cbiAgLy8gRXZhbHVhdGUgZWFjaCBzdWJzY2hlbWEgaW4gYWxsT2YsIHRvIHNlZSBpZiBvbmUgb2YgdGhlbSByZXF1aXJlcyBhIHRydWVcbiAgLy8gdmFsdWVcbiAgaWYgKHNjaGVtYS5hbGxPZikge1xuICAgIHJldHVybiBzY2hlbWEuYWxsT2Yuc29tZShzY2hlbWFSZXF1aXJlc1RydWVWYWx1ZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=