@rjsf/core 4.1.1 → 4.2.2

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