@pie-lib/editable-html 12.1.0-next.0 → 12.1.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/package.json +7 -7
  3. package/lib/__tests__/editor-utils.test.js +0 -164
  4. package/lib/__tests__/serialization.test.js +0 -242
  5. package/lib/__tests__/utils.js +0 -79
  6. package/lib/block-tags.js +0 -24
  7. package/lib/block-tags.js.map +0 -1
  8. package/lib/constants.js +0 -11
  9. package/lib/constants.js.map +0 -1
  10. package/lib/editor.js +0 -1224
  11. package/lib/editor.js.map +0 -1
  12. package/lib/index.js +0 -208
  13. package/lib/index.js.map +0 -1
  14. package/lib/parse-html.js +0 -16
  15. package/lib/parse-html.js.map +0 -1
  16. package/lib/plugins/characters/custom-popper.js +0 -57
  17. package/lib/plugins/characters/custom-popper.js.map +0 -1
  18. package/lib/plugins/characters/index.js +0 -265
  19. package/lib/plugins/characters/index.js.map +0 -1
  20. package/lib/plugins/characters/utils.js +0 -378
  21. package/lib/plugins/characters/utils.js.map +0 -1
  22. package/lib/plugins/css/icons/index.js +0 -25
  23. package/lib/plugins/css/icons/index.js.map +0 -1
  24. package/lib/plugins/css/index.js +0 -338
  25. package/lib/plugins/css/index.js.map +0 -1
  26. package/lib/plugins/customPlugin/index.js +0 -98
  27. package/lib/plugins/customPlugin/index.js.map +0 -1
  28. package/lib/plugins/html/icons/index.js +0 -30
  29. package/lib/plugins/html/icons/index.js.map +0 -1
  30. package/lib/plugins/html/index.js +0 -71
  31. package/lib/plugins/html/index.js.map +0 -1
  32. package/lib/plugins/image/__tests__/component.test.js +0 -96
  33. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -131
  34. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -22
  35. package/lib/plugins/image/__tests__/index.test.js +0 -90
  36. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -112
  37. package/lib/plugins/image/__tests__/mock-change.js +0 -22
  38. package/lib/plugins/image/alt-dialog.js +0 -100
  39. package/lib/plugins/image/alt-dialog.js.map +0 -1
  40. package/lib/plugins/image/component.js +0 -343
  41. package/lib/plugins/image/component.js.map +0 -1
  42. package/lib/plugins/image/image-toolbar.js +0 -137
  43. package/lib/plugins/image/image-toolbar.js.map +0 -1
  44. package/lib/plugins/image/index.js +0 -223
  45. package/lib/plugins/image/index.js.map +0 -1
  46. package/lib/plugins/image/insert-image-handler.js +0 -140
  47. package/lib/plugins/image/insert-image-handler.js.map +0 -1
  48. package/lib/plugins/index.js +0 -342
  49. package/lib/plugins/index.js.map +0 -1
  50. package/lib/plugins/list/__tests__/index.test.js +0 -64
  51. package/lib/plugins/list/index.js +0 -288
  52. package/lib/plugins/list/index.js.map +0 -1
  53. package/lib/plugins/math/__tests__/index.test.js +0 -284
  54. package/lib/plugins/math/index.js +0 -402
  55. package/lib/plugins/math/index.js.map +0 -1
  56. package/lib/plugins/media/__tests__/index.test.js +0 -69
  57. package/lib/plugins/media/index.js +0 -330
  58. package/lib/plugins/media/index.js.map +0 -1
  59. package/lib/plugins/media/media-dialog.js +0 -594
  60. package/lib/plugins/media/media-dialog.js.map +0 -1
  61. package/lib/plugins/media/media-toolbar.js +0 -76
  62. package/lib/plugins/media/media-toolbar.js.map +0 -1
  63. package/lib/plugins/media/media-wrapper.js +0 -64
  64. package/lib/plugins/media/media-wrapper.js.map +0 -1
  65. package/lib/plugins/rendering/index.js +0 -36
  66. package/lib/plugins/rendering/index.js.map +0 -1
  67. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -271
  68. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +0 -1
  69. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -55
  70. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +0 -1
  71. package/lib/plugins/respArea/drag-in-the-blank/utils.js +0 -38
  72. package/lib/plugins/respArea/drag-in-the-blank/utils.js.map +0 -1
  73. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -50
  74. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +0 -1
  75. package/lib/plugins/respArea/icons/index.js +0 -72
  76. package/lib/plugins/respArea/icons/index.js.map +0 -1
  77. package/lib/plugins/respArea/index.js +0 -287
  78. package/lib/plugins/respArea/index.js.map +0 -1
  79. package/lib/plugins/respArea/inline-dropdown/index.js +0 -67
  80. package/lib/plugins/respArea/inline-dropdown/index.js.map +0 -1
  81. package/lib/plugins/respArea/math-templated/index.js +0 -112
  82. package/lib/plugins/respArea/math-templated/index.js.map +0 -1
  83. package/lib/plugins/respArea/utils.js +0 -95
  84. package/lib/plugins/respArea/utils.js.map +0 -1
  85. package/lib/plugins/table/CustomTablePlugin.js +0 -116
  86. package/lib/plugins/table/CustomTablePlugin.js.map +0 -1
  87. package/lib/plugins/table/__tests__/index.test.js +0 -416
  88. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -81
  89. package/lib/plugins/table/icons/index.js +0 -55
  90. package/lib/plugins/table/icons/index.js.map +0 -1
  91. package/lib/plugins/table/index.js +0 -413
  92. package/lib/plugins/table/index.js.map +0 -1
  93. package/lib/plugins/table/table-toolbar.js +0 -138
  94. package/lib/plugins/table/table-toolbar.js.map +0 -1
  95. package/lib/plugins/textAlign/icons/index.js +0 -187
  96. package/lib/plugins/textAlign/icons/index.js.map +0 -1
  97. package/lib/plugins/textAlign/index.js +0 -26
  98. package/lib/plugins/textAlign/index.js.map +0 -1
  99. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -154
  100. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -47
  101. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -112
  102. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -118
  103. package/lib/plugins/toolbar/default-toolbar.js +0 -180
  104. package/lib/plugins/toolbar/default-toolbar.js.map +0 -1
  105. package/lib/plugins/toolbar/done-button.js +0 -35
  106. package/lib/plugins/toolbar/done-button.js.map +0 -1
  107. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -258
  108. package/lib/plugins/toolbar/editor-and-toolbar.js.map +0 -1
  109. package/lib/plugins/toolbar/index.js +0 -29
  110. package/lib/plugins/toolbar/index.js.map +0 -1
  111. package/lib/plugins/toolbar/toolbar-buttons.js +0 -145
  112. package/lib/plugins/toolbar/toolbar-buttons.js.map +0 -1
  113. package/lib/plugins/toolbar/toolbar.js +0 -307
  114. package/lib/plugins/toolbar/toolbar.js.map +0 -1
  115. package/lib/plugins/utils.js +0 -42
  116. package/lib/plugins/utils.js.map +0 -1
  117. package/lib/serialization.js +0 -571
  118. package/lib/serialization.js.map +0 -1
  119. package/lib/shared/alert-dialog.js +0 -68
  120. package/lib/theme.js +0 -8
  121. package/lib/theme.js.map +0 -1
@@ -1,571 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.valueToHtml = exports.reduceMultipleBrs = exports.reactAttributes = exports.parseStyleString = exports.htmlToValue = exports.handleHtml = exports.getBase64 = exports.extraCSSRulesOpts = exports.TEXT_RULE = exports.INLINE_TAGS = void 0;
8
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _slateHtmlSerializer = _interopRequireDefault(require("slate-html-serializer"));
10
- var _react = _interopRequireDefault(require("react"));
11
- var _debug = _interopRequireDefault(require("debug"));
12
- var _toStyle = require("to-style");
13
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
14
- var _image = require("./plugins/image");
15
- var _math = require("./plugins/math");
16
- var _media = require("./plugins/media");
17
- var _list = require("./plugins/list");
18
- var _table = require("./plugins/table");
19
- var _respArea = require("./plugins/respArea");
20
- var _slate = require("slate");
21
- var _blockTags = require("./block-tags");
22
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
- var log = (0, _debug["default"])('@pie-lib:editable-html:serialization');
25
-
26
- /**
27
- * Tags to marks.
28
- *
29
- * @type {Object}
30
- */
31
-
32
- var MARK_TAGS = {
33
- b: 'bold',
34
- em: 'italic',
35
- u: 'underline',
36
- s: 'strikethrough',
37
- code: 'code',
38
- strong: 'bold',
39
- blockquote: 'blockquote',
40
- h3: 'h3',
41
- sup: 'sup',
42
- sub: 'sub'
43
- };
44
- var parseStyleString = exports.parseStyleString = function parseStyleString(s) {
45
- var regex = /([\w-]*)\s*:\s*([^;]*)/g;
46
- var match;
47
- var result = {};
48
- while (match = regex.exec(s)) {
49
- result[match[1]] = match[2].trim();
50
- }
51
- return result;
52
- };
53
- var getBase64 = exports.getBase64 = function getBase64(file) {
54
- return new Promise(function (resolve, reject) {
55
- var reader = new FileReader();
56
- reader.readAsDataURL(file);
57
- reader.onload = function () {
58
- return resolve(reader.result);
59
- };
60
- reader.onerror = function (error) {
61
- return reject(error);
62
- };
63
- });
64
- };
65
- var reactAttributes = exports.reactAttributes = function reactAttributes(o) {
66
- return (0, _toStyle.object)(o, {
67
- camelize: true,
68
- addUnits: false
69
- });
70
- };
71
- var attributesToMap = function attributesToMap(el) {
72
- return function (acc, attribute) {
73
- var value = el.getAttribute(attribute);
74
- if (value) {
75
- if (attribute === 'style') {
76
- var styleString = el.getAttribute(attribute);
77
- var reactStyleObject = reactAttributes(parseStyleString(styleString));
78
- acc['style'] = reactStyleObject;
79
- } else {
80
- acc[attribute] = el.getAttribute(attribute);
81
- }
82
- }
83
- return acc;
84
- };
85
- };
86
- var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style', 'align'];
87
-
88
- /**
89
- * Serializer rules.
90
- *
91
- * @type {Array}
92
- */
93
-
94
- var blocks = {
95
- deserialize: function deserialize(el, next) {
96
- log('[blocks:deserialize] block: ', el);
97
- var block = _blockTags.BLOCK_TAGS[el.tagName.toLowerCase()];
98
- if (!block) return;
99
- log('[blocks:deserialize] block: ', block);
100
- if (el.childNodes.length === 1) {
101
- var cn = el.childNodes[0];
102
- if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
103
- log('[we have a child node of the same]...');
104
- return;
105
- }
106
- }
107
- return {
108
- object: 'block',
109
- type: block,
110
- /**
111
- * Here for rendering styles for all block elements
112
- */
113
- data: {
114
- attributes: attributes.reduce(attributesToMap(el), {})
115
- },
116
- nodes: next(el.childNodes)
117
- };
118
- },
119
- serialize: function serialize(object, children) {
120
- if (object.object !== 'block') return;
121
- var jsonData = object.data.toJSON();
122
- log('[blocks:serialize] object: ', object, children);
123
- var key;
124
- for (key in _blockTags.BLOCK_TAGS) {
125
- if (_blockTags.BLOCK_TAGS[key] === object.type) {
126
- var Tag = key;
127
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
128
- }
129
- }
130
- }
131
- };
132
- var INLINE_TAGS = exports.INLINE_TAGS = {
133
- span: 'span'
134
- };
135
- var inlines = {
136
- deserialize: function deserialize(el, next) {
137
- log('[inlines:deserialize] inline: ', el);
138
- var inlineTag = INLINE_TAGS[el.tagName.toLowerCase()];
139
- if (!inlineTag) return;
140
- log('[inlines:deserialize] inline: ', inlineTag);
141
- if (el.childNodes.length === 1) {
142
- var cn = el.childNodes[0];
143
- if (cn && cn.tagName && cn.tagName.toLowerCase() === inlineTag) {
144
- log('[we have a child node of the same]...');
145
- return;
146
- }
147
- }
148
- return {
149
- object: 'inline',
150
- type: inlineTag,
151
- /**
152
- * Here for rendering styles for all inline elements
153
- */
154
- data: {
155
- attributes: attributes.reduce(attributesToMap(el), {})
156
- },
157
- nodes: next(el.childNodes)
158
- };
159
- },
160
- serialize: function serialize(object, children) {
161
- if (object.object !== 'inline') return;
162
- var jsonData = object.data.toJSON();
163
- log('[inlines:serialize] object: ', object, children);
164
- var key;
165
- for (key in INLINE_TAGS) {
166
- if (INLINE_TAGS[key] === object.type) {
167
- var Tag = key;
168
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
169
- }
170
- }
171
- }
172
- };
173
- var extraCSSRulesOpts = exports.extraCSSRulesOpts = {};
174
- var STYLES_MAP = {
175
- h3: {
176
- fontSize: 'inherit',
177
- fontWeight: 'inherit'
178
- },
179
- blockquote: {
180
- background: '#f9f9f9',
181
- borderLeft: '5px solid #ccc',
182
- margin: '1.5em 10px',
183
- padding: '.5em 10px'
184
- }
185
- };
186
- var reactToHTMLAttributesMap = {
187
- "class": 'className'
188
- };
189
- var marks = {
190
- deserialize: function deserialize(el, next) {
191
- var mark = MARK_TAGS[el.tagName.toLowerCase()];
192
- var elClasses = el.getAttribute('class') || '';
193
- var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
194
- return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
195
- });
196
- if (!mark && !hasCSSRule) {
197
- return;
198
- }
199
- log('[deserialize] mark: ', mark);
200
- var attrs = attributes.reduce(attributesToMap(el), {});
201
- var data = (0, _isEmpty["default"])(attrs) ? undefined : {
202
- attributes: attrs
203
- };
204
- return {
205
- object: 'mark',
206
- type: hasCSSRule ? 'css' : mark,
207
- /**
208
- * Here for rendering styles for all elements
209
- */
210
- data: data,
211
- nodes: next(el.childNodes)
212
- };
213
- },
214
- serialize: function serialize(object, children) {
215
- var _object$data, _jsonData$attributes;
216
- var jsonData = ((_object$data = object.data) === null || _object$data === void 0 ? void 0 : _object$data.toJSON()) || {};
217
- var elClasses = ((_jsonData$attributes = jsonData.attributes) === null || _jsonData$attributes === void 0 ? void 0 : _jsonData$attributes["class"]) || '';
218
- var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
219
- return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
220
- });
221
- if (hasCSSRule) {
222
- var htmlAttrs = Object.keys(jsonData.attributes).reduce(function (obj, key) {
223
- obj[reactToHTMLAttributesMap[key] || key] = jsonData.attributes[key];
224
- return obj;
225
- }, {});
226
- return /*#__PURE__*/_react["default"].createElement("span", htmlAttrs, children);
227
- }
228
- if (_slate.Mark.isMark(object)) {
229
- for (var key in MARK_TAGS) {
230
- if (MARK_TAGS[key] === object.type) {
231
- var Tag = key;
232
- var additionalStyles = STYLES_MAP[Tag];
233
- if (additionalStyles) {
234
- if (!jsonData.attributes) {
235
- jsonData.attributes = {};
236
- }
237
- jsonData.attributes.style = _objectSpread(_objectSpread({}, jsonData.attributes.style), additionalStyles);
238
- }
239
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
240
- }
241
- }
242
- }
243
- }
244
- };
245
-
246
- // eslint-disable-next-line no-unused-vars
247
- var _findPreviousText = function findPreviousText(el) {
248
- if (el.nodeName === '#text') {
249
- return el;
250
- }
251
- if (el.previousSibling) {
252
- return _findPreviousText(el.previousSibling);
253
- }
254
- return null;
255
- };
256
- var TEXT_RULE = exports.TEXT_RULE = {
257
- deserialize: function deserialize(el) {
258
- /**
259
- * This needs to be called on the dom element in order to merge the adjacent text nodes together
260
- * */
261
- el.normalize();
262
- if (el.tagName && el.tagName.toLowerCase() === 'br') {
263
- return {
264
- object: 'text',
265
- leaves: [{
266
- object: 'leaf',
267
- text: '\n'
268
- }]
269
- };
270
- }
271
- if (el.nodeName === '#text') {
272
- if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
273
- log('[text:deserialize] return text object..');
274
- return {
275
- object: 'text',
276
- leaves: [{
277
- object: 'leaf',
278
- text: el.nodeValue
279
- }]
280
- };
281
- }
282
- },
283
- serialize: function serialize(obj, children) {
284
- if (obj.object === 'string') {
285
- return children.split('\n').reduce(function (array, text, i) {
286
- if (i !== 0) array.push(/*#__PURE__*/_react["default"].createElement("br", null));
287
- array.push(text);
288
- return array;
289
- }, []);
290
- }
291
- }
292
- };
293
- var RULES = [_list.serialization, _math.serialization, _media.serialization, _image.serialization, _table.serialization, _respArea.serialization, TEXT_RULE, inlines, blocks, marks];
294
- function allWhitespace(node) {
295
- // Use ECMA-262 Edition 3 String and RegExp features
296
- return !/[^\t\n\r ]/.test(node.textContent);
297
- }
298
- function defaultParseHtml(html) {
299
- if (typeof DOMParser === 'undefined') {
300
- throw new Error('The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.');
301
- }
302
- var parsed = new DOMParser().parseFromString(html, 'text/html');
303
- var body = parsed.body;
304
- var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
305
- var n = textNodes.nextNode();
306
- while (n) {
307
- var _n$nextSibling, _n$previousSibling;
308
- var isWhiteSpace = allWhitespace(n);
309
- var isNotNearMarkup = !MARK_TAGS[(_n$nextSibling = n.nextSibling) === null || _n$nextSibling === void 0 || (_n$nextSibling = _n$nextSibling.tagName) === null || _n$nextSibling === void 0 ? void 0 : _n$nextSibling.toLowerCase()] && !MARK_TAGS[(_n$previousSibling = n.previousSibling) === null || _n$previousSibling === void 0 || (_n$previousSibling = _n$previousSibling.tagName) === null || _n$previousSibling === void 0 ? void 0 : _n$previousSibling.toLowerCase()];
310
- if (isWhiteSpace && isNotNearMarkup || n.nodeValue === "\u200B") {
311
- n.parentNode.removeChild(n);
312
- }
313
- n = textNodes.nextNode();
314
- }
315
- return body;
316
- }
317
-
318
- /** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
319
- var parseHtml = typeof window === 'undefined' ? function () {
320
- return {
321
- childNodes: []
322
- };
323
- } : defaultParseHtml;
324
- var serializer = new _slateHtmlSerializer["default"]({
325
- defaultBlock: 'div',
326
- rules: RULES,
327
- parseHtml: parseHtml
328
- });
329
- var _extends = Object.assign || function (target) {
330
- for (var i = 1; i < arguments.length; i++) {
331
- var source = arguments[i];
332
- for (var key in source) {
333
- if (Object.prototype.hasOwnProperty.call(source, key)) {
334
- target[key] = source[key];
335
- }
336
- }
337
- }
338
- return target;
339
- };
340
-
341
- /**
342
- * This is needed in order to override the function that eventually leads
343
- * to the max iteration of 12, which in most cases it's not enough. The newer versions
344
- * have a different way to calculate this, but updating to a newer version of slate
345
- * requires a lot of work fixing other issues. So we just increase the rules by 1000,
346
- * which means a lot of iterations.
347
- * Below is the code that calculates the max iterations.
348
- * var max = schema.stack.plugins.length + schema.rules.length + 1;
349
- */
350
- serializer.deserialize = function deserialize(html) {
351
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
352
- var _options$toJSON = options.toJSON;
353
- var toJSON = _options$toJSON === undefined ? false : _options$toJSON;
354
- var defaultBlock = this.defaultBlock;
355
- var parseHtml = this.parseHtml;
356
- var fragment = parseHtml(html);
357
- var children = Array.from(fragment.childNodes);
358
- var nodes = this.deserializeElements(children);
359
-
360
- // COMPAT: ensure that all top-level inline nodes are wrapped into a block.
361
- nodes = nodes.reduce(function (memo, node, i, original) {
362
- if (node.object === 'block') {
363
- memo.push(node);
364
- return memo;
365
- }
366
- if (i > 0 && original[i - 1].object !== 'block') {
367
- var _block = memo[memo.length - 1];
368
- _block.nodes.push(node);
369
- return memo;
370
- }
371
- var block = _extends({
372
- object: 'block',
373
- data: {},
374
- isVoid: false
375
- }, defaultBlock, {
376
- nodes: [node]
377
- });
378
- memo.push(block);
379
- return memo;
380
- }, []);
381
- if (nodes.length === 0) {
382
- nodes = [_extends({
383
- object: 'block',
384
- data: {},
385
- isVoid: false
386
- }, defaultBlock, {
387
- nodes: [{
388
- object: 'text',
389
- leaves: [{
390
- object: 'leaf',
391
- text: '',
392
- marks: []
393
- }]
394
- }]
395
- })];
396
- }
397
- var json = {
398
- object: 'value',
399
- document: {
400
- object: 'document',
401
- data: {},
402
- nodes: nodes
403
- },
404
- schema: {
405
- rules: []
406
- }
407
- };
408
- var i;
409
- for (i = 0; i < 3000; i++) {
410
- json.schema.rules.push({
411
- match: {
412
- object: 'document'
413
- },
414
- nodes: [{
415
- match: {
416
- object: 'block'
417
- }
418
- }]
419
- });
420
- }
421
- var ret = toJSON ? json : _slate.Value.fromJSON(json);
422
- if (ret) {
423
- return ret;
424
- }
425
- return null;
426
- };
427
- var reduceMultipleBrs = exports.reduceMultipleBrs = function reduceMultipleBrs(markup) {
428
- try {
429
- return markup.replace(/(<br\s*\/?>){3,}/gi, '<br>');
430
- } catch (e) {
431
- // eslint-disable-next-line no-console
432
- console.log('Couldn\'t remove <br/> tags: ', e);
433
- }
434
- return markup;
435
- };
436
- var reduceRedundantNewLineCharacters = function reduceRedundantNewLineCharacters(markup) {
437
- try {
438
- return markup.replace(/\n/gi, '');
439
- } catch (e) {
440
- // eslint-disable-next-line no-console
441
- console.log('Couldn\'t remove <br/> tags: ', e);
442
- }
443
- return markup;
444
- };
445
-
446
- /**
447
- * Makes sure that the html provided respects the schema
448
- * rules for the slate editor.
449
- * @param markup
450
- * @returns {string}
451
- */
452
- var fixHtmlCode = function fixHtmlCode(markup) {
453
- var wrapperEl = document.createElement('div');
454
- wrapperEl.innerHTML = markup;
455
-
456
- /**
457
- * DIV elements that are at the same level as paragraphs
458
- * are replaced with P elements for normalizing purposes
459
- * @param child
460
- */
461
- var fixParagraphs = function fixParagraphs(child) {
462
- var p = document.createElement('p');
463
- p.innerHTML = child.innerHTML;
464
- Array.from(child.attributes).forEach(function (attr) {
465
- p.setAttribute(attr.name, attr.value);
466
- });
467
- child.replaceWith(p);
468
- };
469
-
470
- /**
471
- * @summary Makes sure that tables are placed in the root document.
472
- * @description This function removes the tables from the nodes that are
473
- * placed inside the root element and places them exactly near
474
- * the parent element.
475
- * @param tableArray
476
- */
477
- var fixTables = function fixTables(tableArray) {
478
- tableArray.forEach(function (el) {
479
- var index = el.index,
480
- child = el.child,
481
- parent = el.parent;
482
- var nodesBefore = [];
483
- var nodesAfter = [];
484
- var allNodes = Array.from(parent.childNodes);
485
- var i;
486
- for (i = 0; i < allNodes.length; i++) {
487
- var node = allNodes[i];
488
- if (i < index) {
489
- nodesBefore.push(node);
490
- } else if (i > index) {
491
- nodesAfter.push(node);
492
- }
493
- }
494
-
495
- // creating the element that is going to be placed instead of the parent
496
- var beforeEl = document.createElement(parent.nodeName);
497
- beforeEl.append.apply(beforeEl, nodesBefore);
498
-
499
- // replacing parent with the beforeElement
500
- parent.replaceWith(beforeEl);
501
-
502
- // adding the table right after the before element
503
- beforeEl.after(child);
504
-
505
- // creating the element that is going to be placed after the table
506
- var afterEl = document.createElement(parent.nodeName);
507
- afterEl.append.apply(afterEl, nodesAfter);
508
-
509
- // adding the after element near the table
510
- child.after(afterEl);
511
- });
512
- };
513
- var emptyBlockCheck = function emptyBlockCheck(node) {
514
- return (node.nodeName === 'DIV' || node.nodeName === 'P' || node.nodeName === 'LI') && node.childNodes.length === 0;
515
- };
516
- var _parseNode = function parseNode(el) {
517
- var childArray = Array.from(el.childNodes);
518
- var hasParagraphs = childArray.find(function (child) {
519
- return child.nodeName === 'P';
520
- });
521
- var tables = [];
522
- childArray.forEach(function (child, index) {
523
- // removing empty blocks
524
- if (emptyBlockCheck(child)) {
525
- child.remove();
526
- return;
527
- }
528
- if (hasParagraphs && child.nodeName === 'DIV') {
529
- fixParagraphs(child);
530
- }
531
- if (wrapperEl !== el && child.nodeName === 'TABLE') {
532
- // we don't need to fix tables in the root element
533
- tables.push({
534
- index: index,
535
- child: child,
536
- parent: el
537
- });
538
- }
539
- _parseNode(child);
540
- });
541
- if (tables.length) {
542
- fixTables(tables);
543
- }
544
- };
545
- _parseNode(wrapperEl);
546
- return wrapperEl.innerHTML;
547
- };
548
- var handleHtml = exports.handleHtml = function handleHtml(html) {
549
- return fixHtmlCode(reduceRedundantNewLineCharacters(reduceMultipleBrs(html)));
550
- };
551
- var htmlToValue = exports.htmlToValue = function htmlToValue(html) {
552
- try {
553
- return serializer.deserialize(handleHtml(html));
554
- } catch (e) {
555
- // eslint-disable-next-line no-console
556
- console.log('Couldn\'t parse html: ', e);
557
- return {};
558
- }
559
- };
560
- var valueToHtml = exports.valueToHtml = function valueToHtml(value) {
561
- return serializer.serialize(value);
562
- };
563
-
564
- /**
565
- *
566
- * <div><div>a</div></div> -> <div>a</div>
567
- *
568
- * <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
569
- * <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
570
- */
571
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2xhdGVIdG1sU2VyaWFsaXplciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2RlYnVnIiwiX3RvU3R5bGUiLCJfaXNFbXB0eSIsIl9pbWFnZSIsIl9tYXRoIiwiX21lZGlhIiwiX2xpc3QiLCJfdGFibGUiLCJfcmVzcEFyZWEiLCJfc2xhdGUiLCJfYmxvY2tUYWdzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJsb2ciLCJkZWJ1ZyIsIk1BUktfVEFHUyIsImIiLCJlbSIsInUiLCJzIiwiY29kZSIsInN0cm9uZyIsImJsb2NrcXVvdGUiLCJoMyIsInN1cCIsInN1YiIsInBhcnNlU3R5bGVTdHJpbmciLCJleHBvcnRzIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwiZ2V0QmFzZTY0IiwiZmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJyZWFjdEF0dHJpYnV0ZXMiLCJ0b1N0eWxlT2JqZWN0IiwiY2FtZWxpemUiLCJhZGRVbml0cyIsImF0dHJpYnV0ZXNUb01hcCIsImVsIiwiYWNjIiwiYXR0cmlidXRlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzdHlsZVN0cmluZyIsInJlYWN0U3R5bGVPYmplY3QiLCJhdHRyaWJ1dGVzIiwiYmxvY2tzIiwiZGVzZXJpYWxpemUiLCJuZXh0IiwiYmxvY2siLCJCTE9DS19UQUdTIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2hpbGROb2RlcyIsImNuIiwib2JqZWN0IiwidHlwZSIsImRhdGEiLCJyZWR1Y2UiLCJub2RlcyIsInNlcmlhbGl6ZSIsImNoaWxkcmVuIiwianNvbkRhdGEiLCJ0b0pTT04iLCJrZXkiLCJUYWciLCJjcmVhdGVFbGVtZW50IiwiSU5MSU5FX1RBR1MiLCJzcGFuIiwiaW5saW5lcyIsImlubGluZVRhZyIsImV4dHJhQ1NTUnVsZXNPcHRzIiwiU1RZTEVTX01BUCIsImZvbnRTaXplIiwiZm9udFdlaWdodCIsImJhY2tncm91bmQiLCJib3JkZXJMZWZ0IiwibWFyZ2luIiwicGFkZGluZyIsInJlYWN0VG9IVE1MQXR0cmlidXRlc01hcCIsIm1hcmtzIiwibWFyayIsImVsQ2xhc3NlcyIsImhhc0NTU1J1bGUiLCJuYW1lcyIsImZpbmQiLCJuYW1lIiwiaW5jbHVkZXMiLCJhdHRycyIsImlzRW1wdHkiLCJ1bmRlZmluZWQiLCJfb2JqZWN0JGRhdGEiLCJfanNvbkRhdGEkYXR0cmlidXRlcyIsImh0bWxBdHRycyIsIm9iaiIsIk1hcmsiLCJpc01hcmsiLCJhZGRpdGlvbmFsU3R5bGVzIiwic3R5bGUiLCJmaW5kUHJldmlvdXNUZXh0Iiwibm9kZU5hbWUiLCJwcmV2aW91c1NpYmxpbmciLCJURVhUX1JVTEUiLCJub3JtYWxpemUiLCJsZWF2ZXMiLCJ0ZXh0Iiwibm9kZVZhbHVlIiwic3BsaXQiLCJhcnJheSIsImkiLCJSVUxFUyIsImxpc3RTZXJpYWxpemF0aW9uIiwibWF0aFNlcmlhbGl6YXRpb24iLCJtZWRpYVNlcmlhbGl6YXRpb24iLCJpbWdTZXJpYWxpemF0aW9uIiwidGFibGVTZXJpYWxpemF0aW9uIiwicmVzcG9uc2VBcmVhU2VyaWFsaXphdGlvbiIsImFsbFdoaXRlc3BhY2UiLCJub2RlIiwidGVzdCIsInRleHRDb250ZW50IiwiZGVmYXVsdFBhcnNlSHRtbCIsImh0bWwiLCJET01QYXJzZXIiLCJFcnJvciIsInBhcnNlZCIsInBhcnNlRnJvbVN0cmluZyIsImJvZHkiLCJ0ZXh0Tm9kZXMiLCJkb2N1bWVudCIsImNyZWF0ZVRyZWVXYWxrZXIiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwibiIsIm5leHROb2RlIiwiX24kbmV4dFNpYmxpbmciLCJfbiRwcmV2aW91c1NpYmxpbmciLCJpc1doaXRlU3BhY2UiLCJpc05vdE5lYXJNYXJrdXAiLCJuZXh0U2libGluZyIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsInBhcnNlSHRtbCIsIndpbmRvdyIsInNlcmlhbGl6ZXIiLCJIdG1sIiwiZGVmYXVsdEJsb2NrIiwicnVsZXMiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsInNvdXJjZSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm9wdGlvbnMiLCJfb3B0aW9ucyR0b0pTT04iLCJmcmFnbWVudCIsIkFycmF5IiwiZnJvbSIsImRlc2VyaWFsaXplRWxlbWVudHMiLCJtZW1vIiwib3JpZ2luYWwiLCJfYmxvY2siLCJpc1ZvaWQiLCJqc29uIiwic2NoZW1hIiwicmV0IiwiVmFsdWUiLCJmcm9tSlNPTiIsInJlZHVjZU11bHRpcGxlQnJzIiwibWFya3VwIiwicmVwbGFjZSIsImNvbnNvbGUiLCJyZWR1Y2VSZWR1bmRhbnROZXdMaW5lQ2hhcmFjdGVycyIsImZpeEh0bWxDb2RlIiwid3JhcHBlckVsIiwiaW5uZXJIVE1MIiwiZml4UGFyYWdyYXBocyIsImNoaWxkIiwicCIsImF0dHIiLCJzZXRBdHRyaWJ1dGUiLCJyZXBsYWNlV2l0aCIsImZpeFRhYmxlcyIsInRhYmxlQXJyYXkiLCJpbmRleCIsInBhcmVudCIsIm5vZGVzQmVmb3JlIiwibm9kZXNBZnRlciIsImFsbE5vZGVzIiwiYmVmb3JlRWwiLCJhcHBlbmQiLCJhZnRlciIsImFmdGVyRWwiLCJlbXB0eUJsb2NrQ2hlY2siLCJwYXJzZU5vZGUiLCJjaGlsZEFycmF5IiwiaGFzUGFyYWdyYXBocyIsInRhYmxlcyIsInJlbW92ZSIsImhhbmRsZUh0bWwiLCJodG1sVG9WYWx1ZSIsInZhbHVlVG9IdG1sIl0sInNvdXJjZXMiOlsiLi4vc3JjL3NlcmlhbGl6YXRpb24uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIdG1sIGZyb20gJ3NsYXRlLWh0bWwtc2VyaWFsaXplcic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IG9iamVjdCBhcyB0b1N0eWxlT2JqZWN0IH0gZnJvbSAndG8tc3R5bGUnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuXG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIGltZ1NlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvaW1hZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBtYXRoU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9tYXRoJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbWVkaWFTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL21lZGlhJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbGlzdFNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvbGlzdCc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHRhYmxlU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy90YWJsZSc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvcmVzcEFyZWEnO1xuaW1wb3J0IHsgTWFyaywgVmFsdWUgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBCTE9DS19UQUdTIH0gZnJvbSAnLi9ibG9jay10YWdzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6c2VyaWFsaXphdGlvbicpO1xuXG4vKipcbiAqIFRhZ3MgdG8gbWFya3MuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG5jb25zdCBNQVJLX1RBR1MgPSB7XG4gIGI6ICdib2xkJyxcbiAgZW06ICdpdGFsaWMnLFxuICB1OiAndW5kZXJsaW5lJyxcbiAgczogJ3N0cmlrZXRocm91Z2gnLFxuICBjb2RlOiAnY29kZScsXG4gIHN0cm9uZzogJ2JvbGQnLFxuICBibG9ja3F1b3RlOiAnYmxvY2txdW90ZScsXG4gIGgzOiAnaDMnLFxuICBzdXA6ICdzdXAnLFxuICBzdWI6ICdzdWInLFxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlU3R5bGVTdHJpbmcgPSAocykgPT4ge1xuICBjb25zdCByZWdleCA9IC8oW1xcdy1dKilcXHMqOlxccyooW147XSopL2c7XG4gIGxldCBtYXRjaDtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHMpKSkge1xuICAgIHJlc3VsdFttYXRjaFsxXV0gPSBtYXRjaFsyXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCYXNlNjQgPSAoZmlsZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IChvKSA9PiB0b1N0eWxlT2JqZWN0KG8sIHsgY2FtZWxpemU6IHRydWUsIGFkZFVuaXRzOiBmYWxzZSB9KTtcblxuY29uc3QgYXR0cmlidXRlc1RvTWFwID0gKGVsKSA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2JvcmRlcicsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjbGFzcycsICdzdHlsZScsICdhbGlnbiddO1xuXG4vKipcbiAqIFNlcmlhbGl6ZXIgcnVsZXMuXG4gKlxuICogQHR5cGUge0FycmF5fVxuICovXG5cbmNvbnN0IGJsb2NrcyA9IHtcbiAgZGVzZXJpYWxpemUoZWwsIG5leHQpIHtcbiAgICBsb2coJ1tibG9ja3M6ZGVzZXJpYWxpemVdIGJsb2NrOiAnLCBlbCk7XG4gICAgY29uc3QgYmxvY2sgPSBCTE9DS19UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFibG9jaykgcmV0dXJuO1xuICAgIGxvZygnW2Jsb2NrczpkZXNlcmlhbGl6ZV0gYmxvY2s6ICcsIGJsb2NrKTtcblxuICAgIGlmIChlbC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY24gPSBlbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgaWYgKGNuICYmIGNuLnRhZ05hbWUgJiYgY24udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBibG9jaykge1xuICAgICAgICBsb2coJ1t3ZSBoYXZlIGEgY2hpbGQgbm9kZSBvZiB0aGUgc2FtZV0uLi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICB0eXBlOiBibG9jayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGJsb2NrIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGE6IHsgYXR0cmlidXRlczogYXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwge30pIH0sXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemU6IChvYmplY3QsIGNoaWxkcmVuKSA9PiB7XG4gICAgaWYgKG9iamVjdC5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tibG9ja3M6c2VyaWFsaXplXSBvYmplY3Q6ICcsIG9iamVjdCwgY2hpbGRyZW4pO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGtleSBpbiBCTE9DS19UQUdTKSB7XG4gICAgICBpZiAoQkxPQ0tfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IElOTElORV9UQUdTID0ge1xuICBzcGFuOiAnc3BhbicsXG59O1xuXG5jb25zdCBpbmxpbmVzID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGxvZygnW2lubGluZXM6ZGVzZXJpYWxpemVdIGlubGluZTogJywgZWwpO1xuICAgIGNvbnN0IGlubGluZVRhZyA9IElOTElORV9UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFpbmxpbmVUYWcpIHJldHVybjtcbiAgICBsb2coJ1tpbmxpbmVzOmRlc2VyaWFsaXplXSBpbmxpbmU6ICcsIGlubGluZVRhZyk7XG5cbiAgICBpZiAoZWwuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNuID0gZWwuY2hpbGROb2Rlc1swXTtcbiAgICAgIGlmIChjbiAmJiBjbi50YWdOYW1lICYmIGNuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gaW5saW5lVGFnKSB7XG4gICAgICAgIGxvZygnW3dlIGhhdmUgYSBjaGlsZCBub2RlIG9mIHRoZSBzYW1lXS4uLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ2lubGluZScsXG4gICAgICB0eXBlOiBpbmxpbmVUYWcsXG4gICAgICAvKipcbiAgICAgICAqIEhlcmUgZm9yIHJlbmRlcmluZyBzdHlsZXMgZm9yIGFsbCBpbmxpbmUgZWxlbWVudHNcbiAgICAgICAqL1xuICAgICAgZGF0YTogeyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSkgfSxcbiAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpLFxuICAgIH07XG4gIH0sXG4gIHNlcmlhbGl6ZTogKG9iamVjdCwgY2hpbGRyZW4pID0+IHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2lubGluZScpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tpbmxpbmVzOnNlcmlhbGl6ZV0gb2JqZWN0OiAnLCBvYmplY3QsIGNoaWxkcmVuKTtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChrZXkgaW4gSU5MSU5FX1RBR1MpIHtcbiAgICAgIGlmIChJTkxJTkVfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGV4dHJhQ1NTUnVsZXNPcHRzID0ge307XG5cbmNvbnN0IFNUWUxFU19NQVAgPSB7XG4gIGgzOiB7XG4gICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICBmb250V2VpZ2h0OiAnaW5oZXJpdCcsXG4gIH0sXG4gIGJsb2NrcXVvdGU6IHtcbiAgICBiYWNrZ3JvdW5kOiAnI2Y5ZjlmOScsXG4gICAgYm9yZGVyTGVmdDogJzVweCBzb2xpZCAjY2NjJyxcbiAgICBtYXJnaW46ICcxLjVlbSAxMHB4JyxcbiAgICBwYWRkaW5nOiAnLjVlbSAxMHB4JyxcbiAgfSxcbn07XG5cbmNvbnN0IHJlYWN0VG9IVE1MQXR0cmlidXRlc01hcCA9IHtcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxufTtcblxuY29uc3QgbWFya3MgPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgbWFyayA9IE1BUktfVEFHU1tlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcbiAgICBjb25zdCBoYXNDU1NSdWxlID0gKGV4dHJhQ1NTUnVsZXNPcHRzPy5uYW1lcyB8fCBbXSkuZmluZCgobmFtZSkgPT4gZWxDbGFzc2VzPy5pbmNsdWRlcyhuYW1lKSk7XG5cbiAgICBpZiAoIW1hcmsgJiYgIWhhc0NTU1J1bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coJ1tkZXNlcmlhbGl6ZV0gbWFyazogJywgbWFyayk7XG4gICAgY29uc3QgYXR0cnMgPSBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSk7XG4gICAgY29uc3QgZGF0YSA9IGlzRW1wdHkoYXR0cnMpID8gdW5kZWZpbmVkIDogeyBhdHRyaWJ1dGVzOiBhdHRycyB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ21hcmsnLFxuICAgICAgdHlwZTogaGFzQ1NTUnVsZSA/ICdjc3MnIDogbWFyayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGEsXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemUob2JqZWN0LCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGE/LnRvSlNPTigpIHx8IHt9O1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGpzb25EYXRhLmF0dHJpYnV0ZXM/LmNsYXNzIHx8ICcnO1xuICAgIGNvbnN0IGhhc0NTU1J1bGUgPSAoZXh0cmFDU1NSdWxlc09wdHM/Lm5hbWVzIHx8IFtdKS5maW5kKChuYW1lKSA9PiBlbENsYXNzZXM/LmluY2x1ZGVzKG5hbWUpKTtcblxuICAgIGlmIChoYXNDU1NSdWxlKSB7XG4gICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3Qua2V5cyhqc29uRGF0YS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICAgIG9ialtyZWFjdFRvSFRNTEF0dHJpYnV0ZXNNYXBba2V5XSB8fCBrZXldID0ganNvbkRhdGEuYXR0cmlidXRlc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgICByZXR1cm4gPHNwYW4gey4uLmh0bWxBdHRyc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgfVxuXG4gICAgaWYgKE1hcmsuaXNNYXJrKG9iamVjdCkpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBNQVJLX1RBR1MpIHtcbiAgICAgICAgaWYgKE1BUktfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICAgIGNvbnN0IFRhZyA9IGtleTtcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsU3R5bGVzID0gU1RZTEVTX01BUFtUYWddO1xuXG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghanNvbkRhdGEuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBqc29uRGF0YS5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUgPSB7XG4gICAgICAgICAgICAgIC4uLmpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUsXG4gICAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxTdHlsZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiA8VGFnIHsuLi5qc29uRGF0YS5hdHRyaWJ1dGVzfT57Y2hpbGRyZW59PC9UYWc+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBmaW5kUHJldmlvdXNUZXh0ID0gKGVsKSA9PiB7XG4gIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGlmIChlbC5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICByZXR1cm4gZmluZFByZXZpb3VzVGV4dChlbC5wcmV2aW91c1NpYmxpbmcpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgVEVYVF9SVUxFID0ge1xuICBkZXNlcmlhbGl6ZShlbCkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIG9uIHRoZSBkb20gZWxlbWVudCBpbiBvcmRlciB0byBtZXJnZSB0aGUgYWRqYWNlbnQgdGV4dCBub2RlcyB0b2dldGhlclxuICAgICAqICovXG4gICAgZWwubm9ybWFsaXplKCk7XG5cbiAgICBpZiAoZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdicicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9iamVjdDogJ3RleHQnLFxuICAgICAgICBsZWF2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3Q6ICdsZWFmJyxcbiAgICAgICAgICAgIHRleHQ6ICdcXG4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKGVsLm5vZGVWYWx1ZSAmJiBlbC5ub2RlVmFsdWUubWF0Y2goLzwhLS0uKj8tLT4vKSkgcmV0dXJuO1xuXG4gICAgICBsb2coJ1t0ZXh0OmRlc2VyaWFsaXplXSByZXR1cm4gdGV4dCBvYmplY3QuLicpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgIGxlYXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdDogJ2xlYWYnLFxuICAgICAgICAgICAgdGV4dDogZWwubm9kZVZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBzZXJpYWxpemUob2JqLCBjaGlsZHJlbikge1xuICAgIGlmIChvYmoub2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNwbGl0KCdcXG4nKS5yZWR1Y2UoKGFycmF5LCB0ZXh0LCBpKSA9PiB7XG4gICAgICAgIGlmIChpICE9PSAwKSBhcnJheS5wdXNoKDxiciAvPik7XG4gICAgICAgIGFycmF5LnB1c2godGV4dCk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBSVUxFUyA9IFtcbiAgbGlzdFNlcmlhbGl6YXRpb24sXG4gIG1hdGhTZXJpYWxpemF0aW9uLFxuICBtZWRpYVNlcmlhbGl6YXRpb24sXG4gIGltZ1NlcmlhbGl6YXRpb24sXG4gIHRhYmxlU2VyaWFsaXphdGlvbixcbiAgcmVzcG9uc2VBcmVhU2VyaWFsaXphdGlvbixcbiAgVEVYVF9SVUxFLFxuICBpbmxpbmVzLFxuICBibG9ja3MsXG4gIG1hcmtzLFxuXTtcblxuZnVuY3Rpb24gYWxsV2hpdGVzcGFjZShub2RlKSB7XG4gIC8vIFVzZSBFQ01BLTI2MiBFZGl0aW9uIDMgU3RyaW5nIGFuZCBSZWdFeHAgZmVhdHVyZXNcbiAgcmV0dXJuICEvW15cXHRcXG5cXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFBhcnNlSHRtbChodG1sKSB7XG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUaGUgbmF0aXZlIGBET01QYXJzZXJgIGdsb2JhbCB3aGljaCB0aGUgYEh0bWxgIHNlcmlhbGl6ZXIgdXNlcyBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50IGluIHRoaXMgZW52aXJvbm1lbnQuIFlvdSBtdXN0IHN1cHBseSB0aGUgYG9wdGlvbnMucGFyc2VIdG1sYCBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VkO1xuICB2YXIgdGV4dE5vZGVzID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihib2R5LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgbnVsbCk7XG4gIHZhciBuID0gdGV4dE5vZGVzLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKG4pIHtcbiAgICBjb25zdCBpc1doaXRlU3BhY2UgPSBhbGxXaGl0ZXNwYWNlKG4pO1xuICAgIGNvbnN0IGlzTm90TmVhck1hcmt1cCA9XG4gICAgICAhTUFSS19UQUdTW24ubmV4dFNpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldICYmICFNQVJLX1RBR1Nbbi5wcmV2aW91c1NpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldO1xuXG4gICAgaWYgKChpc1doaXRlU3BhY2UgJiYgaXNOb3ROZWFyTWFya3VwKSB8fCBuLm5vZGVWYWx1ZSA9PT0gJ1xcdTIwMEInKSB7XG4gICAgICBuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7XG4gICAgfVxuICAgIG4gPSB0ZXh0Tm9kZXMubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufVxuXG4vKiogSWYgdGhpcyBsaWIgaXMgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUsIHdlIG5lZWQgdG8gYnlwYXNzIHVzaW5nIHRoZSBET01QYXJzZXIgLSBqdXN0IHB1dCBpbiBhIHN0dWIuICovXG5jb25zdCBwYXJzZUh0bWwgPVxuICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuICAgID8gKCkgPT4gKHtcbiAgICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICB9KVxuICAgIDogZGVmYXVsdFBhcnNlSHRtbDtcblxuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBIdG1sKHtcbiAgZGVmYXVsdEJsb2NrOiAnZGl2JyxcbiAgcnVsZXM6IFJVTEVTLFxuICBwYXJzZUh0bWwsXG59KTtcblxuY29uc3QgX2V4dGVuZHMgPVxuICBPYmplY3QuYXNzaWduIHx8XG4gIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbi8qKlxuICogVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGZ1bmN0aW9uIHRoYXQgZXZlbnR1YWxseSBsZWFkc1xuICogdG8gdGhlIG1heCBpdGVyYXRpb24gb2YgMTIsIHdoaWNoIGluIG1vc3QgY2FzZXMgaXQncyBub3QgZW5vdWdoLiBUaGUgbmV3ZXIgdmVyc2lvbnNcbiAqIGhhdmUgYSBkaWZmZXJlbnQgd2F5IHRvIGNhbGN1bGF0ZSB0aGlzLCBidXQgdXBkYXRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHNsYXRlXG4gKiByZXF1aXJlcyBhIGxvdCBvZiB3b3JrIGZpeGluZyBvdGhlciBpc3N1ZXMuIFNvIHdlIGp1c3QgaW5jcmVhc2UgdGhlIHJ1bGVzIGJ5IDEwMDAsXG4gKiB3aGljaCBtZWFucyBhIGxvdCBvZiBpdGVyYXRpb25zLlxuICogQmVsb3cgaXMgdGhlIGNvZGUgdGhhdCBjYWxjdWxhdGVzIHRoZSBtYXggaXRlcmF0aW9ucy5cbiAqIHZhciBtYXggPSBzY2hlbWEuc3RhY2sucGx1Z2lucy5sZW5ndGggKyBzY2hlbWEucnVsZXMubGVuZ3RoICsgMTtcbiAqL1xuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIGRlc2VyaWFsaXplKGh0bWwpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGNvbnN0IF9vcHRpb25zJHRvSlNPTiA9IG9wdGlvbnMudG9KU09OO1xuICBjb25zdCB0b0pTT04gPSBfb3B0aW9ucyR0b0pTT04gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX29wdGlvbnMkdG9KU09OO1xuICBjb25zdCBkZWZhdWx0QmxvY2sgPSB0aGlzLmRlZmF1bHRCbG9jaztcbiAgY29uc3QgcGFyc2VIdG1sID0gdGhpcy5wYXJzZUh0bWw7XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwYXJzZUh0bWwoaHRtbCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZE5vZGVzKTtcbiAgbGV0IG5vZGVzID0gdGhpcy5kZXNlcmlhbGl6ZUVsZW1lbnRzKGNoaWxkcmVuKTtcblxuICAvLyBDT01QQVQ6IGVuc3VyZSB0aGF0IGFsbCB0b3AtbGV2ZWwgaW5saW5lIG5vZGVzIGFyZSB3cmFwcGVkIGludG8gYSBibG9jay5cbiAgbm9kZXMgPSBub2Rlcy5yZWR1Y2UoZnVuY3Rpb24obWVtbywgbm9kZSwgaSwgb3JpZ2luYWwpIHtcbiAgICBpZiAobm9kZS5vYmplY3QgPT09ICdibG9jaycpIHtcbiAgICAgIG1lbW8ucHVzaChub2RlKTtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cblxuICAgIGlmIChpID4gMCAmJiBvcmlnaW5hbFtpIC0gMV0ub2JqZWN0ICE9PSAnYmxvY2snKSB7XG4gICAgICBjb25zdCBfYmxvY2sgPSBtZW1vW21lbW8ubGVuZ3RoIC0gMV07XG5cbiAgICAgIF9ibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfVxuXG4gICAgY29uc3QgYmxvY2sgPSBfZXh0ZW5kcyh7IG9iamVjdDogJ2Jsb2NrJywgZGF0YToge30sIGlzVm9pZDogZmFsc2UgfSwgZGVmYXVsdEJsb2NrLCB7XG4gICAgICBub2RlczogW25vZGVdLFxuICAgIH0pO1xuXG4gICAgbWVtby5wdXNoKGJsb2NrKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xuXG4gIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICBub2RlcyA9IFtcbiAgICAgIF9leHRlbmRzKHsgb2JqZWN0OiAnYmxvY2snLCBkYXRhOiB7fSwgaXNWb2lkOiBmYWxzZSB9LCBkZWZhdWx0QmxvY2ssIHtcbiAgICAgICAgbm9kZXM6IFt7IG9iamVjdDogJ3RleHQnLCBsZWF2ZXM6IFt7IG9iamVjdDogJ2xlYWYnLCB0ZXh0OiAnJywgbWFya3M6IFtdIH1dIH1dLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGpzb24gPSB7XG4gICAgb2JqZWN0OiAndmFsdWUnLFxuICAgIGRvY3VtZW50OiB7XG4gICAgICBvYmplY3Q6ICdkb2N1bWVudCcsXG4gICAgICBkYXRhOiB7fSxcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICB9LFxuICAgIHNjaGVtYToge1xuICAgICAgcnVsZXM6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMwMDA7IGkrKykge1xuICAgIGpzb24uc2NoZW1hLnJ1bGVzLnB1c2goe1xuICAgICAgbWF0Y2g6IHsgb2JqZWN0OiAnZG9jdW1lbnQnIH0sXG4gICAgICBub2RlczogW3sgbWF0Y2g6IHsgb2JqZWN0OiAnYmxvY2snIH0gfV0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXQgPSB0b0pTT04gPyBqc29uIDogVmFsdWUuZnJvbUpTT04oanNvbik7XG5cbiAgaWYgKHJldCkge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCByZWR1Y2VNdWx0aXBsZUJycyA9IChtYXJrdXApID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbWFya3VwLnJlcGxhY2UoLyg8YnJcXHMqXFwvPz4pezMsfS9naSwgJzxicj4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ0NvdWxkblxcJ3QgcmVtb3ZlIDxici8+IHRhZ3M6ICcsIGUpO1xuICB9XG5cbiAgcmV0dXJuIG1hcmt1cDtcbn07XG5cbmNvbnN0IHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzID0gKG1hcmt1cCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBtYXJrdXAucmVwbGFjZSgvXFxuL2dpLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IHJlbW92ZSA8YnIvPiB0YWdzOiAnLCBlKTtcbiAgfVxuXG4gIHJldHVybiBtYXJrdXA7XG59O1xuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgaHRtbCBwcm92aWRlZCByZXNwZWN0cyB0aGUgc2NoZW1hXG4gKiBydWxlcyBmb3IgdGhlIHNsYXRlIGVkaXRvci5cbiAqIEBwYXJhbSBtYXJrdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGZpeEh0bWxDb2RlID0gKG1hcmt1cCkgPT4ge1xuICBjb25zdCB3cmFwcGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICB3cmFwcGVyRWwuaW5uZXJIVE1MID0gbWFya3VwO1xuXG4gIC8qKlxuICAgKiBESVYgZWxlbWVudHMgdGhhdCBhcmUgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgcGFyYWdyYXBoc1xuICAgKiBhcmUgcmVwbGFjZWQgd2l0aCBQIGVsZW1lbnRzIGZvciBub3JtYWxpemluZyBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gY2hpbGRcbiAgICovXG4gIGNvbnN0IGZpeFBhcmFncmFwaHMgPSAoY2hpbGQpID0+IHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgcC5pbm5lckhUTUwgPSBjaGlsZC5pbm5lckhUTUw7XG5cbiAgICBBcnJheS5mcm9tKGNoaWxkLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgIHAuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfSk7XG4gICAgY2hpbGQucmVwbGFjZVdpdGgocCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE1ha2VzIHN1cmUgdGhhdCB0YWJsZXMgYXJlIHBsYWNlZCBpbiB0aGUgcm9vdCBkb2N1bWVudC5cbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgdGFibGVzIGZyb20gdGhlIG5vZGVzIHRoYXQgYXJlXG4gICAqIHBsYWNlZCBpbnNpZGUgdGhlIHJvb3QgZWxlbWVudCBhbmQgcGxhY2VzIHRoZW0gZXhhY3RseSBuZWFyXG4gICAqIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICogQHBhcmFtIHRhYmxlQXJyYXlcbiAgICovXG4gIGNvbnN0IGZpeFRhYmxlcyA9ICh0YWJsZUFycmF5KSA9PiB7XG4gICAgdGFibGVBcnJheS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgY29uc3QgeyBpbmRleCwgY2hpbGQsIHBhcmVudCB9ID0gZWw7XG4gICAgICBjb25zdCBub2Rlc0JlZm9yZSA9IFtdO1xuICAgICAgY29uc3Qgbm9kZXNBZnRlciA9IFtdO1xuICAgICAgY29uc3QgYWxsTm9kZXMgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZE5vZGVzKTtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGFsbE5vZGVzW2ldO1xuXG4gICAgICAgIGlmIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBub2Rlc0JlZm9yZS5wdXNoKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGkgPiBpbmRleCkge1xuICAgICAgICAgIG5vZGVzQWZ0ZXIucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGluZyB0aGUgZWxlbWVudCB0aGF0IGlzIGdvaW5nIHRvIGJlIHBsYWNlZCBpbnN0ZWFkIG9mIHRoZSBwYXJlbnRcbiAgICAgIGNvbnN0IGJlZm9yZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQubm9kZU5hbWUpO1xuXG4gICAgICBiZWZvcmVFbC5hcHBlbmQoLi4ubm9kZXNCZWZvcmUpO1xuXG4gICAgICAvLyByZXBsYWNpbmcgcGFyZW50IHdpdGggdGhlIGJlZm9yZUVsZW1lbnRcbiAgICAgIHBhcmVudC5yZXBsYWNlV2l0aChiZWZvcmVFbCk7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgdGFibGUgcmlnaHQgYWZ0ZXIgdGhlIGJlZm9yZSBlbGVtZW50XG4gICAgICBiZWZvcmVFbC5hZnRlcihjaGlsZCk7XG5cbiAgICAgIC8vIGNyZWF0aW5nIHRoZSBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSB0YWJsZVxuICAgICAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50Lm5vZGVOYW1lKTtcblxuICAgICAgYWZ0ZXJFbC5hcHBlbmQoLi4ubm9kZXNBZnRlcik7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgYWZ0ZXIgZWxlbWVudCBuZWFyIHRoZSB0YWJsZVxuICAgICAgY2hpbGQuYWZ0ZXIoYWZ0ZXJFbCk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZW1wdHlCbG9ja0NoZWNrID0gKG5vZGUpID0+XG4gICAgKG5vZGUubm9kZU5hbWUgPT09ICdESVYnIHx8IG5vZGUubm9kZU5hbWUgPT09ICdQJyB8fCBub2RlLm5vZGVOYW1lID09PSAnTEknKSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwO1xuXG4gIGNvbnN0IHBhcnNlTm9kZSA9IChlbCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpO1xuICAgIGNvbnN0IGhhc1BhcmFncmFwaHMgPSBjaGlsZEFycmF5LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5ub2RlTmFtZSA9PT0gJ1AnKTtcbiAgICBjb25zdCB0YWJsZXMgPSBbXTtcblxuICAgIGNoaWxkQXJyYXkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAvLyByZW1vdmluZyBlbXB0eSBibG9ja3NcbiAgICAgIGlmIChlbXB0eUJsb2NrQ2hlY2soY2hpbGQpKSB7XG4gICAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNQYXJhZ3JhcGhzICYmIGNoaWxkLm5vZGVOYW1lID09PSAnRElWJykge1xuICAgICAgICBmaXhQYXJhZ3JhcGhzKGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdyYXBwZXJFbCAhPT0gZWwgJiYgY2hpbGQubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBmaXggdGFibGVzIGluIHRoZSByb290IGVsZW1lbnRcbiAgICAgICAgdGFibGVzLnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcmVudDogZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwYXJzZU5vZGUoY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRhYmxlcy5sZW5ndGgpIHtcbiAgICAgIGZpeFRhYmxlcyh0YWJsZXMpO1xuICAgIH1cbiAgfTtcblxuICBwYXJzZU5vZGUod3JhcHBlckVsKTtcblxuICByZXR1cm4gd3JhcHBlckVsLmlubmVySFRNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdG1sID0gKGh0bWwpID0+IGZpeEh0bWxDb2RlKHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzKHJlZHVjZU11bHRpcGxlQnJzKGh0bWwpKSk7XG5cbmV4cG9ydCBjb25zdCBodG1sVG9WYWx1ZSA9IChodG1sKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaGFuZGxlSHRtbChodG1sKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IHBhcnNlIGh0bWw6ICcsIGUpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlVG9IdG1sID0gKHZhbHVlKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSk7XG5cbi8qKlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjxkaXY+YjwvZGl2PlxuICogPGRpdj48ZGl2PmE8L2Rpdj40NDQ0PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjQ0NDQ8ZGl2PmI8L2Rpdj5cbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLG9CQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxLQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxTQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxNQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxVQUFBLEdBQUFaLE9BQUE7QUFBMEMsU0FBQWEsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENB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