@pie-lib/editable-html-tip-tap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
package/lib/editor.js ADDED
@@ -0,0 +1,1356 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ Object.defineProperty(exports, "ALL_PLUGINS", {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _plugins.ALL_PLUGINS;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "DEFAULT_PLUGINS", {
17
+ enumerable: true,
18
+ get: function get() {
19
+ return _plugins.DEFAULT_PLUGINS;
20
+ }
21
+ });
22
+ exports.serialization = exports["default"] = exports.Editor = void 0;
23
+
24
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
25
+
26
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
27
+
28
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
29
+
30
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
31
+
32
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
33
+
34
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
35
+
36
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
37
+
38
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
39
+
40
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
41
+
42
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
43
+
44
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
45
+
46
+ var _react = _interopRequireDefault(require("react"));
47
+
48
+ var _slateReact = require("slate-react");
49
+
50
+ var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
51
+
52
+ var _slate = require("slate");
53
+
54
+ var _slatePlainSerializer = _interopRequireDefault(require("slate-plain-serializer"));
55
+
56
+ var _propTypes = _interopRequireDefault(require("prop-types"));
57
+
58
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
59
+
60
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
61
+
62
+ var _classnames = _interopRequireDefault(require("classnames"));
63
+
64
+ var _debug = _interopRequireDefault(require("debug"));
65
+
66
+ var _styles = require("@material-ui/core/styles");
67
+
68
+ var _renderUi = require("@pie-lib/render-ui");
69
+
70
+ var _alertDialog = _interopRequireDefault(require("./shared/alert-dialog"));
71
+
72
+ var serialization = _interopRequireWildcard(require("./serialization"));
73
+
74
+ exports.serialization = serialization;
75
+
76
+ var _insertImageHandler = _interopRequireDefault(require("./plugins/image/insert-image-handler"));
77
+
78
+ var _plugins = require("./plugins");
79
+
80
+ var _excluded = ["customPlugins", "showParagraphs", "separateParagraphs"];
81
+
82
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
83
+
84
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
85
+
86
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
87
+
88
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
89
+
90
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
91
+
92
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
93
+
94
+ var log = (0, _debug["default"])('editable-html:editor');
95
+ var defaultToolbarOpts = {
96
+ position: 'bottom',
97
+ alignment: 'left',
98
+ alwaysVisible: false,
99
+ showDone: true,
100
+ doneOn: 'blur'
101
+ };
102
+ var defaultResponseAreaProps = {
103
+ options: {},
104
+ respAreaToolbar: function respAreaToolbar() {},
105
+ onHandleAreaChange: function onHandleAreaChange() {}
106
+ };
107
+ var defaultLanguageCharactersProps = [];
108
+
109
+ var createToolbarOpts = function createToolbarOpts(toolbarOpts, error, isHtmlMode) {
110
+ return _objectSpread(_objectSpread(_objectSpread({}, defaultToolbarOpts), toolbarOpts), {}, {
111
+ error: error,
112
+ isHtmlMode: isHtmlMode
113
+ });
114
+ };
115
+ /**
116
+ * The maximum number of characters the editor can support
117
+ * @type {number}
118
+ */
119
+
120
+
121
+ var MAX_CHARACTERS_LIMIT = 1000000;
122
+
123
+ var Editor = /*#__PURE__*/function (_React$Component) {
124
+ (0, _inherits2["default"])(Editor, _React$Component);
125
+
126
+ var _super = _createSuper(Editor);
127
+
128
+ function Editor(_props) {
129
+ var _this;
130
+
131
+ (0, _classCallCheck2["default"])(this, Editor);
132
+ _this = _super.call(this, _props);
133
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "setKeypadInteraction", function (interacted) {
134
+ _this.keypadInteractionDetected = interacted;
135
+ });
136
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDialog", function (open) {
137
+ var extraDialogProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
138
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
139
+
140
+ _this.setState({
141
+ dialog: _objectSpread({
142
+ open: open
143
+ }, extraDialogProps)
144
+ }, callback);
145
+ });
146
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleHtmlMode", function () {
147
+ _this.setState(function (prevState) {
148
+ return {
149
+ isHtmlMode: !prevState.isHtmlMode,
150
+ isEditedInHtmlMode: false
151
+ };
152
+ }, function () {
153
+ var error = _this.props.error;
154
+ var toolbarOpts = _this.state.toolbarOpts;
155
+ var newToolbarOpts = createToolbarOpts(toolbarOpts, error, _this.state.isHtmlMode);
156
+
157
+ _this.setState({
158
+ toolbarOpts: newToolbarOpts
159
+ });
160
+ });
161
+ });
162
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handlePlugins", function (props) {
163
+ var normalizedResponseAreaProps = _objectSpread(_objectSpread({}, defaultResponseAreaProps), props.responseAreaProps);
164
+
165
+ var htmlPluginOpts = {
166
+ currentValue: _this.props.value,
167
+ isHtmlMode: _this.state.isHtmlMode,
168
+ isEditedInHtmlMode: _this.state.isEditedInHtmlMode,
169
+ toggleHtmlMode: _this.toggleHtmlMode,
170
+ handleAlertDialog: _this.handleDialog
171
+ };
172
+
173
+ var _ref = props.pluginProps || {},
174
+ customPlugins = _ref.customPlugins;
175
+
176
+ customPlugins = customPlugins || [];
177
+ _this.plugins = (0, _plugins.buildPlugins)(props.activePlugins, customPlugins, {
178
+ math: _objectSpread({
179
+ onClick: _this.onMathClick,
180
+ onFocus: _this.onPluginFocus,
181
+ onBlur: _this.onPluginBlur
182
+ }, props.mathMlOptions),
183
+ textAlign: {
184
+ getValue: function getValue() {
185
+ return _this.state.value;
186
+ },
187
+ onChange: _this.onChange
188
+ },
189
+ html: htmlPluginOpts,
190
+ extraCSSRules: props.extraCSSRules || {},
191
+ image: {
192
+ disableImageAlignmentButtons: props.disableImageAlignmentButtons,
193
+ onDelete: props.imageSupport && props.imageSupport["delete"] && function (node, done) {
194
+ var src = node.data.get('src');
195
+ props.imageSupport["delete"](src, function (e) {
196
+ var newPendingImages = _this.state.pendingImages.filter(function (img) {
197
+ return img.key !== node.key;
198
+ });
199
+
200
+ var oldScheduled = _this.state.scheduled;
201
+ var newState = {
202
+ pendingImages: newPendingImages,
203
+ scheduled: oldScheduled && newPendingImages.length === 0 ? false : oldScheduled
204
+ };
205
+
206
+ _this.setState(newState, function () {
207
+ return done(e, _this.state.value);
208
+ });
209
+ });
210
+ },
211
+ insertImageRequested: props.imageSupport && function (addedImage, getHandler) {
212
+ var pendingImages = _this.state.pendingImages;
213
+
214
+ var onFinish = function onFinish(result) {
215
+ var cb;
216
+
217
+ if (_this.state.scheduled && result) {
218
+ // finish editing only on success
219
+ cb = _this.onEditingDone.bind((0, _assertThisInitialized2["default"])(_this));
220
+ }
221
+
222
+ var newPendingImages = _this.state.pendingImages.filter(function (img) {
223
+ return img.key !== addedImage.key;
224
+ });
225
+
226
+ var newState = {
227
+ pendingImages: newPendingImages
228
+ };
229
+
230
+ if (newPendingImages.length === 0) {
231
+ newState.scheduled = false;
232
+ }
233
+
234
+ _this.setState(newState, cb);
235
+ };
236
+
237
+ var callback = function callback() {
238
+ /**
239
+ * The handler is the object through which the outer context
240
+ * communicates file upload events like: fileChosen, cancel, progress
241
+ */
242
+ var handler = getHandler(onFinish, function () {
243
+ return _this.state.value;
244
+ });
245
+ props.imageSupport.add(handler);
246
+ };
247
+
248
+ _this.setState({
249
+ pendingImages: [].concat((0, _toConsumableArray2["default"])(pendingImages), [addedImage])
250
+ }, callback);
251
+ },
252
+ onFocus: _this.onPluginFocus,
253
+ onBlur: _this.onPluginBlur,
254
+ maxImageWidth: props.maxImageWidth,
255
+ maxImageHeight: props.maxImageHeight
256
+ },
257
+ toolbar: {
258
+ /**
259
+ * To minimize converting html -> state -> html
260
+ * We only emit markup once 'done' is clicked.
261
+ */
262
+ disableScrollbar: !!props.disableScrollbar,
263
+ disableUnderline: props.disableUnderline,
264
+ autoWidth: props.autoWidthToolbar,
265
+ onDone: function onDone() {
266
+ var _this$state$value$sta, _this$state$value$sta2;
267
+
268
+ var nonEmpty = props.nonEmpty;
269
+ log('[onDone]');
270
+
271
+ _this.setState({
272
+ toolbarInFocus: false,
273
+ focusedNode: null,
274
+ focusToolbar: false
275
+ });
276
+
277
+ _this.editor.blur();
278
+
279
+ if (nonEmpty && ((_this$state$value$sta = _this.state.value.startText) === null || _this$state$value$sta === void 0 ? void 0 : (_this$state$value$sta2 = _this$state$value$sta.text) === null || _this$state$value$sta2 === void 0 ? void 0 : _this$state$value$sta2.length) === 0) {
280
+ _this.resetValue(true).then(function () {
281
+ _this.onEditingDone();
282
+ });
283
+ } else {
284
+ _this.onEditingDone();
285
+ }
286
+ }
287
+ },
288
+ table: {
289
+ onFocus: function onFocus() {
290
+ log('[table:onFocus]...');
291
+
292
+ _this.onPluginFocus();
293
+ },
294
+ onBlur: function onBlur() {
295
+ log('[table:onBlur]...');
296
+
297
+ _this.onPluginBlur();
298
+ }
299
+ },
300
+ responseArea: {
301
+ type: normalizedResponseAreaProps.type,
302
+ options: normalizedResponseAreaProps.options,
303
+ maxResponseAreas: normalizedResponseAreaProps.maxResponseAreas,
304
+ respAreaToolbar: normalizedResponseAreaProps.respAreaToolbar,
305
+ onHandleAreaChange: normalizedResponseAreaProps.onHandleAreaChange,
306
+ error: normalizedResponseAreaProps.error,
307
+ onFocus: function onFocus() {
308
+ log('[table:onFocus]...');
309
+
310
+ _this.onPluginFocus();
311
+ },
312
+ onBlur: function onBlur() {
313
+ log('[table:onBlur]...');
314
+
315
+ _this.onPluginBlur();
316
+ }
317
+ },
318
+ languageCharacters: props.languageCharactersProps,
319
+ keyPadCharacterRef: _this.keyPadCharacterRef,
320
+ setKeypadInteraction: _this.setKeypadInteraction,
321
+ media: {
322
+ focus: _this.focus,
323
+ createChange: function createChange() {
324
+ return _this.state.value.change();
325
+ },
326
+ onChange: _this.onChange,
327
+ uploadSoundSupport: props.uploadSoundSupport
328
+ }
329
+ });
330
+
331
+ if (props.mathMlOptions.mmlOutput || props.mathMlOptions.mmlEditing) {
332
+ _this.props.runSerializationOnMarkup();
333
+ }
334
+ });
335
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onPluginBlur", function (e) {
336
+ log('[onPluginBlur]', e && e.relatedTarget);
337
+ var target = e && e.relatedTarget;
338
+ var node = target ? (0, _slateReact.findNode)(target, _this.state.value) : null;
339
+ log('[onPluginBlur] node: ', node);
340
+
341
+ _this.setState({
342
+ focusedNode: node
343
+ }, function () {
344
+ _this.resetValue();
345
+ });
346
+ });
347
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onPluginFocus", function (e) {
348
+ log('[onPluginFocus]', e && e.target);
349
+ var target = e && e.target;
350
+
351
+ if (target) {
352
+ var node = (0, _slateReact.findNode)(target, _this.state.value);
353
+ log('[onPluginFocus] node: ', node);
354
+ var stashedValue = _this.state.stashedValue || _this.state.value;
355
+
356
+ _this.setState({
357
+ focusedNode: node,
358
+ stashedValue: stashedValue
359
+ });
360
+ } else {
361
+ _this.setState({
362
+ focusedNode: null
363
+ });
364
+ }
365
+
366
+ _this.stashValue();
367
+ });
368
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onMathClick", function (node) {
369
+ _this.editor.change(function (c) {
370
+ return c.collapseToStartOf(node);
371
+ });
372
+
373
+ _this.setState({
374
+ selectedNode: node
375
+ });
376
+ });
377
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onEditingDone", function () {
378
+ var _this$state = _this.state,
379
+ isHtmlMode = _this$state.isHtmlMode,
380
+ dialog = _this$state.dialog,
381
+ value = _this$state.value,
382
+ pendingImages = _this$state.pendingImages; // Handling HTML mode and dialog state
383
+
384
+ if (isHtmlMode) {
385
+ // Early return if HTML mode is enabled
386
+ if (dialog !== null && dialog !== void 0 && dialog.open) return;
387
+ var currentValue = (0, serialization.htmlToValue)(value.document.text);
388
+
389
+ var previewText = _this.renderHtmlPreviewContent();
390
+
391
+ _this.openHtmlModeConfirmationDialog(currentValue, previewText);
392
+
393
+ return;
394
+ }
395
+
396
+ if (pendingImages.length) {
397
+ // schedule image processing
398
+ _this.setState({
399
+ scheduled: true
400
+ });
401
+
402
+ return;
403
+ } // Finalizing editing
404
+
405
+
406
+ log('[onEditingDone]');
407
+
408
+ _this.setState({
409
+ pendingImages: [],
410
+ stashedValue: null,
411
+ focusedNode: null
412
+ });
413
+
414
+ log('[onEditingDone] value: ', _this.state.value);
415
+
416
+ _this.props.onChange(_this.state.value, true);
417
+ });
418
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderHtmlPreviewContent", function () {
419
+ var classes = _this.props.classes;
420
+ return /*#__PURE__*/_react["default"].createElement("div", {
421
+ ref: function ref(_ref2) {
422
+ return _this.elementRef = _ref2;
423
+ }
424
+ }, /*#__PURE__*/_react["default"].createElement("div", null, "Preview of Edited Html:"), /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
425
+ defaultClassName: classes.previewText,
426
+ prompt: _this.state.value.document.text
427
+ }), /*#__PURE__*/_react["default"].createElement("div", null, "Would you like to save these changes ?"));
428
+ });
429
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "openHtmlModeConfirmationDialog", function (currentValue, previewText) {
430
+ _this.setState({
431
+ dialog: {
432
+ open: true,
433
+ title: 'Content Preview & Save',
434
+ text: previewText,
435
+ onConfirmText: 'Save changes',
436
+ onCloseText: 'Continue editing',
437
+ onConfirm: function onConfirm() {
438
+ _this.handleHtmlModeSaveConfirmation(currentValue);
439
+ },
440
+ onClose: _this.htmlModeContinueEditing
441
+ }
442
+ });
443
+ });
444
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleHtmlModeSaveConfirmation", function (currentValue) {
445
+ _this.setState({
446
+ value: currentValue
447
+ });
448
+
449
+ _this.props.onChange(currentValue, true);
450
+
451
+ _this.handleDialog(false);
452
+
453
+ _this.toggleHtmlMode();
454
+ });
455
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "htmlModeContinueEditing", function () {
456
+ _this.handleDialog(false);
457
+ });
458
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleBlur", function (resolve) {
459
+ var nonEmpty = _this.props.nonEmpty;
460
+ var doneOn = _this.state.toolbarOpts.doneOn;
461
+
462
+ _this.setState({
463
+ toolbarInFocus: false,
464
+ focusedNode: null
465
+ });
466
+
467
+ if (_this.editor) {
468
+ _this.editor.blur();
469
+ }
470
+
471
+ if (doneOn === 'blur') {
472
+ var _this$state$value$sta3, _this$state$value$sta4;
473
+
474
+ if (nonEmpty && ((_this$state$value$sta3 = _this.state.value.startText) === null || _this$state$value$sta3 === void 0 ? void 0 : (_this$state$value$sta4 = _this$state$value$sta3.text) === null || _this$state$value$sta4 === void 0 ? void 0 : _this$state$value$sta4.length) === 0) {
475
+ _this.resetValue(true).then(function () {
476
+ _this.onEditingDone();
477
+
478
+ resolve();
479
+ });
480
+ } else {
481
+ _this.onEditingDone();
482
+
483
+ resolve();
484
+ }
485
+ }
486
+ });
487
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onBlur", function (event) {
488
+ var _this$doneButtonRef$c;
489
+
490
+ log('[onBlur]');
491
+ var relatedTarget = event.relatedTarget;
492
+ var toolbarElement = _this.toolbarRef && (relatedTarget === null || relatedTarget === void 0 ? void 0 : relatedTarget.closest("[class*=\"".concat(_this.toolbarRef.className, "\"]"))); // Check if relatedTarget is a done button
493
+
494
+ var isRawDoneButton = _this.doneButtonRef && (relatedTarget === null || relatedTarget === void 0 ? void 0 : relatedTarget.closest("[class*=\"".concat((_this$doneButtonRef$c = _this.doneButtonRef.current) === null || _this$doneButtonRef$c === void 0 ? void 0 : _this$doneButtonRef$c.className, "\"]"))); // Skip onBlur handling if relatedTarget is a button from the KeyPad characters
495
+
496
+ _this.skipBlurHandling = _this.keypadInteractionDetected && relatedTarget !== null;
497
+
498
+ if (toolbarElement && !isRawDoneButton && !_this.state.focusToolbar) {
499
+ _this.setState({
500
+ focusToolbar: true
501
+ });
502
+ }
503
+
504
+ var node = relatedTarget ? (0, _slateReact.findNode)(relatedTarget, _this.state.value) : null;
505
+ log('[onBlur] node: ', node);
506
+ return new Promise(function (resolve) {
507
+ if (!_this.skipBlurHandling) {
508
+ _this.setKeypadInteraction(false);
509
+
510
+ _this.setState({
511
+ preBlurValue: _this.state.value,
512
+ focusedNode: !node ? null : node
513
+ }, _this.handleBlur.bind((0, _assertThisInitialized2["default"])(_this), resolve));
514
+ }
515
+
516
+ _this.props.onBlur(event);
517
+ });
518
+ });
519
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDomBlur", function (e) {
520
+ var editorDOM = document.querySelector("[data-key=\"".concat(_this.state.value.document.key, "\"]"));
521
+ setTimeout(function () {
522
+ var stateValue = _this.state.value;
523
+
524
+ if (!_this.wrapperRef) {
525
+ return;
526
+ }
527
+
528
+ var editorElement = !editorDOM || document.activeElement.closest("[class*=\"".concat(editorDOM.className, "\"]"));
529
+ var toolbarElement = !_this.toolbarRef || document.activeElement.closest("[class*=\"".concat(_this.toolbarRef.className, "\"]"));
530
+
531
+ var isInCurrentComponent = _this.wrapperRef.contains(editorElement) || _this.wrapperRef.contains(toolbarElement);
532
+
533
+ if (!isInCurrentComponent) {
534
+ editorDOM.removeEventListener('blur', _this.handleDomBlur);
535
+
536
+ if (stateValue.isFocused) {
537
+ _this.onBlur(e);
538
+ }
539
+ }
540
+ }, 50);
541
+ });
542
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFocus", function (event, change) {
543
+ return new Promise(function (resolve) {
544
+ var _navigator;
545
+
546
+ var editorDOM = document.querySelector("[data-key=\"".concat(_this.state.value.document.key, "\"]"));
547
+ var isTouchDevice = typeof window !== 'undefined' && ('ontouchstart' in window || ((_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.maxTouchPoints) > 0);
548
+ log('[onFocus]', document.activeElement);
549
+
550
+ if (_this.keypadInteractionDetected && _this.__TEMPORARY_CHANGE_DATA) {
551
+ _this.__TEMPORARY_CHANGE_DATA = null;
552
+ }
553
+ /**
554
+ * This is a temporary hack - @see changeData below for some more information.
555
+ */
556
+
557
+
558
+ if (_this.__TEMPORARY_CHANGE_DATA) {
559
+ var _this$__TEMPORARY_CHA = _this.__TEMPORARY_CHANGE_DATA,
560
+ key = _this$__TEMPORARY_CHA.key,
561
+ data = _this$__TEMPORARY_CHA.data;
562
+ var domEl = document.querySelector("[data-key=\"".concat(key, "\"]"));
563
+
564
+ if (domEl) {
565
+ var _change = _this.state.value.change().setNodeByKey(key, {
566
+ data: data
567
+ });
568
+
569
+ _this.setState({
570
+ value: _change.value
571
+ }, function () {
572
+ _this.__TEMPORARY_CHANGE_DATA = null;
573
+ });
574
+ }
575
+ }
576
+ /**
577
+ * This is needed just in case the browser decides to make the editor
578
+ * lose focus without triggering the onBlur event (can happen in a few cases).
579
+ * This will also trigger onBlur if the user clicks outside of the page when the editor
580
+ * is focused.
581
+ */
582
+
583
+
584
+ if (editorDOM === document.activeElement) {
585
+ editorDOM.removeEventListener('blur', _this.handleDomBlur);
586
+ editorDOM.addEventListener('blur', _this.handleDomBlur);
587
+ }
588
+
589
+ _this.stashValue();
590
+
591
+ _this.props.onFocus(); // Added for accessibility: Ensures the editor gains focus when tabbed to for improved keyboard navigation
592
+
593
+
594
+ var shouldFocusEditor = !_this.keypadInteractionDetected && !isTouchDevice;
595
+
596
+ if (shouldFocusEditor) {
597
+ change === null || change === void 0 ? void 0 : change.focus();
598
+ }
599
+
600
+ resolve();
601
+ });
602
+ });
603
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "stashValue", function () {
604
+ log('[stashValue]');
605
+
606
+ if (!_this.state.stashedValue) {
607
+ _this.setState({
608
+ stashedValue: _this.state.value
609
+ });
610
+ }
611
+ });
612
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "resetValue", function (force) {
613
+ var _this$state2 = _this.state,
614
+ value = _this$state2.value,
615
+ focusedNode = _this$state2.focusedNode;
616
+
617
+ var stopReset = _this.plugins.reduce(function (s, p) {
618
+ return s || p.stopReset && p.stopReset(_this.state.value);
619
+ }, false);
620
+
621
+ log('[resetValue]', value.isFocused, focusedNode, 'stopReset: ', stopReset);
622
+
623
+ if (_this.state.stashedValue && !value.isFocused && !focusedNode && !stopReset || force) {
624
+ log('[resetValue] resetting...');
625
+ log('stashed', _this.state.stashedValue.document.toObject());
626
+ log('current', _this.state.value.document.toObject());
627
+
628
+ var newValue = _slate.Value.fromJSON(_this.state.stashedValue.toJSON());
629
+
630
+ log('newValue: ', newValue.document);
631
+ return new Promise(function (resolve) {
632
+ setTimeout(function () {
633
+ _this.setState({
634
+ value: newValue,
635
+ stashedValue: null
636
+ }, function () {
637
+ log('value now: ', _this.state.value.document.toJSON());
638
+ resolve();
639
+ });
640
+ }, 50);
641
+ });
642
+ } else {
643
+ return Promise.resolve({});
644
+ }
645
+ });
646
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function (change, done) {
647
+ log('[onChange]');
648
+ window.me = (0, _assertThisInitialized2["default"])(_this);
649
+ var value = change.value;
650
+ var charactersLimit = _this.props.charactersLimit;
651
+ var limit = charactersLimit;
652
+
653
+ if (!limit || limit > MAX_CHARACTERS_LIMIT) {
654
+ limit = MAX_CHARACTERS_LIMIT;
655
+ }
656
+
657
+ if (value && value.document && value.document.text && value.document.text.length > limit) {
658
+ return;
659
+ } // Mark the editor as edited when in HTML mode and its content has changed.
660
+ // This status will later be used to decide whether to prompt a warning to the user when exiting HTML mode.
661
+
662
+
663
+ var isEditedInHtmlMode = !_this.state.isHtmlMode ? false : _this.state.value.document.text !== value.document.text ? true : _this.state.isEditedInHtmlMode;
664
+
665
+ if (isEditedInHtmlMode != _this.state.isEditedInHtmlMode) {
666
+ _this.handlePlugins(_this.props);
667
+ }
668
+
669
+ _this.setState({
670
+ value: value,
671
+ isEditedInHtmlMode: isEditedInHtmlMode
672
+ }, function () {
673
+ log('[onChange], call done()');
674
+
675
+ if (done) {
676
+ done();
677
+ }
678
+ });
679
+ });
680
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getFocusedValue", function () {
681
+ if (_this.state.value.isFocused) {
682
+ return _this.state.value;
683
+ }
684
+
685
+ return _this.state.preBlurValue;
686
+ });
687
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "valueToSize", function (v) {
688
+ if (!v) {
689
+ return;
690
+ }
691
+
692
+ var calcRegex = /^calc\((.*)\)$/;
693
+
694
+ if (typeof v === 'string') {
695
+ if (v.endsWith('%')) {
696
+ return undefined;
697
+ } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw') || v.endsWith('ch') || v.endsWith('em') || v.match(calcRegex)) {
698
+ return v;
699
+ } else {
700
+ var value = parseInt(v, 10);
701
+ return isNaN(value) ? value : "".concat(value, "px");
702
+ }
703
+ }
704
+
705
+ if (typeof v === 'number') {
706
+ return "".concat(v, "px");
707
+ }
708
+ });
709
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "validateNode", function (node) {
710
+ if (node.object !== 'block') return;
711
+ var last = node.nodes.last();
712
+ if (!last) return;
713
+ if (last.type !== 'image') return;
714
+ log('[validateNode] last is image..');
715
+ var parent = last.getParent(last.key);
716
+
717
+ var p = _slate.Block.getParent(last.key);
718
+
719
+ log('[validateNode] parent:', parent, p);
720
+ return undefined;
721
+ });
722
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeData", function (key, data) {
723
+ log('[changeData]. .. ', key, data);
724
+ /**
725
+ * HACK ALERT: We should be calling setState here and storing the change data:
726
+ *
727
+ * <code>this.setState({changeData: { key, data}})</code>
728
+ * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no
729
+ * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these
730
+ * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle
731
+ * on this hack rather than spend more time on this.
732
+ */
733
+ // Uncomment this line to see the bug described above.
734
+ // this.setState({changeData: {key, data}})
735
+
736
+ _this.__TEMPORARY_CHANGE_DATA = {
737
+ key: key,
738
+ data: data
739
+ };
740
+ });
741
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "focus", function (pos, node) {
742
+ var position = pos || 'end';
743
+
744
+ _this.props.focus(position, node);
745
+ });
746
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDropPaste", /*#__PURE__*/function () {
747
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event, change, dropContext) {
748
+ var editor, transfer, file, type, fragment, text, src, inline, range, ch, handler, _change$value, _document, selection, startBlock, defaultBlock, defaultMarks, frag;
749
+
750
+ return _regenerator["default"].wrap(function _callee$(_context) {
751
+ while (1) {
752
+ switch (_context.prev = _context.next) {
753
+ case 0:
754
+ editor = change.editor;
755
+ transfer = (0, _slateReact.getEventTransfer)(event);
756
+ file = transfer.files && transfer.files[0];
757
+ type = transfer.type;
758
+ fragment = transfer.fragment;
759
+ text = transfer.text;
760
+
761
+ if (!(file && (file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png'))) {
762
+ _context.next = 28;
763
+ break;
764
+ }
765
+
766
+ if (_this.props.imageSupport) {
767
+ _context.next = 9;
768
+ break;
769
+ }
770
+
771
+ return _context.abrupt("return");
772
+
773
+ case 9:
774
+ _context.prev = 9;
775
+ log('[onDropPaste]');
776
+ _context.next = 13;
777
+ return (0, serialization.getBase64)(file);
778
+
779
+ case 13:
780
+ src = _context.sent;
781
+ inline = _slate.Inline.create({
782
+ type: 'image',
783
+ isVoid: true,
784
+ data: {
785
+ loading: false,
786
+ src: src
787
+ }
788
+ });
789
+
790
+ if (dropContext) {
791
+ _this.focus();
792
+ } else {
793
+ range = (0, _slateReact.getEventRange)(event, editor);
794
+
795
+ if (range) {
796
+ change.select(range);
797
+ }
798
+ }
799
+
800
+ ch = change.insertInline(inline);
801
+
802
+ _this.onChange(ch);
803
+
804
+ handler = new _insertImageHandler["default"](inline, function () {}, function () {
805
+ return _this.state.value;
806
+ }, _this.onChange, true);
807
+ handler.fileChosen(file);
808
+
809
+ _this.props.imageSupport.add(handler);
810
+
811
+ _context.next = 26;
812
+ break;
813
+
814
+ case 23:
815
+ _context.prev = 23;
816
+ _context.t0 = _context["catch"](9);
817
+ log('[onDropPaste] error: ', _context.t0);
818
+
819
+ case 26:
820
+ _context.next = 42;
821
+ break;
822
+
823
+ case 28:
824
+ if (!(type === 'fragment')) {
825
+ _context.next = 32;
826
+ break;
827
+ }
828
+
829
+ change.insertFragment(fragment);
830
+ _context.next = 42;
831
+ break;
832
+
833
+ case 32:
834
+ if (!(type === 'text' || type === 'html')) {
835
+ _context.next = 42;
836
+ break;
837
+ }
838
+
839
+ if (text) {
840
+ _context.next = 35;
841
+ break;
842
+ }
843
+
844
+ return _context.abrupt("return");
845
+
846
+ case 35:
847
+ _change$value = change.value, _document = _change$value.document, selection = _change$value.selection, startBlock = _change$value.startBlock;
848
+
849
+ if (!startBlock.isVoid) {
850
+ _context.next = 38;
851
+ break;
852
+ }
853
+
854
+ return _context.abrupt("return");
855
+
856
+ case 38:
857
+ defaultBlock = startBlock;
858
+ defaultMarks = _document.getInsertMarksAtRange(selection);
859
+ frag = _slatePlainSerializer["default"].deserialize(text, {
860
+ defaultBlock: defaultBlock,
861
+ defaultMarks: defaultMarks
862
+ }).document;
863
+ change.insertFragment(frag);
864
+
865
+ case 42:
866
+ case "end":
867
+ return _context.stop();
868
+ }
869
+ }
870
+ }, _callee, null, [[9, 23]]);
871
+ }));
872
+
873
+ return function (_x, _x2, _x3) {
874
+ return _ref3.apply(this, arguments);
875
+ };
876
+ }());
877
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderPlaceholder", function (props) {
878
+ var editor = props.editor;
879
+ var document = editor.value.document;
880
+
881
+ if (!editor.props.placeholder || document.text !== '' || document.nodes.size !== 1 || !document.isEmpty) {
882
+ return false;
883
+ }
884
+
885
+ return /*#__PURE__*/_react["default"].createElement("span", {
886
+ contentEditable: false,
887
+ style: {
888
+ display: 'inline-block',
889
+ width: 'fit-content',
890
+ // for centering the placeholder if text-align is set to center
891
+ maxWidth: '100%',
892
+ whiteSpace: 'nowrap',
893
+ opacity: '0.33',
894
+ pointerEvents: 'none',
895
+ userSelect: 'none'
896
+ }
897
+ }, editor.props.placeholder);
898
+ });
899
+ _this.state = {
900
+ value: _props.value,
901
+ toolbarOpts: createToolbarOpts(_props.toolbarOpts, _props.error),
902
+ pendingImages: [],
903
+ isHtmlMode: false,
904
+ isEditedInHtmlMode: false,
905
+ focusToolbar: false,
906
+ dialog: {
907
+ open: false
908
+ }
909
+ };
910
+ _this.keyPadCharacterRef = /*#__PURE__*/_react["default"].createRef();
911
+ _this.doneButtonRef = /*#__PURE__*/_react["default"].createRef();
912
+ _this.keypadInteractionDetected = false;
913
+ _this.toggleHtmlMode = _this.toggleHtmlMode.bind((0, _assertThisInitialized2["default"])(_this));
914
+ _this.handleToolbarFocus = _this.handleToolbarFocus.bind((0, _assertThisInitialized2["default"])(_this));
915
+ _this.handleToolbarBlur = _this.handleToolbarBlur.bind((0, _assertThisInitialized2["default"])(_this));
916
+ _this.onResize = (0, _debounce["default"])(function () {
917
+ if (!_this.state.isHtmlMode && _props.onChange) {
918
+ _props.onChange(_this.state.value, true);
919
+ }
920
+ }, 50);
921
+
922
+ _this.handlePlugins(_this.props);
923
+
924
+ return _this;
925
+ }
926
+
927
+ (0, _createClass2["default"])(Editor, [{
928
+ key: "handleToolbarFocus",
929
+ value: function handleToolbarFocus() {
930
+ if (this.state.focusToolbar) {
931
+ return;
932
+ }
933
+
934
+ this.setState({
935
+ focusToolbar: true
936
+ });
937
+ }
938
+ }, {
939
+ key: "handleToolbarBlur",
940
+ value: function handleToolbarBlur() {
941
+ var _this2 = this;
942
+
943
+ setTimeout(function () {
944
+ if (!_this2.toolbarContainsFocus()) {
945
+ _this2.setState({
946
+ focusToolbar: false
947
+ });
948
+ }
949
+ }, 0);
950
+ }
951
+ }, {
952
+ key: "toolbarContainsFocus",
953
+ value: function toolbarContainsFocus() {
954
+ if (!this.toolbarRef) return false;
955
+ var toolbarElement = this.toolbarRef;
956
+ var activeElement = document.activeElement;
957
+ return toolbarElement && toolbarElement.contains(activeElement);
958
+ }
959
+ }, {
960
+ key: "componentDidMount",
961
+ value: function componentDidMount() {
962
+ var _this$props$className,
963
+ _this3 = this;
964
+
965
+ // onRef is needed to get the ref of the component because we export it using withStyles
966
+ this.props.onRef(this);
967
+ window.addEventListener('resize', this.onResize);
968
+ var isResponseAreaEditor = (_this$props$className = this.props.className) === null || _this$props$className === void 0 ? void 0 : _this$props$className.includes('response-area-editor');
969
+
970
+ if (isResponseAreaEditor && this.editor) {
971
+ var responseAreaEditor = document.querySelector("[data-key=\"".concat(this.editor.value.document.key, "\"]"));
972
+
973
+ if (responseAreaEditor) {
974
+ responseAreaEditor.setAttribute('aria-label', 'Answer');
975
+ }
976
+ }
977
+
978
+ if (this.editor && this.props.autoFocus) {
979
+ Promise.resolve().then(function () {
980
+ if (_this3.editor) {
981
+ var editorDOM = document.querySelector("[data-key=\"".concat(_this3.editor.value.document.key, "\"]"));
982
+
983
+ _this3.editor.focus();
984
+
985
+ if (editorDOM) {
986
+ editorDOM.focus();
987
+ }
988
+ }
989
+ });
990
+ }
991
+ }
992
+ }, {
993
+ key: "UNSAFE_componentWillReceiveProps",
994
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
995
+ var _nextProps$value, _nextProps$value$docu, _this$props$value;
996
+
997
+ var _this$state3 = this.state,
998
+ isHtmlMode = _this$state3.isHtmlMode,
999
+ toolbarOpts = _this$state3.toolbarOpts;
1000
+ var newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts, nextProps.error, isHtmlMode);
1001
+
1002
+ if (!(0, _isEqual["default"])(newToolbarOpts, toolbarOpts)) {
1003
+ this.setState({
1004
+ toolbarOpts: newToolbarOpts
1005
+ });
1006
+ }
1007
+
1008
+ var differentCharacterProps = !(0, _isEqual["default"])(nextProps.languageCharactersProps, this.props.languageCharactersProps);
1009
+ var differentMathMlProps = !(0, _isEqual["default"])(nextProps.mathMlOptions, this.props.mathMlOptions);
1010
+ var differentImageMaxDimensionsProps = !(0, _isEqual["default"])(nextProps.maxImageWidth, this.props.maxImageWidth) || !(0, _isEqual["default"])(nextProps.maxImageHeight, this.props.maxImageHeight);
1011
+
1012
+ if (differentCharacterProps || differentMathMlProps || differentImageMaxDimensionsProps) {
1013
+ this.handlePlugins(nextProps);
1014
+ }
1015
+
1016
+ if (!((_nextProps$value = nextProps.value) !== null && _nextProps$value !== void 0 && (_nextProps$value$docu = _nextProps$value.document) !== null && _nextProps$value$docu !== void 0 && _nextProps$value$docu.equals((_this$props$value = this.props.value) === null || _this$props$value === void 0 ? void 0 : _this$props$value.document))) {
1017
+ this.setState({
1018
+ focus: false,
1019
+ value: nextProps.value
1020
+ });
1021
+ }
1022
+ }
1023
+ }, {
1024
+ key: "componentDidUpdate",
1025
+ value: function componentDidUpdate(prevProps, prevState) {
1026
+ // The cursor is on a zero width element and when that is placed near void elements, it is not visible
1027
+ // so we increase the width to at least 2px in order for the user to see it
1028
+ // Trigger plugins and finish editing if:
1029
+ // 1. The 'isHtmlMode' state has been toggled.
1030
+ // 2. We're currently in 'isHtmlMode' and the editor value has been modified.
1031
+ if (this.state.isHtmlMode !== prevState.isHtmlMode || this.state.isHtmlMode && !prevState.isEditedInHtmlMode && this.state.isEditedInHtmlMode) {
1032
+ this.handlePlugins(this.props);
1033
+ }
1034
+
1035
+ var zeroWidthEls = document.querySelectorAll('[data-slate-zero-width="z"]');
1036
+ Array.from(zeroWidthEls).forEach(function (el) {
1037
+ el.style.minWidth = '2px';
1038
+ el.style.display = 'inline-block';
1039
+ });
1040
+ }
1041
+ }, {
1042
+ key: "componentWillUnmount",
1043
+ value:
1044
+ /**
1045
+ * Remove onResize event listener
1046
+ */
1047
+ function componentWillUnmount() {
1048
+ window.removeEventListener('resize', this.onResize);
1049
+ } // Allowing time for onChange to take effect if it is called
1050
+
1051
+ }, {
1052
+ key: "buildSizeStyle",
1053
+ value: function buildSizeStyle() {
1054
+ var _this$props = this.props,
1055
+ minWidth = _this$props.minWidth,
1056
+ width = _this$props.width,
1057
+ maxWidth = _this$props.maxWidth,
1058
+ minHeight = _this$props.minHeight,
1059
+ height = _this$props.height,
1060
+ maxHeight = _this$props.maxHeight;
1061
+ return {
1062
+ width: this.valueToSize(width),
1063
+ minWidth: this.valueToSize(minWidth),
1064
+ maxWidth: this.valueToSize(maxWidth),
1065
+ height: this.valueToSize(height),
1066
+ minHeight: this.valueToSize(minHeight),
1067
+ maxHeight: this.valueToSize(maxHeight)
1068
+ };
1069
+ }
1070
+ }, {
1071
+ key: "render",
1072
+ value: function render() {
1073
+ var _classNames,
1074
+ _this4 = this,
1075
+ _value$document,
1076
+ _classNames2;
1077
+
1078
+ var _this$props2 = this.props,
1079
+ disabled = _this$props2.disabled,
1080
+ spellCheck = _this$props2.spellCheck,
1081
+ highlightShape = _this$props2.highlightShape,
1082
+ classes = _this$props2.classes,
1083
+ className = _this$props2.className,
1084
+ isEditor = _this$props2.isEditor,
1085
+ placeholder = _this$props2.placeholder,
1086
+ pluginProps = _this$props2.pluginProps,
1087
+ onKeyDown = _this$props2.onKeyDown; // We don't want to send customPlugins to slate.
1088
+ // Not sure if they would do any harm, but I think it's better to not send them.
1089
+ // We use custom plugins to be able to add custom buttons
1090
+ // eslint-disable-next-line no-unused-vars
1091
+
1092
+ var _ref4 = pluginProps || {},
1093
+ customPlugins = _ref4.customPlugins,
1094
+ showParagraphs = _ref4.showParagraphs,
1095
+ separateParagraphs = _ref4.separateParagraphs,
1096
+ otherPluginProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded);
1097
+
1098
+ var _this$state4 = this.state,
1099
+ value = _this$state4.value,
1100
+ focusedNode = _this$state4.focusedNode,
1101
+ toolbarOpts = _this$state4.toolbarOpts,
1102
+ dialog = _this$state4.dialog,
1103
+ scheduled = _this$state4.scheduled;
1104
+ log('[render] value: ', value);
1105
+ var sizeStyle = this.buildSizeStyle();
1106
+ var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), (0, _defineProperty2["default"])(_classNames, classes.scheduled, scheduled), _classNames), className);
1107
+ return /*#__PURE__*/_react["default"].createElement("div", {
1108
+ ref: function ref(_ref5) {
1109
+ return _this4.wrapperRef = _ref5;
1110
+ },
1111
+ style: {
1112
+ width: sizeStyle.width,
1113
+ minWidth: sizeStyle.minWidth,
1114
+ maxWidth: sizeStyle.maxWidth
1115
+ },
1116
+ className: names,
1117
+ id: "editor-".concat(value === null || value === void 0 ? void 0 : (_value$document = value.document) === null || _value$document === void 0 ? void 0 : _value$document.key)
1118
+ }, scheduled && /*#__PURE__*/_react["default"].createElement("div", {
1119
+ className: classes.uploading
1120
+ }, "Uploading image and then saving..."), /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
1121
+ plugins: this.plugins,
1122
+ innerRef: function innerRef(r) {
1123
+ if (r) {
1124
+ _this4.slateEditor = r;
1125
+ }
1126
+ },
1127
+ ref: function ref(r) {
1128
+ return _this4.editor = r && _this4.props.editorRef(r);
1129
+ },
1130
+ toolbarRef: function toolbarRef(r) {
1131
+ if (r) {
1132
+ _this4.toolbarRef = r;
1133
+ }
1134
+ },
1135
+ doneButtonRef: this.doneButtonRef,
1136
+ value: value,
1137
+ focusToolbar: this.state.focusToolbar,
1138
+ onToolbarFocus: this.handleToolbarFocus,
1139
+ onToolbarBlur: this.handleToolbarBlur,
1140
+ focus: this.focus,
1141
+ onKeyDown: onKeyDown,
1142
+ onChange: this.onChange,
1143
+ getFocusedValue: this.getFocusedValue,
1144
+ onBlur: this.onBlur,
1145
+ onDrop: function onDrop(event, editor) {
1146
+ return _this4.onDropPaste(event, editor, true);
1147
+ },
1148
+ onPaste: function onPaste(event, editor) {
1149
+ return _this4.onDropPaste(event, editor);
1150
+ },
1151
+ onFocus: this.onFocus,
1152
+ onEditingDone: this.onEditingDone,
1153
+ focusedNode: focusedNode,
1154
+ normalize: this.normalize,
1155
+ readOnly: disabled,
1156
+ spellCheck: spellCheck,
1157
+ autoCorrect: spellCheck,
1158
+ className: (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, classes.noPadding, toolbarOpts === null || toolbarOpts === void 0 ? void 0 : toolbarOpts.noPadding), (0, _defineProperty2["default"])(_classNames2, classes.showParagraph, showParagraphs && !showParagraphs.disabled), (0, _defineProperty2["default"])(_classNames2, classes.separateParagraph, separateParagraphs && !separateParagraphs.disabled), _classNames2), classes.slateEditor),
1159
+ style: {
1160
+ minHeight: sizeStyle.minHeight,
1161
+ height: sizeStyle.height,
1162
+ maxHeight: sizeStyle.maxHeight
1163
+ },
1164
+ pluginProps: otherPluginProps,
1165
+ toolbarOpts: toolbarOpts,
1166
+ placeholder: placeholder,
1167
+ renderPlaceholder: this.renderPlaceholder,
1168
+ onDataChange: this.changeData
1169
+ }), /*#__PURE__*/_react["default"].createElement(_alertDialog["default"], {
1170
+ open: dialog.open,
1171
+ title: dialog.title,
1172
+ text: dialog.text,
1173
+ onClose: dialog.onClose,
1174
+ onConfirm: dialog.onConfirm,
1175
+ onConfirmText: dialog.onConfirmText,
1176
+ onCloseText: dialog.onCloseText
1177
+ }));
1178
+ }
1179
+ }]);
1180
+ return Editor;
1181
+ }(_react["default"].Component); // TODO color - hardcoded gray background and keypad colors will need to change too
1182
+
1183
+
1184
+ exports.Editor = Editor;
1185
+ (0, _defineProperty2["default"])(Editor, "propTypes", {
1186
+ autoFocus: _propTypes["default"].bool,
1187
+ editorRef: _propTypes["default"].func.isRequired,
1188
+ error: _propTypes["default"].any,
1189
+ onRef: _propTypes["default"].func.isRequired,
1190
+ onChange: _propTypes["default"].func.isRequired,
1191
+ onFocus: _propTypes["default"].func,
1192
+ onBlur: _propTypes["default"].func,
1193
+ onKeyDown: _propTypes["default"].func,
1194
+ focus: _propTypes["default"].func.isRequired,
1195
+ value: _slatePropTypes["default"].value.isRequired,
1196
+ imageSupport: _propTypes["default"].object,
1197
+ mathMlOptions: _propTypes["default"].shape({
1198
+ mmlOutput: _propTypes["default"].bool,
1199
+ mmlEditing: _propTypes["default"].bool
1200
+ }),
1201
+ disableImageAlignmentButtons: _propTypes["default"].bool,
1202
+ uploadSoundSupport: _propTypes["default"].shape({
1203
+ add: _propTypes["default"].func,
1204
+ "delete": _propTypes["default"].func
1205
+ }),
1206
+ charactersLimit: _propTypes["default"].number,
1207
+ width: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1208
+ minWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1209
+ maxWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1210
+ height: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1211
+ minHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1212
+ maxHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1213
+ classes: _propTypes["default"].object.isRequired,
1214
+ highlightShape: _propTypes["default"].bool,
1215
+ disabled: _propTypes["default"].bool,
1216
+ spellCheck: _propTypes["default"].bool,
1217
+ nonEmpty: _propTypes["default"].bool,
1218
+ disableScrollbar: _propTypes["default"].bool,
1219
+ disableUnderline: _propTypes["default"].bool,
1220
+ autoWidthToolbar: _propTypes["default"].bool,
1221
+ pluginProps: _propTypes["default"].any,
1222
+ // customPlugins should be inside pluginProps (a property inside pluginProps)
1223
+ // customPlugins: PropTypes.arrayOf(
1224
+ // PropTypes.shape({
1225
+ // event: PropTypes.string,
1226
+ // icon: PropTypes.string,
1227
+ // iconType: PropTypes.string,
1228
+ // iconAlt: PropTypes.string
1229
+ // }),
1230
+ // ),
1231
+ placeholder: _propTypes["default"].string,
1232
+ isEditor: _propTypes["default"].bool,
1233
+ responseAreaProps: _propTypes["default"].shape({
1234
+ type: _propTypes["default"].oneOf(['explicit-constructed-response', 'inline-dropdown', 'drag-in-the-blank', 'math-templated']),
1235
+ options: _propTypes["default"].object,
1236
+ respAreaToolbar: _propTypes["default"].func,
1237
+ onHandleAreaChange: _propTypes["default"].func,
1238
+ maxResponseAreas: _propTypes["default"].number,
1239
+ error: _propTypes["default"].any
1240
+ }),
1241
+ extraCSSRules: _propTypes["default"].shape({
1242
+ names: _propTypes["default"].arrayOf(_propTypes["default"].string),
1243
+ rules: _propTypes["default"].string
1244
+ }),
1245
+ languageCharactersProps: _propTypes["default"].arrayOf(_propTypes["default"].shape({
1246
+ language: _propTypes["default"].string,
1247
+ characterIcon: _propTypes["default"].string,
1248
+ characters: _propTypes["default"].arrayOf(_propTypes["default"].arrayOf(_propTypes["default"].string))
1249
+ })),
1250
+ runSerializationOnMarkup: _propTypes["default"].func,
1251
+ toolbarOpts: _propTypes["default"].shape({
1252
+ position: _propTypes["default"].oneOf(['bottom', 'top']),
1253
+ alignment: _propTypes["default"].oneOf(['left', 'right']),
1254
+ alwaysVisible: _propTypes["default"].bool,
1255
+ showDone: _propTypes["default"].bool,
1256
+ doneOn: _propTypes["default"].string,
1257
+ minWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])
1258
+ }),
1259
+ activePlugins: _propTypes["default"].arrayOf(function (values) {
1260
+ var allValid = values.every(function (v) {
1261
+ return _plugins.ALL_PLUGINS.includes(v);
1262
+ });
1263
+ return !allValid && new Error("Invalid values: ".concat(values, ", values must be one of [").concat(_plugins.ALL_PLUGINS.join(','), "]"));
1264
+ }),
1265
+ className: _propTypes["default"].string,
1266
+ maxImageWidth: _propTypes["default"].number,
1267
+ maxImageHeight: _propTypes["default"].number
1268
+ });
1269
+ (0, _defineProperty2["default"])(Editor, "defaultProps", {
1270
+ disableUnderline: true,
1271
+ onFocus: function onFocus() {},
1272
+ onBlur: function onBlur() {},
1273
+ onKeyDown: function onKeyDown() {},
1274
+ runSerializationOnMarkup: function runSerializationOnMarkup() {},
1275
+ mathMlOptions: {
1276
+ mmlOutput: false,
1277
+ mmlEditing: false
1278
+ },
1279
+ toolbarOpts: defaultToolbarOpts,
1280
+ responseAreaProps: defaultResponseAreaProps,
1281
+ languageCharactersProps: defaultLanguageCharactersProps,
1282
+ extraCSSRules: null,
1283
+ isEditor: false
1284
+ });
1285
+ var styles = {
1286
+ withBg: {
1287
+ backgroundColor: 'rgba(0,0,0,0.06)'
1288
+ },
1289
+ scheduled: {
1290
+ opacity: 0.5,
1291
+ pointerEvents: 'none',
1292
+ position: 'relative'
1293
+ },
1294
+ uploading: {
1295
+ position: 'absolute',
1296
+ top: '50%',
1297
+ left: '50%',
1298
+ transform: 'translate(-50%, -50%)'
1299
+ },
1300
+ slateEditor: {
1301
+ fontFamily: 'Roboto, sans-serif',
1302
+ '& table': {
1303
+ tableLayout: 'fixed',
1304
+ width: '100%',
1305
+ borderCollapse: 'collapse',
1306
+ color: _renderUi.color.text(),
1307
+ backgroundColor: _renderUi.color.background()
1308
+ },
1309
+ '& table:not([border="1"]) tr': {
1310
+ borderTop: '1px solid #dfe2e5' // TODO perhaps secondary color for background, for now disable
1311
+ // '&:nth-child(2n)': {
1312
+ // backgroundColor: '#f6f8fa'
1313
+ // }
1314
+
1315
+ },
1316
+ '& td, th': {
1317
+ padding: '.6em 1em',
1318
+ textAlign: 'center'
1319
+ },
1320
+ '& table:not([border="1"]) td, th': {
1321
+ border: '1px solid #dfe2e5'
1322
+ }
1323
+ },
1324
+ showParagraph: {
1325
+ // a div that has a div after it
1326
+ '& > div:has(+ div)::after': {
1327
+ display: 'block',
1328
+ content: '"¶"',
1329
+ fontSize: '1em',
1330
+ color: '#146EB3'
1331
+ }
1332
+ },
1333
+ separateParagraph: {
1334
+ // a div that has a div after it
1335
+ '& > div:has(+ div)': {
1336
+ marginBottom: '1em'
1337
+ }
1338
+ },
1339
+ toolbarOnTop: {
1340
+ marginTop: '45px'
1341
+ },
1342
+ noPadding: {
1343
+ padding: '0 !important'
1344
+ },
1345
+ previewText: {
1346
+ marginBottom: '36px',
1347
+ marginTop: '6px',
1348
+ padding: '20px',
1349
+ backgroundColor: 'rgba(0,0,0,0.06)'
1350
+ }
1351
+ };
1352
+
1353
+ var _default = (0, _styles.withStyles)(styles)(Editor);
1354
+
1355
+ exports["default"] = _default;
1356
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanN4Il0sIm5hbWVzIjpbImxvZyIsImRlZmF1bHRUb29sYmFyT3B0cyIsInBvc2l0aW9uIiwiYWxpZ25tZW50IiwiYWx3YXlzVmlzaWJsZSIsInNob3dEb25lIiwiZG9uZU9uIiwiZGVmYXVsdFJlc3BvbnNlQXJlYVByb3BzIiwib3B0aW9ucyIsInJlc3BBcmVhVG9vbGJhciIsIm9uSGFuZGxlQXJlYUNoYW5nZSIsImRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsImNyZWF0ZVRvb2xiYXJPcHRzIiwidG9vbGJhck9wdHMiLCJlcnJvciIsImlzSHRtbE1vZGUiLCJNQVhfQ0hBUkFDVEVSU19MSU1JVCIsIkVkaXRvciIsInByb3BzIiwiaW50ZXJhY3RlZCIsImtleXBhZEludGVyYWN0aW9uRGV0ZWN0ZWQiLCJvcGVuIiwiZXh0cmFEaWFsb2dQcm9wcyIsImNhbGxiYWNrIiwic2V0U3RhdGUiLCJkaWFsb2ciLCJwcmV2U3RhdGUiLCJpc0VkaXRlZEluSHRtbE1vZGUiLCJzdGF0ZSIsIm5ld1Rvb2xiYXJPcHRzIiwibm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzIiwicmVzcG9uc2VBcmVhUHJvcHMiLCJodG1sUGx1Z2luT3B0cyIsImN1cnJlbnRWYWx1ZSIsInZhbHVlIiwidG9nZ2xlSHRtbE1vZGUiLCJoYW5kbGVBbGVydERpYWxvZyIsImhhbmRsZURpYWxvZyIsInBsdWdpblByb3BzIiwiY3VzdG9tUGx1Z2lucyIsInBsdWdpbnMiLCJhY3RpdmVQbHVnaW5zIiwibWF0aCIsIm9uQ2xpY2siLCJvbk1hdGhDbGljayIsIm9uRm9jdXMiLCJvblBsdWdpbkZvY3VzIiwib25CbHVyIiwib25QbHVnaW5CbHVyIiwibWF0aE1sT3B0aW9ucyIsInRleHRBbGlnbiIsImdldFZhbHVlIiwib25DaGFuZ2UiLCJodG1sIiwiZXh0cmFDU1NSdWxlcyIsImltYWdlIiwiZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9ucyIsIm9uRGVsZXRlIiwiaW1hZ2VTdXBwb3J0Iiwibm9kZSIsImRvbmUiLCJzcmMiLCJkYXRhIiwiZ2V0IiwiZSIsIm5ld1BlbmRpbmdJbWFnZXMiLCJwZW5kaW5nSW1hZ2VzIiwiZmlsdGVyIiwiaW1nIiwia2V5Iiwib2xkU2NoZWR1bGVkIiwic2NoZWR1bGVkIiwibmV3U3RhdGUiLCJsZW5ndGgiLCJpbnNlcnRJbWFnZVJlcXVlc3RlZCIsImFkZGVkSW1hZ2UiLCJnZXRIYW5kbGVyIiwib25GaW5pc2giLCJyZXN1bHQiLCJjYiIsIm9uRWRpdGluZ0RvbmUiLCJiaW5kIiwiaGFuZGxlciIsImFkZCIsIm1heEltYWdlV2lkdGgiLCJtYXhJbWFnZUhlaWdodCIsInRvb2xiYXIiLCJkaXNhYmxlU2Nyb2xsYmFyIiwiZGlzYWJsZVVuZGVybGluZSIsImF1dG9XaWR0aCIsImF1dG9XaWR0aFRvb2xiYXIiLCJvbkRvbmUiLCJub25FbXB0eSIsInRvb2xiYXJJbkZvY3VzIiwiZm9jdXNlZE5vZGUiLCJmb2N1c1Rvb2xiYXIiLCJlZGl0b3IiLCJibHVyIiwic3RhcnRUZXh0IiwidGV4dCIsInJlc2V0VmFsdWUiLCJ0aGVuIiwidGFibGUiLCJyZXNwb25zZUFyZWEiLCJ0eXBlIiwibWF4UmVzcG9uc2VBcmVhcyIsImxhbmd1YWdlQ2hhcmFjdGVycyIsImxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzIiwia2V5UGFkQ2hhcmFjdGVyUmVmIiwic2V0S2V5cGFkSW50ZXJhY3Rpb24iLCJtZWRpYSIsImZvY3VzIiwiY3JlYXRlQ2hhbmdlIiwiY2hhbmdlIiwidXBsb2FkU291bmRTdXBwb3J0IiwibW1sT3V0cHV0IiwibW1sRWRpdGluZyIsInJ1blNlcmlhbGl6YXRpb25Pbk1hcmt1cCIsInJlbGF0ZWRUYXJnZXQiLCJ0YXJnZXQiLCJzdGFzaGVkVmFsdWUiLCJzdGFzaFZhbHVlIiwiYyIsImNvbGxhcHNlVG9TdGFydE9mIiwic2VsZWN0ZWROb2RlIiwiZG9jdW1lbnQiLCJwcmV2aWV3VGV4dCIsInJlbmRlckh0bWxQcmV2aWV3Q29udGVudCIsIm9wZW5IdG1sTW9kZUNvbmZpcm1hdGlvbkRpYWxvZyIsImNsYXNzZXMiLCJyZWYiLCJlbGVtZW50UmVmIiwidGl0bGUiLCJvbkNvbmZpcm1UZXh0Iiwib25DbG9zZVRleHQiLCJvbkNvbmZpcm0iLCJoYW5kbGVIdG1sTW9kZVNhdmVDb25maXJtYXRpb24iLCJvbkNsb3NlIiwiaHRtbE1vZGVDb250aW51ZUVkaXRpbmciLCJyZXNvbHZlIiwiZXZlbnQiLCJ0b29sYmFyRWxlbWVudCIsInRvb2xiYXJSZWYiLCJjbG9zZXN0IiwiY2xhc3NOYW1lIiwiaXNSYXdEb25lQnV0dG9uIiwiZG9uZUJ1dHRvblJlZiIsImN1cnJlbnQiLCJza2lwQmx1ckhhbmRsaW5nIiwiUHJvbWlzZSIsInByZUJsdXJWYWx1ZSIsImhhbmRsZUJsdXIiLCJlZGl0b3JET00iLCJxdWVyeVNlbGVjdG9yIiwic2V0VGltZW91dCIsInN0YXRlVmFsdWUiLCJ3cmFwcGVyUmVmIiwiZWRpdG9yRWxlbWVudCIsImFjdGl2ZUVsZW1lbnQiLCJpc0luQ3VycmVudENvbXBvbmVudCIsImNvbnRhaW5zIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZURvbUJsdXIiLCJpc0ZvY3VzZWQiLCJpc1RvdWNoRGV2aWNlIiwid2luZG93IiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJfX1RFTVBPUkFSWV9DSEFOR0VfREFUQSIsImRvbUVsIiwic2V0Tm9kZUJ5S2V5IiwiYWRkRXZlbnRMaXN0ZW5lciIsInNob3VsZEZvY3VzRWRpdG9yIiwiZm9yY2UiLCJzdG9wUmVzZXQiLCJyZWR1Y2UiLCJzIiwicCIsInRvT2JqZWN0IiwibmV3VmFsdWUiLCJWYWx1ZSIsImZyb21KU09OIiwidG9KU09OIiwibWUiLCJjaGFyYWN0ZXJzTGltaXQiLCJsaW1pdCIsImhhbmRsZVBsdWdpbnMiLCJ2IiwiY2FsY1JlZ2V4IiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJtYXRjaCIsInBhcnNlSW50IiwiaXNOYU4iLCJvYmplY3QiLCJsYXN0Iiwibm9kZXMiLCJwYXJlbnQiLCJnZXRQYXJlbnQiLCJCbG9jayIsInBvcyIsImRyb3BDb250ZXh0IiwidHJhbnNmZXIiLCJmaWxlIiwiZmlsZXMiLCJmcmFnbWVudCIsImlubGluZSIsIklubGluZSIsImNyZWF0ZSIsImlzVm9pZCIsImxvYWRpbmciLCJyYW5nZSIsInNlbGVjdCIsImNoIiwiaW5zZXJ0SW5saW5lIiwiSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiZmlsZUNob3NlbiIsImluc2VydEZyYWdtZW50Iiwic2VsZWN0aW9uIiwic3RhcnRCbG9jayIsImRlZmF1bHRCbG9jayIsImRlZmF1bHRNYXJrcyIsImdldEluc2VydE1hcmtzQXRSYW5nZSIsImZyYWciLCJQbGFpbiIsImRlc2VyaWFsaXplIiwicGxhY2Vob2xkZXIiLCJzaXplIiwiaXNFbXB0eSIsImRpc3BsYXkiLCJ3aWR0aCIsIm1heFdpZHRoIiwid2hpdGVTcGFjZSIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwidXNlclNlbGVjdCIsIlJlYWN0IiwiY3JlYXRlUmVmIiwiaGFuZGxlVG9vbGJhckZvY3VzIiwiaGFuZGxlVG9vbGJhckJsdXIiLCJvblJlc2l6ZSIsInRvb2xiYXJDb250YWluc0ZvY3VzIiwib25SZWYiLCJpc1Jlc3BvbnNlQXJlYUVkaXRvciIsImluY2x1ZGVzIiwicmVzcG9uc2VBcmVhRWRpdG9yIiwic2V0QXR0cmlidXRlIiwiYXV0b0ZvY3VzIiwibmV4dFByb3BzIiwiZGlmZmVyZW50Q2hhcmFjdGVyUHJvcHMiLCJkaWZmZXJlbnRNYXRoTWxQcm9wcyIsImRpZmZlcmVudEltYWdlTWF4RGltZW5zaW9uc1Byb3BzIiwiZXF1YWxzIiwicHJldlByb3BzIiwiemVyb1dpZHRoRWxzIiwicXVlcnlTZWxlY3RvckFsbCIsIkFycmF5IiwiZnJvbSIsImZvckVhY2giLCJlbCIsInN0eWxlIiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJoZWlnaHQiLCJtYXhIZWlnaHQiLCJ2YWx1ZVRvU2l6ZSIsImRpc2FibGVkIiwic3BlbGxDaGVjayIsImhpZ2hsaWdodFNoYXBlIiwiaXNFZGl0b3IiLCJvbktleURvd24iLCJzaG93UGFyYWdyYXBocyIsInNlcGFyYXRlUGFyYWdyYXBocyIsIm90aGVyUGx1Z2luUHJvcHMiLCJzaXplU3R5bGUiLCJidWlsZFNpemVTdHlsZSIsIm5hbWVzIiwid2l0aEJnIiwidG9vbGJhck9uVG9wIiwidXBsb2FkaW5nIiwiciIsInNsYXRlRWRpdG9yIiwiZWRpdG9yUmVmIiwiZ2V0Rm9jdXNlZFZhbHVlIiwib25Ecm9wUGFzdGUiLCJub3JtYWxpemUiLCJub1BhZGRpbmciLCJzaG93UGFyYWdyYXBoIiwic2VwYXJhdGVQYXJhZ3JhcGgiLCJyZW5kZXJQbGFjZWhvbGRlciIsImNoYW5nZURhdGEiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJib29sIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJhbnkiLCJTbGF0ZVR5cGVzIiwic2hhcGUiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJvbmVPZiIsImFycmF5T2YiLCJydWxlcyIsImxhbmd1YWdlIiwiY2hhcmFjdGVySWNvbiIsImNoYXJhY3RlcnMiLCJ2YWx1ZXMiLCJhbGxWYWxpZCIsImV2ZXJ5IiwiQUxMX1BMVUdJTlMiLCJFcnJvciIsImpvaW4iLCJzdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ0b3AiLCJsZWZ0IiwidHJhbnNmb3JtIiwiZm9udEZhbWlseSIsInRhYmxlTGF5b3V0IiwiYm9yZGVyQ29sbGFwc2UiLCJjb2xvciIsImJhY2tncm91bmQiLCJib3JkZXJUb3AiLCJwYWRkaW5nIiwiYm9yZGVyIiwiY29udGVudCIsImZvbnRTaXplIiwibWFyZ2luQm90dG9tIiwibWFyZ2luVG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFHQTs7OztBQUNBOztB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V0QsTUFBWCxFQUFtQnpTLE1BQW5CLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRWRpdG9yIGFzIFNsYXRlRWRpdG9yLCBmaW5kTm9kZSwgZ2V0RXZlbnRSYW5nZSwgZ2V0RXZlbnRUcmFuc2ZlciB9IGZyb20gJ3NsYXRlLXJlYWN0JztcbmltcG9ydCBTbGF0ZVR5cGVzIGZyb20gJ3NsYXRlLXByb3AtdHlwZXMnO1xuaW1wb3J0IHsgVmFsdWUsIEJsb2NrLCBJbmxpbmUgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgUGxhaW4gZnJvbSAnc2xhdGUtcGxhaW4tc2VyaWFsaXplcic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyB3aXRoU3R5bGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvc3R5bGVzJztcblxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuaW1wb3J0IEFsZXJ0RGlhbG9nIGZyb20gJy4uLy4uL2NvbmZpZy11aS9zcmMvYWxlcnQtZGlhbG9nJztcbmltcG9ydCB7IFByZXZpZXdQcm9tcHQgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuXG5pbXBvcnQgeyBnZXRCYXNlNjQsIGh0bWxUb1ZhbHVlIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCBJbnNlcnRJbWFnZUhhbmRsZXIgZnJvbSAnLi9wbHVnaW5zL2ltYWdlL2luc2VydC1pbWFnZS1oYW5kbGVyJztcbmltcG9ydCAqIGFzIHNlcmlhbGl6YXRpb24gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGJ1aWxkUGx1Z2lucywgQUxMX1BMVUdJTlMsIERFRkFVTFRfUExVR0lOUyB9IGZyb20gJy4vcGx1Z2lucyc7XG5cbmV4cG9ydCB7IEFMTF9QTFVHSU5TLCBERUZBVUxUX1BMVUdJTlMsIHNlcmlhbGl6YXRpb24gfTtcblxuY29uc3QgbG9nID0gZGVidWcoJ2VkaXRhYmxlLWh0bWw6ZWRpdG9yJyk7XG5cbmNvbnN0IGRlZmF1bHRUb29sYmFyT3B0cyA9IHtcbiAgcG9zaXRpb246ICdib3R0b20nLFxuICBhbGlnbm1lbnQ6ICdsZWZ0JyxcbiAgYWx3YXlzVmlzaWJsZTogZmFsc2UsXG4gIHNob3dEb25lOiB0cnVlLFxuICBkb25lT246ICdibHVyJyxcbn07XG5cbmNvbnN0IGRlZmF1bHRSZXNwb25zZUFyZWFQcm9wcyA9IHtcbiAgb3B0aW9uczoge30sXG4gIHJlc3BBcmVhVG9vbGJhcjogKCkgPT4ge30sXG4gIG9uSGFuZGxlQXJlYUNoYW5nZTogKCkgPT4ge30sXG59O1xuXG5jb25zdCBkZWZhdWx0TGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHMgPSBbXTtcblxuY29uc3QgY3JlYXRlVG9vbGJhck9wdHMgPSAodG9vbGJhck9wdHMsIGVycm9yLCBpc0h0bWxNb2RlKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdFRvb2xiYXJPcHRzLFxuICAgIC4uLnRvb2xiYXJPcHRzLFxuICAgIGVycm9yLFxuICAgIGlzSHRtbE1vZGUsXG4gIH07XG59O1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSBlZGl0b3IgY2FuIHN1cHBvcnRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9DSEFSQUNURVJTX0xJTUlUID0gMTAwMDAwMDtcblxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBlZGl0b3JSZWY6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5hbnksXG4gICAgb25SZWY6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbktleURvd246IFByb3BUeXBlcy5mdW5jLFxuICAgIGZvY3VzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBTbGF0ZVR5cGVzLnZhbHVlLmlzUmVxdWlyZWQsXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG1hdGhNbE9wdGlvbnM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBtbWxPdXRwdXQ6IFByb3BUeXBlcy5ib29sLFxuICAgICAgbW1sRWRpdGluZzogUHJvcFR5cGVzLmJvb2wsXG4gICAgfSksXG4gICAgZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9uczogUHJvcFR5cGVzLmJvb2wsXG4gICAgdXBsb2FkU291bmRTdXBwb3J0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWRkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgfSksXG4gICAgY2hhcmFjdGVyc0xpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgbWluV2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICBtYXhXaWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIG1pbkhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIG1heEhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBoaWdobGlnaHRTaGFwZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHNwZWxsQ2hlY2s6IFByb3BUeXBlcy5ib29sLFxuICAgIG5vbkVtcHR5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlU2Nyb2xsYmFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlVW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBhdXRvV2lkdGhUb29sYmFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBwbHVnaW5Qcm9wczogUHJvcFR5cGVzLmFueSxcbiAgICAvLyBjdXN0b21QbHVnaW5zIHNob3VsZCBiZSBpbnNpZGUgcGx1Z2luUHJvcHMgKGEgcHJvcGVydHkgaW5zaWRlIHBsdWdpblByb3BzKVxuICAgIC8vICAgY3VzdG9tUGx1Z2luczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgLy8gICAgICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvLyAgICAgICAgIGV2ZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8vICAgICAgICAgaWNvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvLyAgICAgICAgIGljb25UeXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8vICAgICAgICAgaWNvbkFsdDogUHJvcFR5cGVzLnN0cmluZ1xuICAgIC8vICAgICAgIH0pLFxuICAgIC8vICAgKSxcbiAgICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc0VkaXRvcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmVzcG9uc2VBcmVhUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAnaW5saW5lLWRyb3Bkb3duJyxcbiAgICAgICAgJ2RyYWctaW4tdGhlLWJsYW5rJyxcbiAgICAgICAgJ21hdGgtdGVtcGxhdGVkJyxcbiAgICAgIF0pLFxuICAgICAgb3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkhhbmRsZUFyZWFDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgbWF4UmVzcG9uc2VBcmVhczogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIGVycm9yOiBQcm9wVHlwZXMuYW55LFxuICAgIH0pLFxuICAgIGV4dHJhQ1NTUnVsZXM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBuYW1lczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgICBydWxlczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYW5ndWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgY2hhcmFjdGVySWNvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgY2hhcmFjdGVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZykpLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBydW5TZXJpYWxpemF0aW9uT25NYXJrdXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIHRvb2xiYXJPcHRzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSksXG4gICAgICBhbGlnbm1lbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG4gICAgICBhbHdheXNWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIHNob3dEb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGRvbmVPbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIG1pbldpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgfSksXG4gICAgYWN0aXZlUGx1Z2luczogUHJvcFR5cGVzLmFycmF5T2YoKHZhbHVlcykgPT4ge1xuICAgICAgY29uc3QgYWxsVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKHYpID0+IEFMTF9QTFVHSU5TLmluY2x1ZGVzKHYpKTtcblxuICAgICAgcmV0dXJuICFhbGxWYWxpZCAmJiBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVzOiAke3ZhbHVlc30sIHZhbHVlcyBtdXN0IGJlIG9uZSBvZiBbJHtBTExfUExVR0lOUy5qb2luKCcsJyl9XWApO1xuICAgIH0pLFxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBtYXhJbWFnZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG1heEltYWdlSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGlzYWJsZVVuZGVybGluZTogdHJ1ZSxcbiAgICBvbkZvY3VzOiAoKSA9PiB7fSxcbiAgICBvbkJsdXI6ICgpID0+IHt9LFxuICAgIG9uS2V5RG93bjogKCkgPT4ge30sXG4gICAgcnVuU2VyaWFsaXphdGlvbk9uTWFya3VwOiAoKSA9PiB7fSxcbiAgICBtYXRoTWxPcHRpb25zOiB7XG4gICAgICBtbWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgbW1sRWRpdGluZzogZmFsc2UsXG4gICAgfSxcbiAgICB0b29sYmFyT3B0czogZGVmYXVsdFRvb2xiYXJPcHRzLFxuICAgIHJlc3BvbnNlQXJlYVByb3BzOiBkZWZhdWx0UmVzcG9uc2VBcmVhUHJvcHMsXG4gICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM6IGRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyxcbiAgICBleHRyYUNTU1J1bGVzOiBudWxsLFxuICAgIGlzRWRpdG9yOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmFsdWU6IHByb3BzLnZhbHVlLFxuICAgICAgdG9vbGJhck9wdHM6IGNyZWF0ZVRvb2xiYXJPcHRzKHByb3BzLnRvb2xiYXJPcHRzLCBwcm9wcy5lcnJvciksXG4gICAgICBwZW5kaW5nSW1hZ2VzOiBbXSxcbiAgICAgIGlzSHRtbE1vZGU6IGZhbHNlLFxuICAgICAgaXNFZGl0ZWRJbkh0bWxNb2RlOiBmYWxzZSxcbiAgICAgIGZvY3VzVG9vbGJhcjogZmFsc2UsXG4gICAgICBkaWFsb2c6IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLmtleVBhZENoYXJhY3RlclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMuZG9uZUJ1dHRvblJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMua2V5cGFkSW50ZXJhY3Rpb25EZXRlY3RlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy50b2dnbGVIdG1sTW9kZSA9IHRoaXMudG9nZ2xlSHRtbE1vZGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVRvb2xiYXJGb2N1cyA9IHRoaXMuaGFuZGxlVG9vbGJhckZvY3VzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVUb29sYmFyQmx1ciA9IHRoaXMuaGFuZGxlVG9vbGJhckJsdXIuYmluZCh0aGlzKTtcblxuICAgIHRoaXMub25SZXNpemUgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaXNIdG1sTW9kZSAmJiBwcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICBwcm9wcy5vbkNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LCA1MCk7XG5cbiAgICB0aGlzLmhhbmRsZVBsdWdpbnModGhpcy5wcm9wcyk7XG4gIH1cblxuICBoYW5kbGVUb29sYmFyRm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZm9jdXNUb29sYmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzVG9vbGJhcjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHNldEtleXBhZEludGVyYWN0aW9uID0gKGludGVyYWN0ZWQpID0+IHtcbiAgICB0aGlzLmtleXBhZEludGVyYWN0aW9uRGV0ZWN0ZWQgPSBpbnRlcmFjdGVkO1xuICB9O1xuXG4gIGhhbmRsZVRvb2xiYXJCbHVyKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnRvb2xiYXJDb250YWluc0ZvY3VzKCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzVG9vbGJhcjogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICB0b29sYmFyQ29udGFpbnNGb2N1cygpIHtcbiAgICBpZiAoIXRoaXMudG9vbGJhclJlZikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvb2xiYXJFbGVtZW50ID0gdGhpcy50b29sYmFyUmVmO1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgcmV0dXJuIHRvb2xiYXJFbGVtZW50ICYmIHRvb2xiYXJFbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgaGFuZGxlRGlhbG9nID0gKG9wZW4sIGV4dHJhRGlhbG9nUHJvcHMgPSB7fSwgY2FsbGJhY2spID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAge1xuICAgICAgICBkaWFsb2c6IHtcbiAgICAgICAgICBvcGVuLFxuICAgICAgICAgIC4uLmV4dHJhRGlhbG9nUHJvcHMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY2FsbGJhY2ssXG4gICAgKTtcbiAgfTtcblxuICB0b2dnbGVIdG1sTW9kZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgaXNIdG1sTW9kZTogIXByZXZTdGF0ZS5pc0h0bWxNb2RlLFxuICAgICAgICBpc0VkaXRlZEluSHRtbE1vZGU6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHsgdG9vbGJhck9wdHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IG5ld1Rvb2xiYXJPcHRzID0gY3JlYXRlVG9vbGJhck9wdHModG9vbGJhck9wdHMsIGVycm9yLCB0aGlzLnN0YXRlLmlzSHRtbE1vZGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB0b29sYmFyT3B0czogbmV3VG9vbGJhck9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9O1xuXG4gIGhhbmRsZVBsdWdpbnMgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UmVzcG9uc2VBcmVhUHJvcHMsXG4gICAgICAuLi5wcm9wcy5yZXNwb25zZUFyZWFQcm9wcyxcbiAgICB9O1xuXG4gICAgY29uc3QgaHRtbFBsdWdpbk9wdHMgPSB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMucHJvcHMudmFsdWUsXG4gICAgICBpc0h0bWxNb2RlOiB0aGlzLnN0YXRlLmlzSHRtbE1vZGUsXG4gICAgICBpc0VkaXRlZEluSHRtbE1vZGU6IHRoaXMuc3RhdGUuaXNFZGl0ZWRJbkh0bWxNb2RlLFxuICAgICAgdG9nZ2xlSHRtbE1vZGU6IHRoaXMudG9nZ2xlSHRtbE1vZGUsXG4gICAgICBoYW5kbGVBbGVydERpYWxvZzogdGhpcy5oYW5kbGVEaWFsb2csXG4gICAgfTtcbiAgICBsZXQgeyBjdXN0b21QbHVnaW5zIH0gPSBwcm9wcy5wbHVnaW5Qcm9wcyB8fCB7fTtcbiAgICBjdXN0b21QbHVnaW5zID0gY3VzdG9tUGx1Z2lucyB8fCBbXTtcblxuICAgIHRoaXMucGx1Z2lucyA9IGJ1aWxkUGx1Z2lucyhwcm9wcy5hY3RpdmVQbHVnaW5zLCBjdXN0b21QbHVnaW5zLCB7XG4gICAgICBtYXRoOiB7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub25NYXRoQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IHRoaXMub25QbHVnaW5Gb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uUGx1Z2luQmx1cixcbiAgICAgICAgLi4ucHJvcHMubWF0aE1sT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICB0ZXh0QWxpZ246IHtcbiAgICAgICAgZ2V0VmFsdWU6ICgpID0+IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLFxuICAgICAgfSxcbiAgICAgIGh0bWw6IGh0bWxQbHVnaW5PcHRzLFxuICAgICAgZXh0cmFDU1NSdWxlczogcHJvcHMuZXh0cmFDU1NSdWxlcyB8fCB7fSxcbiAgICAgIGltYWdlOiB7XG4gICAgICAgIGRpc2FibGVJbWFnZUFsaWdubWVudEJ1dHRvbnM6IHByb3BzLmRpc2FibGVJbWFnZUFsaWdubWVudEJ1dHRvbnMsXG4gICAgICAgIG9uRGVsZXRlOlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydCAmJlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydC5kZWxldGUgJiZcbiAgICAgICAgICAoKG5vZGUsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IG5vZGUuZGF0YS5nZXQoJ3NyYycpO1xuXG4gICAgICAgICAgICBwcm9wcy5pbWFnZVN1cHBvcnQuZGVsZXRlKHNyYywgKGUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3UGVuZGluZ0ltYWdlcyA9IHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlcy5maWx0ZXIoKGltZykgPT4gaW1nLmtleSAhPT0gbm9kZS5rZXkpO1xuICAgICAgICAgICAgICBjb25zdCB7IHNjaGVkdWxlZDogb2xkU2NoZWR1bGVkIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nSW1hZ2VzOiBuZXdQZW5kaW5nSW1hZ2VzLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZDogb2xkU2NoZWR1bGVkICYmIG5ld1BlbmRpbmdJbWFnZXMubGVuZ3RoID09PSAwID8gZmFsc2UgOiBvbGRTY2hlZHVsZWQsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSwgKCkgPT4gZG9uZShlLCB0aGlzLnN0YXRlLnZhbHVlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgaW5zZXJ0SW1hZ2VSZXF1ZXN0ZWQ6XG4gICAgICAgICAgcHJvcHMuaW1hZ2VTdXBwb3J0ICYmXG4gICAgICAgICAgKChhZGRlZEltYWdlLCBnZXRIYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHBlbmRpbmdJbWFnZXMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBvbkZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNjaGVkdWxlZCAmJiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5pc2ggZWRpdGluZyBvbmx5IG9uIHN1Y2Nlc3NcbiAgICAgICAgICAgICAgICBjYiA9IHRoaXMub25FZGl0aW5nRG9uZS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgbmV3UGVuZGluZ0ltYWdlcyA9IHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlcy5maWx0ZXIoKGltZykgPT4gaW1nLmtleSAhPT0gYWRkZWRJbWFnZS5rZXkpO1xuICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nSW1hZ2VzOiBuZXdQZW5kaW5nSW1hZ2VzLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChuZXdQZW5kaW5nSW1hZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLnNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSwgY2IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogVGhlIGhhbmRsZXIgaXMgdGhlIG9iamVjdCB0aHJvdWdoIHdoaWNoIHRoZSBvdXRlciBjb250ZXh0XG4gICAgICAgICAgICAgICAqIGNvbW11bmljYXRlcyBmaWxlIHVwbG9hZCBldmVudHMgbGlrZTogZmlsZUNob3NlbiwgY2FuY2VsLCBwcm9ncmVzc1xuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGdldEhhbmRsZXIob25GaW5pc2gsICgpID0+IHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgICAgICAgICBwcm9wcy5pbWFnZVN1cHBvcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdJbWFnZXM6IFsuLi5wZW5kaW5nSW1hZ2VzLCBhZGRlZEltYWdlXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBvbkZvY3VzOiB0aGlzLm9uUGx1Z2luRm9jdXMsXG4gICAgICAgIG9uQmx1cjogdGhpcy5vblBsdWdpbkJsdXIsXG4gICAgICAgIG1heEltYWdlV2lkdGg6IHByb3BzLm1heEltYWdlV2lkdGgsXG4gICAgICAgIG1heEltYWdlSGVpZ2h0OiBwcm9wcy5tYXhJbWFnZUhlaWdodCxcbiAgICAgIH0sXG4gICAgICB0b29sYmFyOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUbyBtaW5pbWl6ZSBjb252ZXJ0aW5nIGh0bWwgLT4gc3RhdGUgLT4gaHRtbFxuICAgICAgICAgKiBXZSBvbmx5IGVtaXQgbWFya3VwIG9uY2UgJ2RvbmUnIGlzIGNsaWNrZWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaXNhYmxlU2Nyb2xsYmFyOiAhIXByb3BzLmRpc2FibGVTY3JvbGxiYXIsXG4gICAgICAgIGRpc2FibGVVbmRlcmxpbmU6IHByb3BzLmRpc2FibGVVbmRlcmxpbmUsXG4gICAgICAgIGF1dG9XaWR0aDogcHJvcHMuYXV0b1dpZHRoVG9vbGJhcixcbiAgICAgICAgb25Eb25lOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBub25FbXB0eSB9ID0gcHJvcHM7XG5cbiAgICAgICAgICBsb2coJ1tvbkRvbmVdJyk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRvb2xiYXJJbkZvY3VzOiBmYWxzZSwgZm9jdXNlZE5vZGU6IG51bGwsIGZvY3VzVG9vbGJhcjogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5lZGl0b3IuYmx1cigpO1xuXG4gICAgICAgICAgaWYgKG5vbkVtcHR5ICYmIHRoaXMuc3RhdGUudmFsdWUuc3RhcnRUZXh0Py50ZXh0Py5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRWYWx1ZSh0cnVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbkVkaXRpbmdEb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkVkaXRpbmdEb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhYmxlOiB7XG4gICAgICAgIG9uRm9jdXM6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkZvY3VzXS4uLicpO1xuICAgICAgICAgIHRoaXMub25QbHVnaW5Gb2N1cygpO1xuICAgICAgICB9LFxuICAgICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkJsdXJdLi4uJyk7XG4gICAgICAgICAgdGhpcy5vblBsdWdpbkJsdXIoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXNwb25zZUFyZWE6IHtcbiAgICAgICAgdHlwZTogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLnR5cGUsXG4gICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy5vcHRpb25zLFxuICAgICAgICBtYXhSZXNwb25zZUFyZWFzOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMubWF4UmVzcG9uc2VBcmVhcyxcbiAgICAgICAgcmVzcEFyZWFUb29sYmFyOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMucmVzcEFyZWFUb29sYmFyLFxuICAgICAgICBvbkhhbmRsZUFyZWFDaGFuZ2U6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy5vbkhhbmRsZUFyZWFDaGFuZ2UsXG4gICAgICAgIGVycm9yOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMuZXJyb3IsXG4gICAgICAgIG9uRm9jdXM6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkZvY3VzXS4uLicpO1xuICAgICAgICAgIHRoaXMub25QbHVnaW5Gb2N1cygpO1xuICAgICAgICB9LFxuICAgICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgICBsb2coJ1t0YWJsZTpvbkJsdXJdLi4uJyk7XG4gICAgICAgICAgdGhpcy5vblBsdWdpbkJsdXIoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsYW5ndWFnZUNoYXJhY3RlcnM6IHByb3BzLmxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzLFxuICAgICAga2V5UGFkQ2hhcmFjdGVyUmVmOiB0aGlzLmtleVBhZENoYXJhY3RlclJlZixcbiAgICAgIHNldEtleXBhZEludGVyYWN0aW9uOiB0aGlzLnNldEtleXBhZEludGVyYWN0aW9uLFxuICAgICAgbWVkaWE6IHtcbiAgICAgICAgZm9jdXM6IHRoaXMuZm9jdXMsXG4gICAgICAgIGNyZWF0ZUNoYW5nZTogKCkgPT4gdGhpcy5zdGF0ZS52YWx1ZS5jaGFuZ2UoKSxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsXG4gICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydDogcHJvcHMudXBsb2FkU291bmRTdXBwb3J0LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5tYXRoTWxPcHRpb25zLm1tbE91dHB1dCB8fCBwcm9wcy5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMucnVuU2VyaWFsaXphdGlvbk9uTWFya3VwKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIG9uUmVmIGlzIG5lZWRlZCB0byBnZXQgdGhlIHJlZiBvZiB0aGUgY29tcG9uZW50IGJlY2F1c2Ugd2UgZXhwb3J0IGl0IHVzaW5nIHdpdGhTdHlsZXNcbiAgICB0aGlzLnByb3BzLm9uUmVmKHRoaXMpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25SZXNpemUpO1xuXG4gICAgY29uc3QgaXNSZXNwb25zZUFyZWFFZGl0b3IgPSB0aGlzLnByb3BzLmNsYXNzTmFtZT8uaW5jbHVkZXMoJ3Jlc3BvbnNlLWFyZWEtZWRpdG9yJyk7XG5cbiAgICBpZiAoaXNSZXNwb25zZUFyZWFFZGl0b3IgJiYgdGhpcy5lZGl0b3IpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJlYUVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5lZGl0b3IudmFsdWUuZG9jdW1lbnQua2V5fVwiXWApO1xuXG4gICAgICBpZiAocmVzcG9uc2VBcmVhRWRpdG9yKSB7XG4gICAgICAgIHJlc3BvbnNlQXJlYUVkaXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQW5zd2VyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdG9yICYmIHRoaXMucHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yRE9NID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEta2V5PVwiJHt0aGlzLmVkaXRvci52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYCk7XG5cbiAgICAgICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xuXG4gICAgICAgICAgaWYgKGVkaXRvckRPTSkge1xuICAgICAgICAgICAgZWRpdG9yRE9NLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBjb25zdCB7IGlzSHRtbE1vZGUsIHRvb2xiYXJPcHRzIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IG5ld1Rvb2xiYXJPcHRzID0gY3JlYXRlVG9vbGJhck9wdHMobmV4dFByb3BzLnRvb2xiYXJPcHRzLCBuZXh0UHJvcHMuZXJyb3IsIGlzSHRtbE1vZGUpO1xuXG4gICAgaWYgKCFpc0VxdWFsKG5ld1Rvb2xiYXJPcHRzLCB0b29sYmFyT3B0cykpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB0b29sYmFyT3B0czogbmV3VG9vbGJhck9wdHMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWZmZXJlbnRDaGFyYWN0ZXJQcm9wcyA9ICFpc0VxdWFsKG5leHRQcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcywgdGhpcy5wcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyk7XG4gICAgY29uc3QgZGlmZmVyZW50TWF0aE1sUHJvcHMgPSAhaXNFcXVhbChuZXh0UHJvcHMubWF0aE1sT3B0aW9ucywgdGhpcy5wcm9wcy5tYXRoTWxPcHRpb25zKTtcbiAgICBjb25zdCBkaWZmZXJlbnRJbWFnZU1heERpbWVuc2lvbnNQcm9wcyA9XG4gICAgICAhaXNFcXVhbChuZXh0UHJvcHMubWF4SW1hZ2VXaWR0aCwgdGhpcy5wcm9wcy5tYXhJbWFnZVdpZHRoKSB8fFxuICAgICAgIWlzRXF1YWwobmV4dFByb3BzLm1heEltYWdlSGVpZ2h0LCB0aGlzLnByb3BzLm1heEltYWdlSGVpZ2h0KTtcblxuICAgIGlmIChkaWZmZXJlbnRDaGFyYWN0ZXJQcm9wcyB8fCBkaWZmZXJlbnRNYXRoTWxQcm9wcyB8fCBkaWZmZXJlbnRJbWFnZU1heERpbWVuc2lvbnNQcm9wcykge1xuICAgICAgdGhpcy5oYW5kbGVQbHVnaW5zKG5leHRQcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKCFuZXh0UHJvcHMudmFsdWU/LmRvY3VtZW50Py5lcXVhbHModGhpcy5wcm9wcy52YWx1ZT8uZG9jdW1lbnQpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV4dFByb3BzLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgLy8gVGhlIGN1cnNvciBpcyBvbiBhIHplcm8gd2lkdGggZWxlbWVudCBhbmQgd2hlbiB0aGF0IGlzIHBsYWNlZCBuZWFyIHZvaWQgZWxlbWVudHMsIGl0IGlzIG5vdCB2aXNpYmxlXG4gICAgLy8gc28gd2UgaW5jcmVhc2UgdGhlIHdpZHRoIHRvIGF0IGxlYXN0IDJweCBpbiBvcmRlciBmb3IgdGhlIHVzZXIgdG8gc2VlIGl0XG5cbiAgICAvLyBUcmlnZ2VyIHBsdWdpbnMgYW5kIGZpbmlzaCBlZGl0aW5nIGlmOlxuICAgIC8vIDEuIFRoZSAnaXNIdG1sTW9kZScgc3RhdGUgaGFzIGJlZW4gdG9nZ2xlZC5cbiAgICAvLyAyLiBXZSdyZSBjdXJyZW50bHkgaW4gJ2lzSHRtbE1vZGUnIGFuZCB0aGUgZWRpdG9yIHZhbHVlIGhhcyBiZWVuIG1vZGlmaWVkLlxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuaXNIdG1sTW9kZSAhPT0gcHJldlN0YXRlLmlzSHRtbE1vZGUgfHxcbiAgICAgICh0aGlzLnN0YXRlLmlzSHRtbE1vZGUgJiYgIXByZXZTdGF0ZS5pc0VkaXRlZEluSHRtbE1vZGUgJiYgdGhpcy5zdGF0ZS5pc0VkaXRlZEluSHRtbE1vZGUpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZVBsdWdpbnModGhpcy5wcm9wcyk7XG4gICAgfVxuXG4gICAgY29uc3QgemVyb1dpZHRoRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xhdGUtemVyby13aWR0aD1cInpcIl0nKTtcblxuICAgIEFycmF5LmZyb20oemVyb1dpZHRoRWxzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuc3R5bGUubWluV2lkdGggPSAnMnB4JztcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICB9KTtcbiAgfVxuXG4gIG9uUGx1Z2luQmx1ciA9IChlKSA9PiB7XG4gICAgbG9nKCdbb25QbHVnaW5CbHVyXScsIGUgJiYgZS5yZWxhdGVkVGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXQgPSBlICYmIGUucmVsYXRlZFRhcmdldDtcblxuICAgIGNvbnN0IG5vZGUgPSB0YXJnZXQgPyBmaW5kTm9kZSh0YXJnZXQsIHRoaXMuc3RhdGUudmFsdWUpIDogbnVsbDtcbiAgICBsb2coJ1tvblBsdWdpbkJsdXJdIG5vZGU6ICcsIG5vZGUpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmb2N1c2VkTm9kZTogbm9kZSB9LCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc2V0VmFsdWUoKTtcbiAgICB9KTtcbiAgfTtcblxuICBvblBsdWdpbkZvY3VzID0gKGUpID0+IHtcbiAgICBsb2coJ1tvblBsdWdpbkZvY3VzXScsIGUgJiYgZS50YXJnZXQpO1xuICAgIGNvbnN0IHRhcmdldCA9IGUgJiYgZS50YXJnZXQ7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgY29uc3Qgbm9kZSA9IGZpbmROb2RlKHRhcmdldCwgdGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICBsb2coJ1tvblBsdWdpbkZvY3VzXSBub2RlOiAnLCBub2RlKTtcblxuICAgICAgY29uc3Qgc3Rhc2hlZFZhbHVlID0gdGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUgfHwgdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb2N1c2VkTm9kZTogbm9kZSwgc3Rhc2hlZFZhbHVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZE5vZGU6IG51bGwgfSk7XG4gICAgfVxuICAgIHRoaXMuc3Rhc2hWYWx1ZSgpO1xuICB9O1xuXG4gIG9uTWF0aENsaWNrID0gKG5vZGUpID0+IHtcbiAgICB0aGlzLmVkaXRvci5jaGFuZ2UoKGMpID0+IGMuY29sbGFwc2VUb1N0YXJ0T2Yobm9kZSkpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZE5vZGU6IG5vZGUgfSk7XG4gIH07XG5cbiAgb25FZGl0aW5nRG9uZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzSHRtbE1vZGUsIGRpYWxvZywgdmFsdWUsIHBlbmRpbmdJbWFnZXMgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAvLyBIYW5kbGluZyBIVE1MIG1vZGUgYW5kIGRpYWxvZyBzdGF0ZVxuICAgIGlmIChpc0h0bWxNb2RlKSB7XG4gICAgICAvLyBFYXJseSByZXR1cm4gaWYgSFRNTCBtb2RlIGlzIGVuYWJsZWRcbiAgICAgIGlmIChkaWFsb2c/Lm9wZW4pIHJldHVybjtcblxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gaHRtbFRvVmFsdWUodmFsdWUuZG9jdW1lbnQudGV4dCk7XG4gICAgICBjb25zdCBwcmV2aWV3VGV4dCA9IHRoaXMucmVuZGVySHRtbFByZXZpZXdDb250ZW50KCk7XG5cbiAgICAgIHRoaXMub3Blbkh0bWxNb2RlQ29uZmlybWF0aW9uRGlhbG9nKGN1cnJlbnRWYWx1ZSwgcHJldmlld1RleHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgLy8gc2NoZWR1bGUgaW1hZ2UgcHJvY2Vzc2luZ1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNjaGVkdWxlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5hbGl6aW5nIGVkaXRpbmdcbiAgICBsb2coJ1tvbkVkaXRpbmdEb25lXScpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBwZW5kaW5nSW1hZ2VzOiBbXSwgc3Rhc2hlZFZhbHVlOiBudWxsLCBmb2N1c2VkTm9kZTogbnVsbCB9KTtcbiAgICBsb2coJ1tvbkVkaXRpbmdEb25lXSB2YWx1ZTogJywgdGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCB0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgSFRNTCBwcmV2aWV3IGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIGluc2lkZSB0aGUgZGlhbG9nLlxuICAgKiBUaGlzIGNvbnRlbnQgaW5jbHVkZXMgdGhlIGVkaXRlZCBIVE1MIGFuZCBhIHByb21wdCBmb3IgdGhlIHVzZXIuXG4gICAqL1xuICByZW5kZXJIdG1sUHJldmlld0NvbnRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBjbGFzc2VzIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17KHJlZikgPT4gKHRoaXMuZWxlbWVudFJlZiA9IHJlZil9PlxuICAgICAgICA8ZGl2PlByZXZpZXcgb2YgRWRpdGVkIEh0bWw6PC9kaXY+XG4gICAgICAgIDxQcmV2aWV3UHJvbXB0IGRlZmF1bHRDbGFzc05hbWU9e2NsYXNzZXMucHJldmlld1RleHR9IHByb21wdD17dGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC50ZXh0fSAvPlxuICAgICAgICA8ZGl2PldvdWxkIHlvdSBsaWtlIHRvIHNhdmUgdGhlc2UgY2hhbmdlcyA/PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBPcGVucyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgaW4gSFRNTCBtb2RlLCBkaXNwbGF5aW5nIHRoZSBwcmV2aWV3IG9mIHRoZSBjdXJyZW50IEhUTUwgY29udGVudFxuICAgKiBhbmQgb2ZmZXJpbmcgb3B0aW9ucyB0byBzYXZlIG9yIGNvbnRpbnVlIGVkaXRpbmcuXG4gICAqL1xuICBvcGVuSHRtbE1vZGVDb25maXJtYXRpb25EaWFsb2cgPSAoY3VycmVudFZhbHVlLCBwcmV2aWV3VGV4dCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGlhbG9nOiB7XG4gICAgICAgIG9wZW46IHRydWUsXG4gICAgICAgIHRpdGxlOiAnQ29udGVudCBQcmV2aWV3ICYgU2F2ZScsXG4gICAgICAgIHRleHQ6IHByZXZpZXdUZXh0LFxuICAgICAgICBvbkNvbmZpcm1UZXh0OiAnU2F2ZSBjaGFuZ2VzJyxcbiAgICAgICAgb25DbG9zZVRleHQ6ICdDb250aW51ZSBlZGl0aW5nJyxcbiAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVIdG1sTW9kZVNhdmVDb25maXJtYXRpb24oY3VycmVudFZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogdGhpcy5odG1sTW9kZUNvbnRpbnVlRWRpdGluZyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHNhdmUgY29uZmlybWF0aW9uIGFjdGlvbiBpbiBIVE1MIG1vZGUuIFRoaXMgdXBkYXRlcyB0aGUgdmFsdWUgdG8gdGhlIGNvbmZpcm1lZFxuICAgKiBjb250ZW50LCB1cGRhdGVzIHZhbHVlIG9uIHByb3BzLCBhbmQgZXhpdHMgdGhlIEhUTUwgbW9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRWYWx1ZSAtIFRoZSBjb25maXJtZWQgdmFsdWUgb2YgdGhlIEhUTUwgY29udGVudCB0byBzYXZlLlxuICAgKi9cbiAgaGFuZGxlSHRtbE1vZGVTYXZlQ29uZmlybWF0aW9uID0gKGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogY3VycmVudFZhbHVlIH0pO1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UoY3VycmVudFZhbHVlLCB0cnVlKTtcbiAgICB0aGlzLmhhbmRsZURpYWxvZyhmYWxzZSk7XG4gICAgdGhpcy50b2dnbGVIdG1sTW9kZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRpYWxvZyBpbiBIVE1MIG1vZGUgYW5kIGFsbG93cyB0aGUgdXNlciB0byBjb250aW51ZSBlZGl0aW5nIHRoZSBodG1sIGNvbnRlbnQuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIHRoZSB1c2VyIG9wdHMgdG8gbm90IHNhdmUgdGhlIGN1cnJlbnQgY2hhbmdlcy5cbiAgICovXG4gIGh0bWxNb2RlQ29udGludWVFZGl0aW5nID0gKCkgPT4ge1xuICAgIHRoaXMuaGFuZGxlRGlhbG9nKGZhbHNlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIG9uUmVzaXplIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG4gIH1cblxuICAvLyBBbGxvd2luZyB0aW1lIGZvciBvbkNoYW5nZSB0byB0YWtlIGVmZmVjdCBpZiBpdCBpcyBjYWxsZWRcbiAgaGFuZGxlQmx1ciA9IChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgeyBub25FbXB0eSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICB0b29sYmFyT3B0czogeyBkb25lT24gfSxcbiAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyB0b29sYmFySW5Gb2N1czogZmFsc2UsIGZvY3VzZWROb2RlOiBudWxsIH0pO1xuXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5ibHVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGRvbmVPbiA9PT0gJ2JsdXInKSB7XG4gICAgICBpZiAobm9uRW1wdHkgJiYgdGhpcy5zdGF0ZS52YWx1ZS5zdGFydFRleHQ/LnRleHQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlc2V0VmFsdWUodHJ1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkVkaXRpbmdEb25lKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25FZGl0aW5nRG9uZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG9uQmx1ciA9IChldmVudCkgPT4ge1xuICAgIGxvZygnW29uQmx1cl0nKTtcbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IHRoaXMudG9vbGJhclJlZiAmJiByZWxhdGVkVGFyZ2V0Py5jbG9zZXN0KGBbY2xhc3MqPVwiJHt0aGlzLnRvb2xiYXJSZWYuY2xhc3NOYW1lfVwiXWApO1xuXG4gICAgLy8gQ2hlY2sgaWYgcmVsYXRlZFRhcmdldCBpcyBhIGRvbmUgYnV0dG9uXG4gICAgY29uc3QgaXNSYXdEb25lQnV0dG9uID1cbiAgICAgIHRoaXMuZG9uZUJ1dHRvblJlZiAmJiByZWxhdGVkVGFyZ2V0Py5jbG9zZXN0KGBbY2xhc3MqPVwiJHt0aGlzLmRvbmVCdXR0b25SZWYuY3VycmVudD8uY2xhc3NOYW1lfVwiXWApO1xuXG4gICAgLy8gU2tpcCBvbkJsdXIgaGFuZGxpbmcgaWYgcmVsYXRlZFRhcmdldCBpcyBhIGJ1dHRvbiBmcm9tIHRoZSBLZXlQYWQgY2hhcmFjdGVyc1xuICAgIHRoaXMuc2tpcEJsdXJIYW5kbGluZyA9IHRoaXMua2V5cGFkSW50ZXJhY3Rpb25EZXRlY3RlZCAmJiByZWxhdGVkVGFyZ2V0ICE9PSBudWxsO1xuXG4gICAgaWYgKHRvb2xiYXJFbGVtZW50ICYmICFpc1Jhd0RvbmVCdXR0b24gJiYgIXRoaXMuc3RhdGUuZm9jdXNUb29sYmFyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNUb29sYmFyOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHJlbGF0ZWRUYXJnZXQgPyBmaW5kTm9kZShyZWxhdGVkVGFyZ2V0LCB0aGlzLnN0YXRlLnZhbHVlKSA6IG51bGw7XG5cbiAgICBsb2coJ1tvbkJsdXJdIG5vZGU6ICcsIG5vZGUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2tpcEJsdXJIYW5kbGluZykge1xuICAgICAgICB0aGlzLnNldEtleXBhZEludGVyYWN0aW9uKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7IHByZUJsdXJWYWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSwgZm9jdXNlZE5vZGU6ICFub2RlID8gbnVsbCA6IG5vZGUgfSxcbiAgICAgICAgICB0aGlzLmhhbmRsZUJsdXIuYmluZCh0aGlzLCByZXNvbHZlKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGhhbmRsZURvbUJsdXIgPSAoZSkgPT4ge1xuICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHsgdmFsdWU6IHN0YXRlVmFsdWUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmICghdGhpcy53cmFwcGVyUmVmKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yRWxlbWVudCA9ICFlZGl0b3JET00gfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbG9zZXN0KGBbY2xhc3MqPVwiJHtlZGl0b3JET00uY2xhc3NOYW1lfVwiXWApO1xuICAgICAgY29uc3QgdG9vbGJhckVsZW1lbnQgPVxuICAgICAgICAhdGhpcy50b29sYmFyUmVmIHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdChgW2NsYXNzKj1cIiR7dGhpcy50b29sYmFyUmVmLmNsYXNzTmFtZX1cIl1gKTtcbiAgICAgIGNvbnN0IGlzSW5DdXJyZW50Q29tcG9uZW50ID0gdGhpcy53cmFwcGVyUmVmLmNvbnRhaW5zKGVkaXRvckVsZW1lbnQpIHx8IHRoaXMud3JhcHBlclJlZi5jb250YWlucyh0b29sYmFyRWxlbWVudCk7XG5cbiAgICAgIGlmICghaXNJbkN1cnJlbnRDb21wb25lbnQpIHtcbiAgICAgICAgZWRpdG9yRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLmhhbmRsZURvbUJsdXIpO1xuXG4gICAgICAgIGlmIChzdGF0ZVZhbHVlLmlzRm9jdXNlZCkge1xuICAgICAgICAgIHRoaXMub25CbHVyKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9O1xuXG4gIC8qXG4gICAqIE5lZWRzIHRvIGJlIHdyYXBwZWQgb3RoZXJ3aXNlIGl0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZSBvZiByYWNlIGNvbmRpdGlvbnNcbiAgICogS25vd24gaXNzdWUgZm9yIHNsYXRlanMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2lhbnN0b3JtdGF5bG9yL3NsYXRlL2lzc3Vlcy8yMDk3XG4gICAqIFVzaW5nIHRpbWVvdXQgSSB3YXNuJ3QgYWJsZSB0byB0ZXN0IHRoaXNcbiAgICpcbiAgICogTm90ZTogVGhlIHVzZSBvZiBwcm9taXNlcyBoYXMgYmVlbiBjYXVzaW5nIGlzc3VlcyB3aXRoIE1hdGhRdWlsbFxuICAgKiAqL1xuICBvbkZvY3VzID0gKGV2ZW50LCBjaGFuZ2UpID0+XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC5rZXl9XCJdYCk7XG4gICAgICBjb25zdCBpc1RvdWNoRGV2aWNlID1cbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3I/Lm1heFRvdWNoUG9pbnRzID4gMCk7XG5cbiAgICAgIGxvZygnW29uRm9jdXNdJywgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIGlmICh0aGlzLmtleXBhZEludGVyYWN0aW9uRGV0ZWN0ZWQgJiYgdGhpcy5fX1RFTVBPUkFSWV9DSEFOR0VfREFUQSkge1xuICAgICAgICB0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgLSBAc2VlIGNoYW5nZURhdGEgYmVsb3cgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEEpIHtcbiAgICAgICAgY29uc3QgeyBrZXksIGRhdGEgfSA9IHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEE7XG4gICAgICAgIGNvbnN0IGRvbUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XG5cbiAgICAgICAgaWYgKGRvbUVsKSB7XG4gICAgICAgICAgbGV0IGNoYW5nZSA9IHRoaXMuc3RhdGUudmFsdWUuY2hhbmdlKCkuc2V0Tm9kZUJ5S2V5KGtleSwgeyBkYXRhIH0pO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogY2hhbmdlLnZhbHVlIH0sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEEgPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBpcyBuZWVkZWQganVzdCBpbiBjYXNlIHRoZSBicm93c2VyIGRlY2lkZXMgdG8gbWFrZSB0aGUgZWRpdG9yXG4gICAgICAgKiBsb3NlIGZvY3VzIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgb25CbHVyIGV2ZW50IChjYW4gaGFwcGVuIGluIGEgZmV3IGNhc2VzKS5cbiAgICAgICAqIFRoaXMgd2lsbCBhbHNvIHRyaWdnZXIgb25CbHVyIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBwYWdlIHdoZW4gdGhlIGVkaXRvclxuICAgICAgICogaXMgZm9jdXNlZC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVkaXRvckRPTSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICBlZGl0b3JET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuaGFuZGxlRG9tQmx1cik7XG4gICAgICAgIGVkaXRvckRPTS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5oYW5kbGVEb21CbHVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFzaFZhbHVlKCk7XG4gICAgICB0aGlzLnByb3BzLm9uRm9jdXMoKTtcblxuICAgICAgLy8gQWRkZWQgZm9yIGFjY2Vzc2liaWxpdHk6IEVuc3VyZXMgdGhlIGVkaXRvciBnYWlucyBmb2N1cyB3aGVuIHRhYmJlZCB0byBmb3IgaW1wcm92ZWQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgY29uc3Qgc2hvdWxkRm9jdXNFZGl0b3IgPSAhdGhpcy5rZXlwYWRJbnRlcmFjdGlvbkRldGVjdGVkICYmICFpc1RvdWNoRGV2aWNlO1xuXG4gICAgICBpZiAoc2hvdWxkRm9jdXNFZGl0b3IpIHtcbiAgICAgICAgY2hhbmdlPy5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgc3Rhc2hWYWx1ZSA9ICgpID0+IHtcbiAgICBsb2coJ1tzdGFzaFZhbHVlXScpO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnN0YXNoZWRWYWx1ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXNoZWRWYWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB2YWx1ZSBpZiB0aGUgdXNlciBkaWRuJ3QgY2xpY2sgZG9uZS5cbiAgICovXG4gIHJlc2V0VmFsdWUgPSAoZm9yY2UpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBmb2N1c2VkTm9kZSB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGNvbnN0IHN0b3BSZXNldCA9IHRoaXMucGx1Z2lucy5yZWR1Y2UoKHMsIHApID0+IHtcbiAgICAgIHJldHVybiBzIHx8IChwLnN0b3BSZXNldCAmJiBwLnN0b3BSZXNldCh0aGlzLnN0YXRlLnZhbHVlKSk7XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgbG9nKCdbcmVzZXRWYWx1ZV0nLCB2YWx1ZS5pc0ZvY3VzZWQsIGZvY3VzZWROb2RlLCAnc3RvcFJlc2V0OiAnLCBzdG9wUmVzZXQpO1xuICAgIGlmICgodGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUgJiYgIXZhbHVlLmlzRm9jdXNlZCAmJiAhZm9jdXNlZE5vZGUgJiYgIXN0b3BSZXNldCkgfHwgZm9yY2UpIHtcbiAgICAgIGxvZygnW3Jlc2V0VmFsdWVdIHJlc2V0dGluZy4uLicpO1xuICAgICAgbG9nKCdzdGFzaGVkJywgdGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUuZG9jdW1lbnQudG9PYmplY3QoKSk7XG4gICAgICBsb2coJ2N1cnJlbnQnLCB0aGlzLnN0YXRlLnZhbHVlLmRvY3VtZW50LnRvT2JqZWN0KCkpO1xuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IFZhbHVlLmZyb21KU09OKHRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlLnRvSlNPTigpKTtcblxuICAgICAgbG9nKCduZXdWYWx1ZTogJywgbmV3VmFsdWUuZG9jdW1lbnQpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogbmV3VmFsdWUsIHN0YXNoZWRWYWx1ZTogbnVsbCB9LCAoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ3ZhbHVlIG5vdzogJywgdGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC50b0pTT04oKSk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDUwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9XG4gIH07XG5cbiAgb25DaGFuZ2UgPSAoY2hhbmdlLCBkb25lKSA9PiB7XG4gICAgbG9nKCdbb25DaGFuZ2VdJyk7XG4gICAgd2luZG93Lm1lID0gdGhpcztcblxuICAgIGNvbnN0IHsgdmFsdWUgfSA9IGNoYW5nZTtcbiAgICBjb25zdCB7IGNoYXJhY3RlcnNMaW1pdCB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgbGltaXQgPSBjaGFyYWN0ZXJzTGltaXQ7XG4gICAgaWYgKCFsaW1pdCB8fCBsaW1pdCA+IE1BWF9DSEFSQUNURVJTX0xJTUlUKSB7XG4gICAgICBsaW1pdCA9IE1BWF9DSEFSQUNURVJTX0xJTUlUO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5kb2N1bWVudCAmJiB2YWx1ZS5kb2N1bWVudC50ZXh0ICYmIHZhbHVlLmRvY3VtZW50LnRleHQubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYXJrIHRoZSBlZGl0b3IgYXMgZWRpdGVkIHdoZW4gaW4gSFRNTCBtb2RlIGFuZCBpdHMgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAvLyBUaGlzIHN0YXR1cyB3aWxsIGxhdGVyIGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJvbXB0IGEgd2FybmluZyB0byB0aGUgdXNlciB3aGVuIGV4aXRpbmcgSFRNTCBtb2RlLlxuICAgIGNvbnN0IGlzRWRpdGVkSW5IdG1sTW9kZSA9ICF0aGlzLnN0YXRlLmlzSHRtbE1vZGVcbiAgICAgID8gZmFsc2VcbiAgICAgIDogdGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC50ZXh0ICE9PSB2YWx1ZS5kb2N1bWVudC50ZXh0XG4gICAgICA/IHRydWVcbiAgICAgIDogdGhpcy5zdGF0ZS5pc0VkaXRlZEluSHRtbE1vZGU7XG5cbiAgICBpZiAoaXNFZGl0ZWRJbkh0bWxNb2RlICE9IHRoaXMuc3RhdGUuaXNFZGl0ZWRJbkh0bWxNb2RlKSB7XG4gICAgICB0aGlzLmhhbmRsZVBsdWdpbnModGhpcy5wcm9wcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlLCBpc0VkaXRlZEluSHRtbE1vZGUgfSwgKCkgPT4ge1xuICAgICAgbG9nKCdbb25DaGFuZ2VdLCBjYWxsIGRvbmUoKScpO1xuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZ2V0Rm9jdXNlZFZhbHVlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlLmlzRm9jdXNlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucHJlQmx1clZhbHVlO1xuICB9O1xuXG4gIHZhbHVlVG9TaXplID0gKHYpID0+IHtcbiAgICBpZiAoIXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FsY1JlZ2V4ID0gL15jYWxjXFwoKC4qKVxcKSQvO1xuXG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHYuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdi5lbmRzV2l0aCgncHgnKSB8fFxuICAgICAgICB2LmVuZHNXaXRoKCd2aCcpIHx8XG4gICAgICAgIHYuZW5kc1dpdGgoJ3Z3JykgfHxcbiAgICAgICAgdi5lbmRzV2l0aCgnY2gnKSB8fFxuICAgICAgICB2LmVuZHNXaXRoKCdlbScpIHx8XG4gICAgICAgIHYubWF0Y2goY2FsY1JlZ2V4KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2LCAxMCk7XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB2YWx1ZSA6IGAke3ZhbHVlfXB4YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGAke3Z9cHhgO1xuICAgIH1cbiAgfTtcblxuICBidWlsZFNpemVTdHlsZSgpIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCB3aWR0aCwgbWF4V2lkdGgsIG1pbkhlaWdodCwgaGVpZ2h0LCBtYXhIZWlnaHQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMudmFsdWVUb1NpemUod2lkdGgpLFxuICAgICAgbWluV2lkdGg6IHRoaXMudmFsdWVUb1NpemUobWluV2lkdGgpLFxuICAgICAgbWF4V2lkdGg6IHRoaXMudmFsdWVUb1NpemUobWF4V2lkdGgpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlVG9TaXplKGhlaWdodCksXG4gICAgICBtaW5IZWlnaHQ6IHRoaXMudmFsdWVUb1NpemUobWluSGVpZ2h0KSxcbiAgICAgIG1heEhlaWdodDogdGhpcy52YWx1ZVRvU2l6ZShtYXhIZWlnaHQpLFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZU5vZGUgPSAobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLm9iamVjdCAhPT0gJ2Jsb2NrJykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFzdCA9IG5vZGUubm9kZXMubGFzdCgpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuO1xuXG4gICAgaWYgKGxhc3QudHlwZSAhPT0gJ2ltYWdlJykgcmV0dXJuO1xuXG4gICAgbG9nKCdbdmFsaWRhdGVOb2RlXSBsYXN0IGlzIGltYWdlLi4nKTtcblxuICAgIGNvbnN0IHBhcmVudCA9IGxhc3QuZ2V0UGFyZW50KGxhc3Qua2V5KTtcbiAgICBjb25zdCBwID0gQmxvY2suZ2V0UGFyZW50KGxhc3Qua2V5KTtcbiAgICBsb2coJ1t2YWxpZGF0ZU5vZGVdIHBhcmVudDonLCBwYXJlbnQsIHApO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICBjaGFuZ2VEYXRhID0gKGtleSwgZGF0YSkgPT4ge1xuICAgIGxvZygnW2NoYW5nZURhdGFdLiAuLiAnLCBrZXksIGRhdGEpO1xuXG4gICAgLyoqXG4gICAgICogSEFDSyBBTEVSVDogV2Ugc2hvdWxkIGJlIGNhbGxpbmcgc2V0U3RhdGUgaGVyZSBhbmQgc3RvcmluZyB0aGUgY2hhbmdlIGRhdGE6XG4gICAgICpcbiAgICAgKiA8Y29kZT50aGlzLnNldFN0YXRlKHtjaGFuZ2VEYXRhOiB7IGtleSwgZGF0YX19KTwvY29kZT5cbiAgICAgKiBIb3dldmVyIHRoaXMgaXMgY2F1c2luZyBpc3N1ZXMgd2l0aCB0aGUgTWF0aHF1aWxsIGluc3RhbmNlLiBUaGUgJ2lucHV0JyBldmVudCBzdG9wcyBmaXJpbmcgb24gdGhlIGVsZW1lbnQgYW5kIG5vXG4gICAgICogbW9yZSBjaGFuZ2VzIGdldCB0aHJvdWdoLiBUaGUgaXNzdWVzIHNlZW0gdG8gYmUgcmVsYXRlZCB0byB0aGUgcHJvbWlzZXMgaW4gb25CbHVyL29uRm9jdXMuIEJ1dCByZW1vdmluZyB0aGVzZVxuICAgICAqIGJyaW5ncyBpdCdzIG93biBwcm9ibGVtcy4gQSBtYWpvciBjbGVhbiB1cCBpcyBwbGFubmVkIGZvciB0aGlzIGNvbXBvbmVudCBzbyBJJ3ZlIGRlY2lkZWQgdG8gdGVtcG9yYXJpbHkgc2V0dGxlXG4gICAgICogb24gdGhpcyBoYWNrIHJhdGhlciB0aGFuIHNwZW5kIG1vcmUgdGltZSBvbiB0aGlzLlxuICAgICAqL1xuXG4gICAgLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBzZWUgdGhlIGJ1ZyBkZXNjcmliZWQgYWJvdmUuXG4gICAgLy8gICAgdGhpcy5zZXRTdGF0ZSh7Y2hhbmdlRGF0YToge2tleSwgZGF0YX19KVxuXG4gICAgdGhpcy5fX1RFTVBPUkFSWV9DSEFOR0VfREFUQSA9IHsga2V5LCBkYXRhIH07XG4gIH07XG5cbiAgZm9jdXMgPSAocG9zLCBub2RlKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSBwb3MgfHwgJ2VuZCc7XG5cbiAgICB0aGlzLnByb3BzLmZvY3VzKHBvc2l0aW9uLCBub2RlKTtcbiAgfTtcblxuICBvbkRyb3BQYXN0ZSA9IGFzeW5jIChldmVudCwgY2hhbmdlLCBkcm9wQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGNoYW5nZS5lZGl0b3I7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBnZXRFdmVudFRyYW5zZmVyKGV2ZW50KTtcbiAgICBjb25zdCBmaWxlID0gdHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXNbMF07XG5cbiAgICBjb25zdCB0eXBlID0gdHJhbnNmZXIudHlwZTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRyYW5zZmVyLmZyYWdtZW50O1xuICAgIGNvbnN0IHRleHQgPSB0cmFuc2Zlci50ZXh0O1xuXG4gICAgaWYgKGZpbGUgJiYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL2pwZWcnIHx8IGZpbGUudHlwZSA9PT0gJ2ltYWdlL2pwZycgfHwgZmlsZS50eXBlID09PSAnaW1hZ2UvcG5nJykpIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy5pbWFnZVN1cHBvcnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nKCdbb25Ecm9wUGFzdGVdJyk7XG4gICAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGdldEJhc2U2NChmaWxlKTtcbiAgICAgICAgY29uc3QgaW5saW5lID0gSW5saW5lLmNyZWF0ZSh7XG4gICAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgICBpc1ZvaWQ6IHRydWUsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBzcmMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRyb3BDb250ZXh0KSB7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0gZ2V0RXZlbnRSYW5nZShldmVudCwgZWRpdG9yKTtcbiAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGNoYW5nZS5zZWxlY3QocmFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoID0gY2hhbmdlLmluc2VydElubGluZShpbmxpbmUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKGNoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnNlcnRJbWFnZUhhbmRsZXIoXG4gICAgICAgICAgaW5saW5lLFxuICAgICAgICAgICgpID0+IHt9LFxuICAgICAgICAgICgpID0+IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICBoYW5kbGVyLmZpbGVDaG9zZW4oZmlsZSk7XG4gICAgICAgIHRoaXMucHJvcHMuaW1hZ2VTdXBwb3J0LmFkZChoYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2coJ1tvbkRyb3BQYXN0ZV0gZXJyb3I6ICcsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICBjaGFuZ2UuaW5zZXJ0RnJhZ21lbnQoZnJhZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdodG1sJykge1xuICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IHsgZG9jdW1lbnQsIHNlbGVjdGlvbiwgc3RhcnRCbG9jayB9LFxuICAgICAgfSA9IGNoYW5nZTtcblxuICAgICAgaWYgKHN0YXJ0QmxvY2suaXNWb2lkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVmYXVsdEJsb2NrID0gc3RhcnRCbG9jaztcbiAgICAgIGNvbnN0IGRlZmF1bHRNYXJrcyA9IGRvY3VtZW50LmdldEluc2VydE1hcmtzQXRSYW5nZShzZWxlY3Rpb24pO1xuICAgICAgY29uc3QgZnJhZyA9IFBsYWluLmRlc2VyaWFsaXplKHRleHQsIHtcbiAgICAgICAgZGVmYXVsdEJsb2NrLFxuICAgICAgICBkZWZhdWx0TWFya3MsXG4gICAgICB9KS5kb2N1bWVudDtcbiAgICAgIGNoYW5nZS5pbnNlcnRGcmFnbWVudChmcmFnKTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyUGxhY2Vob2xkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gcHJvcHM7XG4gICAgY29uc3QgeyBkb2N1bWVudCB9ID0gZWRpdG9yLnZhbHVlO1xuXG4gICAgaWYgKCFlZGl0b3IucHJvcHMucGxhY2Vob2xkZXIgfHwgZG9jdW1lbnQudGV4dCAhPT0gJycgfHwgZG9jdW1lbnQubm9kZXMuc2l6ZSAhPT0gMSB8fCAhZG9jdW1lbnQuaXNFbXB0eSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8c3BhblxuICAgICAgICBjb250ZW50RWRpdGFibGU9e2ZhbHNlfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiAnZml0LWNvbnRlbnQnLCAvLyBmb3IgY2VudGVyaW5nIHRoZSBwbGFjZWhvbGRlciBpZiB0ZXh0LWFsaWduIGlzIHNldCB0byBjZW50ZXJcbiAgICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICAgIG9wYWNpdHk6ICcwLjMzJyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7ZWRpdG9yLnByb3BzLnBsYWNlaG9sZGVyfVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpc2FibGVkLFxuICAgICAgc3BlbGxDaGVjayxcbiAgICAgIGhpZ2hsaWdodFNoYXBlLFxuICAgICAgY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGlzRWRpdG9yLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbHVnaW5Qcm9wcyxcbiAgICAgIG9uS2V5RG93bixcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAvLyBXZSBkb24ndCB3YW50IHRvIHNlbmQgY3VzdG9tUGx1Z2lucyB0byBzbGF0ZS5cbiAgICAvLyBOb3Qgc3VyZSBpZiB0aGV5IHdvdWxkIGRvIGFueSBoYXJtLCBidXQgSSB0aGluayBpdCdzIGJldHRlciB0byBub3Qgc2VuZCB0aGVtLlxuICAgIC8vIFdlIHVzZSBjdXN0b20gcGx1Z2lucyB0byBiZSBhYmxlIHRvIGFkZCBjdXN0b20gYnV0dG9uc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHsgY3VzdG9tUGx1Z2lucywgc2hvd1BhcmFncmFwaHMsIHNlcGFyYXRlUGFyYWdyYXBocywgLi4ub3RoZXJQbHVnaW5Qcm9wcyB9ID0gcGx1Z2luUHJvcHMgfHwge307XG5cbiAgICBjb25zdCB7IHZhbHVlLCBmb2N1c2VkTm9kZSwgdG9vbGJhck9wdHMsIGRpYWxvZywgc2NoZWR1bGVkIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgbG9nKCdbcmVuZGVyXSB2YWx1ZTogJywgdmFsdWUpO1xuICAgIGNvbnN0IHNpemVTdHlsZSA9IHRoaXMuYnVpbGRTaXplU3R5bGUoKTtcbiAgICBjb25zdCBuYW1lcyA9IGNsYXNzTmFtZXMoXG4gICAgICB7XG4gICAgICAgIFtjbGFzc2VzLndpdGhCZ106IGhpZ2hsaWdodFNoYXBlLFxuICAgICAgICBbY2xhc3Nlcy50b29sYmFyT25Ub3BdOiB0b29sYmFyT3B0cy5hbHdheXNWaXNpYmxlICYmIHRvb2xiYXJPcHRzLnBvc2l0aW9uID09PSAndG9wJyxcbiAgICAgICAgW2NsYXNzZXMuc2NoZWR1bGVkXTogc2NoZWR1bGVkLFxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXsocmVmKSA9PiAodGhpcy53cmFwcGVyUmVmID0gcmVmKX1cbiAgICAgICAgc3R5bGU9e3sgd2lkdGg6IHNpemVTdHlsZS53aWR0aCwgbWluV2lkdGg6IHNpemVTdHlsZS5taW5XaWR0aCwgbWF4V2lkdGg6IHNpemVTdHlsZS5tYXhXaWR0aCB9fVxuICAgICAgICBjbGFzc05hbWU9e25hbWVzfVxuICAgICAgICBpZD17YGVkaXRvci0ke3ZhbHVlPy5kb2N1bWVudD8ua2V5fWB9XG4gICAgICA+XG4gICAgICAgIHtzY2hlZHVsZWQgJiYgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXMudXBsb2FkaW5nfT5VcGxvYWRpbmcgaW1hZ2UgYW5kIHRoZW4gc2F2aW5nLi4uPC9kaXY+fVxuICAgICAgICA8U2xhdGVFZGl0b3JcbiAgICAgICAgICBwbHVnaW5zPXt0aGlzLnBsdWdpbnN9XG4gICAgICAgICAgaW5uZXJSZWY9eyhyKSA9PiB7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICB0aGlzLnNsYXRlRWRpdG9yID0gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIHJlZj17KHIpID0+ICh0aGlzLmVkaXRvciA9IHIgJiYgdGhpcy5wcm9wcy5lZGl0b3JSZWYocikpfVxuICAgICAgICAgIHRvb2xiYXJSZWY9eyhyKSA9PiB7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICB0aGlzLnRvb2xiYXJSZWYgPSByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgZG9uZUJ1dHRvblJlZj17dGhpcy5kb25lQnV0dG9uUmVmfVxuICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICBmb2N1c1Rvb2xiYXI9e3RoaXMuc3RhdGUuZm9jdXNUb29sYmFyfVxuICAgICAgICAgIG9uVG9vbGJhckZvY3VzPXt0aGlzLmhhbmRsZVRvb2xiYXJGb2N1c31cbiAgICAgICAgICBvblRvb2xiYXJCbHVyPXt0aGlzLmhhbmRsZVRvb2xiYXJCbHVyfVxuICAgICAgICAgIGZvY3VzPXt0aGlzLmZvY3VzfVxuICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgIGdldEZvY3VzZWRWYWx1ZT17dGhpcy5nZXRGb2N1c2VkVmFsdWV9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLm9uQmx1cn1cbiAgICAgICAgICBvbkRyb3A9eyhldmVudCwgZWRpdG9yKSA9PiB0aGlzLm9uRHJvcFBhc3RlKGV2ZW50LCBlZGl0b3IsIHRydWUpfVxuICAgICAgICAgIG9uUGFzdGU9eyhldmVudCwgZWRpdG9yKSA9PiB0aGlzLm9uRHJvcFBhc3RlKGV2ZW50LCBlZGl0b3IpfVxuICAgICAgICAgIG9uRm9jdXM9e3RoaXMub25Gb2N1c31cbiAgICAgICAgICBvbkVkaXRpbmdEb25lPXt0aGlzLm9uRWRpdGluZ0RvbmV9XG4gICAgICAgICAgZm9jdXNlZE5vZGU9e2ZvY3VzZWROb2RlfVxuICAgICAgICAgIG5vcm1hbGl6ZT17dGhpcy5ub3JtYWxpemV9XG4gICAgICAgICAgcmVhZE9ubHk9e2Rpc2FibGVkfVxuICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2t9XG4gICAgICAgICAgYXV0b0NvcnJlY3Q9e3NwZWxsQ2hlY2t9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBbY2xhc3Nlcy5ub1BhZGRpbmddOiB0b29sYmFyT3B0cz8ubm9QYWRkaW5nLFxuICAgICAgICAgICAgICBbY2xhc3Nlcy5zaG93UGFyYWdyYXBoXTogc2hvd1BhcmFncmFwaHMgJiYgIXNob3dQYXJhZ3JhcGhzLmRpc2FibGVkLFxuICAgICAgICAgICAgICBbY2xhc3Nlcy5zZXBhcmF0ZVBhcmFncmFwaF06IHNlcGFyYXRlUGFyYWdyYXBocyAmJiAhc2VwYXJhdGVQYXJhZ3JhcGhzLmRpc2FibGVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsYXNzZXMuc2xhdGVFZGl0b3IsXG4gICAgICAgICAgKX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgbWluSGVpZ2h0OiBzaXplU3R5bGUubWluSGVpZ2h0LFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplU3R5bGUuaGVpZ2h0LFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBzaXplU3R5bGUubWF4SGVpZ2h0LFxuICAgICAgICAgIH19XG4gICAgICAgICAgcGx1Z2luUHJvcHM9e290aGVyUGx1Z2luUHJvcHN9XG4gICAgICAgICAgdG9vbGJhck9wdHM9e3Rvb2xiYXJPcHRzfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICByZW5kZXJQbGFjZWhvbGRlcj17dGhpcy5yZW5kZXJQbGFjZWhvbGRlcn1cbiAgICAgICAgICBvbkRhdGFDaGFuZ2U9e3RoaXMuY2hhbmdlRGF0YX1cbiAgICAgICAgLz5cbiAgICAgICAgPEFsZXJ0RGlhbG9nXG4gICAgICAgICAgb3Blbj17ZGlhbG9nLm9wZW59XG4gICAgICAgICAgdGl0bGU9e2RpYWxvZy50aXRsZX1cbiAgICAgICAgICB0ZXh0PXtkaWFsb2cudGV4dH1cbiAgICAgICAgICBvbkNsb3NlPXtkaWFsb2cub25DbG9zZX1cbiAgICAgICAgICBvbkNvbmZpcm09e2RpYWxvZy5vbkNvbmZpcm19XG4gICAgICAgICAgb25Db25maXJtVGV4dD17ZGlhbG9nLm9uQ29uZmlybVRleHR9XG4gICAgICAgICAgb25DbG9zZVRleHQ9e2RpYWxvZy5vbkNsb3NlVGV4dH1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuLy8gVE9ETyBjb2xvciAtIGhhcmRjb2RlZCBncmF5IGJhY2tncm91bmQgYW5kIGtleXBhZCBjb2xvcnMgd2lsbCBuZWVkIHRvIGNoYW5nZSB0b29cbmNvbnN0IHN0eWxlcyA9IHtcbiAgd2l0aEJnOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjA2KScsXG4gIH0sXG4gIHNjaGVkdWxlZDoge1xuICAgIG9wYWNpdHk6IDAuNSxcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gIH0sXG4gIHVwbG9hZGluZzoge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogJzUwJScsXG4gICAgbGVmdDogJzUwJScsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgfSxcbiAgc2xhdGVFZGl0b3I6IHtcbiAgICBmb250RmFtaWx5OiAnUm9ib3RvLCBzYW5zLXNlcmlmJyxcblxuICAgICcmIHRhYmxlJzoge1xuICAgICAgdGFibGVMYXlvdXQ6ICdmaXhlZCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgYm9yZGVyQ29sbGFwc2U6ICdjb2xsYXBzZScsXG4gICAgICBjb2xvcjogY29sb3IudGV4dCgpLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gICAgfSxcbiAgICAnJiB0YWJsZTpub3QoW2JvcmRlcj1cIjFcIl0pIHRyJzoge1xuICAgICAgYm9yZGVyVG9wOiAnMXB4IHNvbGlkICNkZmUyZTUnLFxuICAgICAgLy8gVE9ETyBwZXJoYXBzIHNlY29uZGFyeSBjb2xvciBmb3IgYmFja2dyb3VuZCwgZm9yIG5vdyBkaXNhYmxlXG4gICAgICAvLyAnJjpudGgtY2hpbGQoMm4pJzoge1xuICAgICAgLy8gICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjZmOGZhJ1xuICAgICAgLy8gfVxuICAgIH0sXG4gICAgJyYgdGQsIHRoJzoge1xuICAgICAgcGFkZGluZzogJy42ZW0gMWVtJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgfSxcbiAgICAnJiB0YWJsZTpub3QoW2JvcmRlcj1cIjFcIl0pIHRkLCB0aCc6IHtcbiAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZGZlMmU1JyxcbiAgICB9LFxuICB9LFxuICBzaG93UGFyYWdyYXBoOiB7XG4gICAgLy8gYSBkaXYgdGhhdCBoYXMgYSBkaXYgYWZ0ZXIgaXRcbiAgICAnJiA+IGRpdjpoYXMoKyBkaXYpOjphZnRlcic6IHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBjb250ZW50OiAnXCLCtlwiJyxcbiAgICAgIGZvbnRTaXplOiAnMWVtJyxcbiAgICAgIGNvbG9yOiAnIzE0NkVCMycsXG4gICAgfSxcbiAgfSxcbiAgc2VwYXJhdGVQYXJhZ3JhcGg6IHtcbiAgICAvLyBhIGRpdiB0aGF0IGhhcyBhIGRpdiBhZnRlciBpdFxuICAgICcmID4gZGl2OmhhcygrIGRpdiknOiB7XG4gICAgICBtYXJnaW5Cb3R0b206ICcxZW0nLFxuICAgIH0sXG4gIH0sXG4gIHRvb2xiYXJPblRvcDoge1xuICAgIG1hcmdpblRvcDogJzQ1cHgnLFxuICB9LFxuICBub1BhZGRpbmc6IHtcbiAgICBwYWRkaW5nOiAnMCAhaW1wb3J0YW50JyxcbiAgfSxcbiAgcHJldmlld1RleHQ6IHtcbiAgICBtYXJnaW5Cb3R0b206ICczNnB4JyxcbiAgICBtYXJnaW5Ub3A6ICc2cHgnLFxuICAgIHBhZGRpbmc6ICcyMHB4JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsMCwwLDAuMDYpJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzKShFZGl0b3IpO1xuIl19