@kepler.gl/utils 3.1.0-alpha.1 → 3.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/aggregation.d.ts +13 -0
  2. package/dist/aggregation.js +84 -0
  3. package/dist/application-config.d.ts +25 -0
  4. package/dist/application-config.js +52 -0
  5. package/dist/arrow-data-container.d.ts +62 -0
  6. package/dist/arrow-data-container.js +331 -0
  7. package/dist/color-utils.d.ts +108 -0
  8. package/dist/color-utils.js +443 -0
  9. package/dist/data-container-interface.d.ts +138 -0
  10. package/dist/data-container-interface.js +6 -0
  11. package/dist/data-container-utils.d.ts +30 -0
  12. package/dist/data-container-utils.js +74 -0
  13. package/dist/data-row.d.ts +59 -0
  14. package/dist/data-row.js +110 -0
  15. package/dist/data-scale-utils.d.ts +119 -0
  16. package/dist/data-scale-utils.js +340 -0
  17. package/dist/data-utils.d.ts +98 -0
  18. package/dist/data-utils.js +436 -0
  19. package/dist/dataset-utils.d.ts +45 -0
  20. package/dist/dataset-utils.js +313 -0
  21. package/dist/dom-to-image.d.ts +73 -0
  22. package/dist/dom-to-image.js +421 -0
  23. package/dist/dom-utils.d.ts +23 -0
  24. package/dist/dom-utils.js +349 -0
  25. package/dist/effect-utils.d.ts +24 -0
  26. package/dist/effect-utils.js +166 -0
  27. package/dist/export-map-html.d.ts +9 -0
  28. package/dist/export-map-html.js +25 -0
  29. package/dist/export-utils.d.ts +40 -0
  30. package/dist/export-utils.js +201 -0
  31. package/dist/filter-utils.d.ts +331 -0
  32. package/dist/filter-utils.js +1214 -0
  33. package/dist/format.d.ts +3 -0
  34. package/dist/format.js +38 -0
  35. package/dist/gl-utils.d.ts +1 -0
  36. package/dist/gl-utils.js +27 -0
  37. package/dist/index.d.ts +42 -0
  38. package/dist/index.js +941 -0
  39. package/dist/indexed-data-container.d.ts +34 -0
  40. package/dist/indexed-data-container.js +214 -0
  41. package/dist/locale-utils.d.ts +2 -0
  42. package/dist/locale-utils.js +39 -0
  43. package/dist/map-info-utils.d.ts +1 -0
  44. package/dist/map-info-utils.js +14 -0
  45. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +57 -0
  46. package/dist/map-style-utils/mapbox-gl-style-editor.js +188 -0
  47. package/dist/map-style-utils/mapbox-utils.d.ts +14 -0
  48. package/dist/map-style-utils/mapbox-utils.js +51 -0
  49. package/dist/map-utils.d.ts +9 -0
  50. package/dist/map-utils.js +48 -0
  51. package/dist/mapbox-utils.d.ts +7 -0
  52. package/dist/mapbox-utils.js +19 -0
  53. package/dist/noop.d.ts +1 -0
  54. package/dist/noop.js +13 -0
  55. package/dist/notifications-utils.d.ts +42 -0
  56. package/dist/notifications-utils.js +69 -0
  57. package/dist/observe-dimensions.d.ts +15 -0
  58. package/dist/observe-dimensions.js +130 -0
  59. package/dist/plot.d.ts +131 -0
  60. package/dist/plot.js +615 -0
  61. package/dist/position-utils.d.ts +6 -0
  62. package/dist/position-utils.js +26 -0
  63. package/dist/projection-utils.d.ts +22 -0
  64. package/dist/projection-utils.js +83 -0
  65. package/dist/quick-insertion-sort.d.ts +12 -0
  66. package/dist/quick-insertion-sort.js +132 -0
  67. package/dist/row-data-container.d.ts +31 -0
  68. package/dist/row-data-container.js +206 -0
  69. package/dist/searcher-utils.d.ts +1 -0
  70. package/dist/searcher-utils.js +25 -0
  71. package/dist/split-map-utils.d.ts +32 -0
  72. package/dist/split-map-utils.js +99 -0
  73. package/dist/strings.d.ts +4 -0
  74. package/dist/strings.js +16 -0
  75. package/dist/time.d.ts +54 -0
  76. package/dist/time.js +325 -0
  77. package/dist/types.d.ts +18 -0
  78. package/dist/types.js +6 -0
  79. package/dist/utils.d.ts +104 -0
  80. package/dist/utils.js +241 -0
  81. package/package.json +14 -6
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
+ var _window = _interopRequireDefault(require("global/window"));
10
+ var _document = _interopRequireDefault(require("global/document"));
11
+ var _console = _interopRequireDefault(require("global/console"));
12
+ var _miniSvgDataUri = _interopRequireDefault(require("mini-svg-data-uri"));
13
+ var _constants = require("@kepler.gl/constants");
14
+ var _domUtils = require("./dom-utils");
15
+ // SPDX-License-Identifier: MIT
16
+ // Copyright contributors to the kepler.gl project
17
+
18
+ /**
19
+ * This file is copied from https://github.com/tsayen/dom-to-image
20
+ * Modified by heshan0131 to allow loading external stylesheets and inline webfonts
21
+ */
22
+
23
+ var inliner = newInliner();
24
+ var fontFaces = newFontFaces();
25
+ var images = newImages();
26
+ // Default impl options
27
+ var defaultOptions = {
28
+ // Default is to fail on error, no placeholder
29
+ imagePlaceholder: undefined,
30
+ // Default cache bust is false, it will use the cache
31
+ cacheBust: false
32
+ };
33
+ var domtoimage = {
34
+ toSvg: toSvg,
35
+ toPng: toPng,
36
+ toJpeg: toJpeg,
37
+ toBlob: toBlob,
38
+ toPixelData: toPixelData,
39
+ impl: {
40
+ fontFaces: fontFaces,
41
+ images: images,
42
+ inliner: inliner,
43
+ options: {}
44
+ }
45
+ };
46
+
47
+ /**
48
+ * @param {Node} node - The DOM Node object to render
49
+ * @param {Object} options - Rendering options
50
+ * @param {Function} [options.filter] - Should return true if passed node should be included in the output
51
+ * (excluding node means excluding it's children as well). Not called on the root node.
52
+ * @param {String} [options.bgcolor] - color for the background, any valid CSS color value.
53
+ * @param {Number} [options.width] - width to be applied to node before rendering.
54
+ * @param {Number} [options.height] - height to be applied to node before rendering.
55
+ * @param {Object} [options.style] - an object whose properties to be copied to node's style before rendering.
56
+ * @param {Number} [options.quality] - a Number between 0 and 1 indicating image quality (applicable to JPEG only), defaults to 1.0.
57
+ * @param {boolean} [options.escapeXhtmlForWebpack] - whether to apply fix for uglify error in dom-to-image (should be true for webpack builds), defaults to true.
58
+ * @param {String} [options.imagePlaceholder] - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch
59
+ * @param {Boolean} [options.cacheBust] - set to true to cache bust by appending the time to the request url
60
+ * @return {Promise} - A promise that is fulfilled with a SVG image data URL
61
+ * */
62
+ function toSvg(node, options) {
63
+ options = options || {};
64
+ copyOptions(options);
65
+ return Promise.resolve(node).then(function (nd) {
66
+ return cloneNode(nd, options.filter, true);
67
+ }).then(embedFonts).then(inlineImages).then(applyOptions).then(function (clone) {
68
+ return makeSvgDataUri(clone, options.width || (0, _domUtils.getWidth)(node), options.height || (0, _domUtils.getHeight)(node), options.escapeXhtmlForWebpack);
69
+ });
70
+ function applyOptions(clone) {
71
+ if (options.bgcolor) clone.style.backgroundColor = options.bgcolor;
72
+ if (options.width) clone.style.width = "".concat(options.width, "px");
73
+ if (options.height) clone.style.height = "".concat(options.height, "px");
74
+ if (options.style) Object.keys(options.style).forEach(function (property) {
75
+ clone.style[property] = options.style[property];
76
+ });
77
+ return clone;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * @param {Node} node - The DOM Node object to render
83
+ * @param {Object} options - Rendering options
84
+ * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.
85
+ * */
86
+ function toPixelData(node, options) {
87
+ return draw(node, options || {}).then(function (canvas) {
88
+ return canvas.getContext('2d').getImageData(0, 0, (0, _domUtils.getWidth)(node), (0, _domUtils.getHeight)(node)).data;
89
+ });
90
+ }
91
+
92
+ /**
93
+ * @param {Node} node - The DOM Node object to render
94
+ * @param {Object} options - Rendering options
95
+ * @return {Promise} - A promise that is fulfilled with a PNG image data URL
96
+ * */
97
+ function toPng(node, options) {
98
+ return draw(node, options || {}).then(function (canvas) {
99
+ return canvas.toDataURL();
100
+ });
101
+ }
102
+
103
+ /**
104
+ * @param {Node} node - The DOM Node object to render
105
+ * @param {Object} options - Rendering options
106
+ * @return {Promise} - A promise that is fulfilled with a JPEG image data URL
107
+ * */
108
+ function toJpeg(node, options) {
109
+ options = options || {};
110
+ return draw(node, options).then(function (canvas) {
111
+ return canvas.toDataURL('image/jpeg', options.quality || 1.0);
112
+ });
113
+ }
114
+
115
+ /**
116
+ * @param {Node} node - The DOM Node object to render
117
+ * @param {Object} options - Rendering options
118
+ * @return {Promise} - A promise that is fulfilled with a PNG image blob
119
+ * */
120
+ function toBlob(node, options) {
121
+ return draw(node, options || {}).then(_domUtils.canvasToBlob);
122
+ }
123
+ function copyOptions(options) {
124
+ // Copy options to impl options for use in impl
125
+ if (typeof options.imagePlaceholder === 'undefined') {
126
+ domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder;
127
+ } else {
128
+ domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder;
129
+ }
130
+ if (typeof options.cacheBust === 'undefined') {
131
+ domtoimage.impl.options.cacheBust = defaultOptions.cacheBust;
132
+ } else {
133
+ domtoimage.impl.options.cacheBust = options.cacheBust;
134
+ }
135
+ }
136
+ function draw(domNode, options) {
137
+ return toSvg(domNode, options).then(_domUtils.makeImage).then((0, _domUtils.delay)(100)).then(function (image) {
138
+ var canvas = newCanvas(domNode);
139
+ canvas.getContext('2d').drawImage(image, 0, 0);
140
+ return canvas;
141
+ });
142
+ function newCanvas(dNode) {
143
+ var canvas = _document["default"].createElement('canvas');
144
+ canvas.width = options.width || (0, _domUtils.getWidth)(dNode);
145
+ canvas.height = options.height || (0, _domUtils.getHeight)(dNode);
146
+ if (options.bgcolor) {
147
+ var ctx = canvas.getContext('2d');
148
+ ctx.fillStyle = options.bgcolor;
149
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
150
+ }
151
+ return canvas;
152
+ }
153
+ }
154
+ function cloneNode(node, filter, root) {
155
+ if (!root && filter && !filter(node)) {
156
+ return Promise.resolve();
157
+ }
158
+ return Promise.resolve(node).then(makeNodeCopy).then(function (clone) {
159
+ return cloneChildren(node, clone, filter);
160
+ }).then(function (clone) {
161
+ return (0, _domUtils.processClone)(node, clone);
162
+ });
163
+ function makeNodeCopy(nd) {
164
+ if (nd instanceof _window["default"].HTMLCanvasElement) {
165
+ return (0, _domUtils.makeImage)(nd.toDataURL());
166
+ }
167
+ return nd.cloneNode(false);
168
+ }
169
+ function cloneChildrenInOrder(parent, arrChildren, flt) {
170
+ var done = Promise.resolve();
171
+ arrChildren.forEach(function (child) {
172
+ done = done.then(function () {
173
+ return cloneNode(child, flt, null);
174
+ }).then(function (childClone) {
175
+ if (childClone) {
176
+ parent.appendChild(childClone);
177
+ }
178
+ });
179
+ });
180
+ return done;
181
+ }
182
+ function cloneChildren(original, clone, flt) {
183
+ var children = original.childNodes;
184
+ if (children.length === 0) {
185
+ return Promise.resolve(clone);
186
+ }
187
+ return cloneChildrenInOrder(clone, (0, _domUtils.asArray)(children), flt).then(function () {
188
+ return clone;
189
+ });
190
+ }
191
+ }
192
+ function embedFonts(node) {
193
+ return fontFaces.resolveAll().then(function (cssText) {
194
+ var styleNode = _document["default"].createElement('style');
195
+ node.appendChild(styleNode);
196
+ styleNode.appendChild(_document["default"].createTextNode(cssText));
197
+ return node;
198
+ });
199
+ }
200
+ function inlineImages(node) {
201
+ return images.inlineAll(node).then(function () {
202
+ return node;
203
+ });
204
+ }
205
+ function makeSvgDataUri(node, width, height) {
206
+ var escapeXhtmlForWebpack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
207
+ return Promise.resolve(node).then(function (nd) {
208
+ nd.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
209
+ var serializedString = new _window["default"].XMLSerializer().serializeToString(nd);
210
+ var xhtml = escapeXhtmlForWebpack ? (0, _domUtils.escapeXhtml)(serializedString) : serializedString;
211
+ var foreignObject = "<foreignObject x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">".concat(xhtml, "</foreignObject>");
212
+ var svgStr = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"".concat(width, "\" height=\"").concat(height, "\">").concat(foreignObject, "</svg>");
213
+
214
+ // Optimizing SVGs in data URIs
215
+ // see https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
216
+ // the best way of encoding SVG in a data: URI is data:image/svg+xml,[actual data].
217
+ // We don’t need the ;charset=utf-8 parameter because the given SVG is ASCII.
218
+ return (0, _miniSvgDataUri["default"])(svgStr);
219
+ });
220
+ }
221
+ function newInliner() {
222
+ var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g;
223
+ return {
224
+ inlineAll: inlineAll,
225
+ shouldProcess: shouldProcess,
226
+ impl: {
227
+ readUrls: readUrls,
228
+ inline: inline
229
+ }
230
+ };
231
+ function shouldProcess(string) {
232
+ return string.search(URL_REGEX) !== -1;
233
+ }
234
+ function readUrls(string) {
235
+ var result = [];
236
+ var match;
237
+ while ((match = URL_REGEX.exec(string)) !== null) {
238
+ result.push(match[1]);
239
+ }
240
+ return result.filter(function (url) {
241
+ return !(0, _domUtils.isDataUrl)(url);
242
+ });
243
+ }
244
+ function urlAsRegex(url0) {
245
+ return new RegExp("(url\\(['\"]?)(".concat((0, _domUtils.escape)(url0), ")(['\"]?\\))"), 'g');
246
+ }
247
+ function inline(string, url, baseUrl, get) {
248
+ return Promise.resolve(url).then(function (ul) {
249
+ return baseUrl ? (0, _domUtils.resolveUrl)(ul, baseUrl) : ul;
250
+ }).then(function (ul) {
251
+ return typeof get === 'function' ? get(ul) : (0, _domUtils.getAndEncode)(ul, domtoimage.impl.options);
252
+ }).then(function (data) {
253
+ return (0, _domUtils.dataAsUrl)(data, (0, _domUtils.mimeType)(url));
254
+ }).then(function (dataUrl) {
255
+ return string.replace(urlAsRegex(url), "$1".concat(dataUrl, "$3"));
256
+ });
257
+ }
258
+ function inlineAll(string, baseUrl, get) {
259
+ if (!shouldProcess(string) || (0, _domUtils.isSrcAsDataUrl)(string)) {
260
+ return Promise.resolve(string);
261
+ }
262
+ return Promise.resolve(string).then(readUrls).then(function (urls) {
263
+ var done = Promise.resolve(string);
264
+ urls.forEach(function (url) {
265
+ done = done.then(function (str) {
266
+ return inline(str, url, baseUrl, get);
267
+ });
268
+ });
269
+ return done;
270
+ });
271
+ }
272
+ }
273
+ function newFontFaces() {
274
+ return {
275
+ resolveAll: resolveAll,
276
+ impl: {
277
+ readAll: readAll
278
+ }
279
+ };
280
+ function resolveAll() {
281
+ return readAll().then(function (webFonts) {
282
+ return Promise.all(webFonts.map(function (webFont) {
283
+ return webFont.resolve();
284
+ }));
285
+ }).then(function (cssStrings) {
286
+ return cssStrings.join('\n');
287
+ });
288
+ }
289
+ function readAll() {
290
+ return Promise.resolve((0, _domUtils.asArray)(_document["default"].styleSheets)).then(loadExternalStyleSheets).then(getCssRules).then(selectWebFontRules).then(function (rules) {
291
+ return rules.map(newWebFont);
292
+ });
293
+ function selectWebFontRules(cssRules) {
294
+ return cssRules.filter(function (rule) {
295
+ return rule.type === _window["default"].CSSRule.FONT_FACE_RULE;
296
+ }).filter(function (rule) {
297
+ return inliner.shouldProcess(rule.style.getPropertyValue('src'));
298
+ });
299
+ }
300
+ function loadExternalStyleSheets(styleSheets) {
301
+ return Promise.all(styleSheets.map(function (sheet) {
302
+ if (sheet.href) {
303
+ // cloudfont doesn't have allow origin header properly set
304
+ // error response will remain in cache
305
+ var cache = sheet.href.includes('uber-fonts') ? 'no-cache' : 'default';
306
+ return _window["default"].fetch(sheet.href, {
307
+ credentials: 'omit',
308
+ cache: cache
309
+ }).then(function (response) {
310
+ return response.text();
311
+ }).then(function (text) {
312
+ var result = (0, _domUtils.setStyleSheetBaseHref)(text, sheet.href);
313
+ return (0, _domUtils.toStyleSheet)(result);
314
+ })["catch"](function (err) {
315
+ // Handle any error that occurred in any of the previous
316
+ // promises in the chain. stylesheet failed to load should not stop
317
+ // the process, hence result in only a warning, instead of reject
318
+ _console["default"].warn(_constants.IMAGE_EXPORT_ERRORS.styleSheet, sheet.href);
319
+ _console["default"].log(err);
320
+ return;
321
+ });
322
+ }
323
+ return Promise.resolve(sheet);
324
+ }));
325
+ }
326
+ function getCssRules(styleSheets) {
327
+ var cssRules = [];
328
+ styleSheets.forEach(function (sheet) {
329
+ // try...catch because browser may not able to enumerate rules for cross-domain sheets
330
+ if (!sheet) {
331
+ return;
332
+ }
333
+ var rules;
334
+ try {
335
+ rules = sheet.rules || sheet.cssRules;
336
+ } catch (e) {
337
+ _console["default"].log("'Can't read the css rules of: ".concat(sheet.href), e);
338
+ return;
339
+ }
340
+ if (rules && (0, _typeof2["default"])(rules) === 'object') {
341
+ try {
342
+ (0, _domUtils.asArray)(rules || []).forEach(cssRules.push.bind(cssRules));
343
+ } catch (e) {
344
+ _console["default"].log("Error while reading CSS rules from ".concat(sheet.href), e);
345
+ return;
346
+ }
347
+ } else {
348
+ _console["default"].log('getCssRules can not find cssRules');
349
+ return;
350
+ }
351
+ });
352
+ return cssRules;
353
+ }
354
+ function newWebFont(webFontRule) {
355
+ return {
356
+ resolve: function resolve() {
357
+ var baseUrl = (webFontRule.parentStyleSheet || {}).href;
358
+ return inliner.inlineAll(webFontRule.cssText, baseUrl, null);
359
+ },
360
+ src: function src() {
361
+ return webFontRule.style.getPropertyValue('src');
362
+ }
363
+ };
364
+ }
365
+ }
366
+ }
367
+ function newImages() {
368
+ return {
369
+ inlineAll: inlineAll,
370
+ impl: {
371
+ newImage: newImage
372
+ }
373
+ };
374
+ function newImage(element) {
375
+ function inline(get) {
376
+ if ((0, _domUtils.isDataUrl)(element.src)) {
377
+ return Promise.resolve();
378
+ }
379
+ return Promise.resolve(element.src).then(function (ul) {
380
+ return typeof get === 'function' ? get(ul) : (0, _domUtils.getAndEncode)(ul, domtoimage.impl.options);
381
+ }).then(function (data) {
382
+ return (0, _domUtils.dataAsUrl)(data, (0, _domUtils.mimeType)(element.src));
383
+ }).then(function (dataUrl) {
384
+ return new Promise(function (resolve, reject) {
385
+ element.onload = resolve;
386
+ element.onerror = reject;
387
+ element.src = dataUrl;
388
+ });
389
+ });
390
+ }
391
+ return {
392
+ inline: inline
393
+ };
394
+ }
395
+ function inlineAll(node) {
396
+ if (!(node instanceof Element)) {
397
+ return Promise.resolve(node);
398
+ }
399
+ return inlineBackground(node).then(function () {
400
+ if (node instanceof HTMLImageElement) {
401
+ return newImage(node).inline(null);
402
+ }
403
+ return Promise.all((0, _domUtils.asArray)(node.childNodes).map(function (child) {
404
+ return inlineAll(child);
405
+ }));
406
+ });
407
+ function inlineBackground(nd) {
408
+ var background = nd.style.getPropertyValue('background');
409
+ if (!background) {
410
+ return Promise.resolve(nd);
411
+ }
412
+ return inliner.inlineAll(background, null, null).then(function (inlined) {
413
+ nd.style.setProperty('background', inlined, nd.style.getPropertyPriority('background'));
414
+ }).then(function () {
415
+ return nd;
416
+ });
417
+ }
418
+ }
419
+ }
420
+ var _default = exports["default"] = domtoimage;
421
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZG9jdW1lbnQiLCJfY29uc29sZSIsIl9taW5pU3ZnRGF0YVVyaSIsIl9jb25zdGFudHMiLCJfZG9tVXRpbHMiLCJpbmxpbmVyIiwibmV3SW5saW5lciIsImZvbnRGYWNlcyIsIm5ld0ZvbnRGYWNlcyIsImltYWdlcyIsIm5ld0ltYWdlcyIsImRlZmF1bHRPcHRpb25zIiwiaW1hZ2VQbGFjZWhvbGRlciIsInVuZGVmaW5lZCIsImNhY2hlQnVzdCIsImRvbXRvaW1hZ2UiLCJ0b1N2ZyIsInRvUG5nIiwidG9KcGVnIiwidG9CbG9iIiwidG9QaXhlbERhdGEiLCJpbXBsIiwib3B0aW9ucyIsIm5vZGUiLCJjb3B5T3B0aW9ucyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIm5kIiwiY2xvbmVOb2RlIiwiZmlsdGVyIiwiZW1iZWRGb250cyIsImlubGluZUltYWdlcyIsImFwcGx5T3B0aW9ucyIsImNsb25lIiwibWFrZVN2Z0RhdGFVcmkiLCJ3aWR0aCIsImdldFdpZHRoIiwiaGVpZ2h0IiwiZ2V0SGVpZ2h0IiwiZXNjYXBlWGh0bWxGb3JXZWJwYWNrIiwiYmdjb2xvciIsInN0eWxlIiwiYmFja2dyb3VuZENvbG9yIiwiY29uY2F0IiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJwcm9wZXJ0eSIsImRyYXciLCJjYW52YXMiLCJnZXRDb250ZXh0IiwiZ2V0SW1hZ2VEYXRhIiwiZGF0YSIsInRvRGF0YVVSTCIsInF1YWxpdHkiLCJjYW52YXNUb0Jsb2IiLCJkb21Ob2RlIiwibWFrZUltYWdlIiwiZGVsYXkiLCJpbWFnZSIsIm5ld0NhbnZhcyIsImRyYXdJbWFnZSIsImROb2RlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY3R4IiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJyb290IiwibWFrZU5vZGVDb3B5IiwiY2xvbmVDaGlsZHJlbiIsInByb2Nlc3NDbG9uZSIsIndpbmRvdyIsIkhUTUxDYW52YXNFbGVtZW50IiwiY2xvbmVDaGlsZHJlbkluT3JkZXIiLCJwYXJlbnQiLCJhcnJDaGlsZHJlbiIsImZsdCIsImRvbmUiLCJjaGlsZCIsImNoaWxkQ2xvbmUiLCJhcHBlbmRDaGlsZCIsIm9yaWdpbmFsIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwiYXNBcnJheSIsInJlc29sdmVBbGwiLCJjc3NUZXh0Iiwic3R5bGVOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbmxpbmVBbGwiLCJhcmd1bWVudHMiLCJzZXRBdHRyaWJ1dGUiLCJzZXJpYWxpemVkU3RyaW5nIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwieGh0bWwiLCJlc2NhcGVYaHRtbCIsImZvcmVpZ25PYmplY3QiLCJzdmdTdHIiLCJzdmdUb01pbmlEYXRhVVJJIiwiVVJMX1JFR0VYIiwic2hvdWxkUHJvY2VzcyIsInJlYWRVcmxzIiwiaW5saW5lIiwic3RyaW5nIiwic2VhcmNoIiwicmVzdWx0IiwibWF0Y2giLCJleGVjIiwicHVzaCIsInVybCIsImlzRGF0YVVybCIsInVybEFzUmVnZXgiLCJ1cmwwIiwiUmVnRXhwIiwiZXNjYXBlIiwiYmFzZVVybCIsImdldCIsInVsIiwicmVzb2x2ZVVybCIsImdldEFuZEVuY29kZSIsImRhdGFBc1VybCIsIm1pbWVUeXBlIiwiZGF0YVVybCIsInJlcGxhY2UiLCJpc1NyY0FzRGF0YVVybCIsInVybHMiLCJzdHIiLCJyZWFkQWxsIiwid2ViRm9udHMiLCJhbGwiLCJtYXAiLCJ3ZWJGb250IiwiY3NzU3RyaW5ncyIsImpvaW4iLCJzdHlsZVNoZWV0cyIsImxvYWRFeHRlcm5hbFN0eWxlU2hlZXRzIiwiZ2V0Q3NzUnVsZXMiLCJzZWxlY3RXZWJGb250UnVsZXMiLCJydWxlcyIsIm5ld1dlYkZvbnQiLCJjc3NSdWxlcyIsInJ1bGUiLCJ0eXBlIiwiQ1NTUnVsZSIsIkZPTlRfRkFDRV9SVUxFIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInNoZWV0IiwiaHJlZiIsImNhY2hlIiwiaW5jbHVkZXMiLCJmZXRjaCIsImNyZWRlbnRpYWxzIiwicmVzcG9uc2UiLCJ0ZXh0Iiwic2V0U3R5bGVTaGVldEJhc2VIcmVmIiwidG9TdHlsZVNoZWV0IiwiZXJyIiwiQ29uc29sZSIsIndhcm4iLCJJTUFHRV9FWFBPUlRfRVJST1JTIiwic3R5bGVTaGVldCIsImxvZyIsImUiLCJfdHlwZW9mMiIsImJpbmQiLCJ3ZWJGb250UnVsZSIsInBhcmVudFN0eWxlU2hlZXQiLCJzcmMiLCJuZXdJbWFnZSIsImVsZW1lbnQiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwiRWxlbWVudCIsImlubGluZUJhY2tncm91bmQiLCJIVE1MSW1hZ2VFbGVtZW50IiwiYmFja2dyb3VuZCIsImlubGluZWQiLCJzZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5UHJpb3JpdHkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvZG9tLXRvLWltYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8qKlxuICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS90c2F5ZW4vZG9tLXRvLWltYWdlXG4gKiBNb2RpZmllZCBieSBoZXNoYW4wMTMxIHRvIGFsbG93IGxvYWRpbmcgZXh0ZXJuYWwgc3R5bGVzaGVldHMgYW5kIGlubGluZSB3ZWJmb250c1xuICovXG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCBDb25zb2xlIGZyb20gJ2dsb2JhbC9jb25zb2xlJztcbmltcG9ydCBzdmdUb01pbmlEYXRhVVJJIGZyb20gJ21pbmktc3ZnLWRhdGEtdXJpJztcbmltcG9ydCB7SU1BR0VfRVhQT1JUX0VSUk9SU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1xuICBjYW52YXNUb0Jsb2IsXG4gIGVzY2FwZSxcbiAgZXNjYXBlWGh0bWwsXG4gIGRlbGF5LFxuICBwcm9jZXNzQ2xvbmUsXG4gIGFzQXJyYXksXG4gIG1ha2VJbWFnZSxcbiAgbWltZVR5cGUsXG4gIGRhdGFBc1VybCxcbiAgaXNEYXRhVXJsLFxuICBpc1NyY0FzRGF0YVVybCxcbiAgcmVzb2x2ZVVybCxcbiAgZ2V0V2lkdGgsXG4gIGdldEhlaWdodCxcbiAgZ2V0QW5kRW5jb2RlLFxuICBzZXRTdHlsZVNoZWV0QmFzZUhyZWYsXG4gIHRvU3R5bGVTaGVldFxufSBmcm9tICcuL2RvbS11dGlscyc7XG5cbmNvbnN0IGlubGluZXIgPSBuZXdJbmxpbmVyKCk7XG5jb25zdCBmb250RmFjZXMgPSBuZXdGb250RmFjZXMoKTtcbmNvbnN0IGltYWdlcyA9IG5ld0ltYWdlcygpO1xuLy8gRGVmYXVsdCBpbXBsIG9wdGlvbnNcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAvLyBEZWZhdWx0IGlzIHRvIGZhaWwgb24gZXJyb3IsIG5vIHBsYWNlaG9sZGVyXG4gIGltYWdlUGxhY2Vob2xkZXI6IHVuZGVmaW5lZCxcbiAgLy8gRGVmYXVsdCBjYWNoZSBidXN0IGlzIGZhbHNlLCBpdCB3aWxsIHVzZSB0aGUgY2FjaGVcbiAgY2FjaGVCdXN0OiBmYWxzZVxufTtcblxuY29uc3QgZG9tdG9pbWFnZSA9IHtcbiAgdG9TdmcsXG4gIHRvUG5nLFxuICB0b0pwZWcsXG4gIHRvQmxvYixcbiAgdG9QaXhlbERhdGEsXG4gIGltcGw6IHtcbiAgICBmb250RmFjZXMsXG4gICAgaW1hZ2VzLFxuICAgIGlubGluZXIsXG4gICAgb3B0aW9uczoge30gYXMgYW55XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmZpbHRlcl0gLSBTaG91bGQgcmV0dXJuIHRydWUgaWYgcGFzc2VkIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXRcbiAqICAgICAgICAgIChleGNsdWRpbmcgbm9kZSBtZWFucyBleGNsdWRpbmcgaXQncyBjaGlsZHJlbiBhcyB3ZWxsKS4gTm90IGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJnY29sb3JdIC0gY29sb3IgZm9yIHRoZSBiYWNrZ3JvdW5kLCBhbnkgdmFsaWQgQ1NTIGNvbG9yIHZhbHVlLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndpZHRoXSAtIHdpZHRoIHRvIGJlIGFwcGxpZWQgdG8gbm9kZSBiZWZvcmUgcmVuZGVyaW5nLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmhlaWdodF0gLSBoZWlnaHQgdG8gYmUgYXBwbGllZCB0byBub2RlIGJlZm9yZSByZW5kZXJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc3R5bGVdIC0gYW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgdG8gYmUgY29waWVkIHRvIG5vZGUncyBzdHlsZSBiZWZvcmUgcmVuZGVyaW5nLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnF1YWxpdHldIC0gYSBOdW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaW1hZ2UgcXVhbGl0eSAoYXBwbGljYWJsZSB0byBKUEVHIG9ubHkpLCBkZWZhdWx0cyB0byAxLjAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVzY2FwZVhodG1sRm9yV2VicGFja10gLSB3aGV0aGVyIHRvIGFwcGx5IGZpeCBmb3IgdWdsaWZ5IGVycm9yIGluIGRvbS10by1pbWFnZSAoc2hvdWxkIGJlIHRydWUgZm9yIHdlYnBhY2sgYnVpbGRzKSwgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyXSAtIGRhdGFVUkwgdG8gdXNlIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGZhaWxlZCBpbWFnZXMsIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGZhaWwgZmFzdCBvbiBpbWFnZXMgd2UgY2FuJ3QgZmV0Y2hcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FjaGVCdXN0XSAtIHNldCB0byB0cnVlIHRvIGNhY2hlIGJ1c3QgYnkgYXBwZW5kaW5nIHRoZSB0aW1lIHRvIHRoZSByZXF1ZXN0IHVybFxuICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIFNWRyBpbWFnZSBkYXRhIFVSTFxuICogKi9cbmZ1bmN0aW9uIHRvU3ZnKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvcHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpXG4gICAgLnRoZW4obmQgPT4gY2xvbmVOb2RlKG5kLCBvcHRpb25zLmZpbHRlciwgdHJ1ZSkpXG4gICAgLnRoZW4oZW1iZWRGb250cylcbiAgICAudGhlbihpbmxpbmVJbWFnZXMpXG4gICAgLnRoZW4oYXBwbHlPcHRpb25zKVxuICAgIC50aGVuKGNsb25lID0+XG4gICAgICBtYWtlU3ZnRGF0YVVyaShcbiAgICAgICAgY2xvbmUsXG4gICAgICAgIG9wdGlvbnMud2lkdGggfHwgZ2V0V2lkdGgobm9kZSksXG4gICAgICAgIG9wdGlvbnMuaGVpZ2h0IHx8IGdldEhlaWdodChub2RlKSxcbiAgICAgICAgb3B0aW9ucy5lc2NhcGVYaHRtbEZvcldlYnBhY2tcbiAgICAgIClcbiAgICApO1xuXG4gIGZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhjbG9uZSkge1xuICAgIGlmIChvcHRpb25zLmJnY29sb3IpIGNsb25lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmdjb2xvcjtcblxuICAgIGlmIChvcHRpb25zLndpZHRoKSBjbG9uZS5zdHlsZS53aWR0aCA9IGAke29wdGlvbnMud2lkdGh9cHhgO1xuICAgIGlmIChvcHRpb25zLmhlaWdodCkgY2xvbmUuc3R5bGUuaGVpZ2h0ID0gYCR7b3B0aW9ucy5oZWlnaHR9cHhgO1xuXG4gICAgaWYgKG9wdGlvbnMuc3R5bGUpXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zLnN0eWxlKS5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY2xvbmUuc3R5bGVbcHJvcGVydHldID0gb3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9KTtcblxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zXG4gKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgVWludDhBcnJheSBjb250YWluaW5nIFJHQkEgcGl4ZWwgZGF0YS5cbiAqICovXG5mdW5jdGlvbiB0b1BpeGVsRGF0YShub2RlLCBvcHRpb25zKSB7XG4gIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pLnRoZW4oXG4gICAgY2FudmFzID0+IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSgwLCAwLCBnZXRXaWR0aChub2RlKSwgZ2V0SGVpZ2h0KG5vZGUpKS5kYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBQTkcgaW1hZ2UgZGF0YSBVUkxcbiAqICovXG5mdW5jdGlvbiB0b1BuZyhub2RlLCBvcHRpb25zKSB7XG4gIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pLnRoZW4oY2FudmFzID0+IGNhbnZhcy50b0RhdGFVUkwoKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBKUEVHIGltYWdlIGRhdGEgVVJMXG4gKiAqL1xuZnVuY3Rpb24gdG9KcGVnKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMpLnRoZW4oY2FudmFzID0+IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBvcHRpb25zLnF1YWxpdHkgfHwgMS4wKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBQTkcgaW1hZ2UgYmxvYlxuICogKi9cbmZ1bmN0aW9uIHRvQmxvYihub2RlLCBvcHRpb25zKSB7XG4gIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pLnRoZW4oY2FudmFzVG9CbG9iKTtcbn1cblxuZnVuY3Rpb24gY29weU9wdGlvbnMob3B0aW9ucykge1xuICAvLyBDb3B5IG9wdGlvbnMgdG8gaW1wbCBvcHRpb25zIGZvciB1c2UgaW4gaW1wbFxuICBpZiAodHlwZW9mIG9wdGlvbnMuaW1hZ2VQbGFjZWhvbGRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkb210b2ltYWdlLmltcGwub3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyID0gZGVmYXVsdE9wdGlvbnMuaW1hZ2VQbGFjZWhvbGRlcjtcbiAgfSBlbHNlIHtcbiAgICBkb210b2ltYWdlLmltcGwub3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyID0gb3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNhY2hlQnVzdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkb210b2ltYWdlLmltcGwub3B0aW9ucy5jYWNoZUJ1c3QgPSBkZWZhdWx0T3B0aW9ucy5jYWNoZUJ1c3Q7XG4gIH0gZWxzZSB7XG4gICAgZG9tdG9pbWFnZS5pbXBsLm9wdGlvbnMuY2FjaGVCdXN0ID0gb3B0aW9ucy5jYWNoZUJ1c3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZHJhdyhkb21Ob2RlLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b1N2Zyhkb21Ob2RlLCBvcHRpb25zKVxuICAgIC50aGVuKG1ha2VJbWFnZSlcbiAgICAudGhlbihkZWxheSgxMDApKVxuICAgIC50aGVuKGltYWdlID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ld0NhbnZhcyhkb21Ob2RlKTtcbiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7XG4gICAgICByZXR1cm4gY2FudmFzO1xuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIG5ld0NhbnZhcyhkTm9kZSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgZ2V0V2lkdGgoZE5vZGUpO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCBnZXRIZWlnaHQoZE5vZGUpO1xuXG4gICAgaWYgKG9wdGlvbnMuYmdjb2xvcikge1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iZ2NvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbnZhcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZU5vZGUobm9kZSwgZmlsdGVyLCByb290KSB7XG4gIGlmICghcm9vdCAmJiBmaWx0ZXIgJiYgIWZpbHRlcihub2RlKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAudGhlbihtYWtlTm9kZUNvcHkpXG4gICAgLnRoZW4oY2xvbmUgPT4gY2xvbmVDaGlsZHJlbihub2RlLCBjbG9uZSwgZmlsdGVyKSlcbiAgICAudGhlbihjbG9uZSA9PiBwcm9jZXNzQ2xvbmUobm9kZSwgY2xvbmUpKTtcblxuICBmdW5jdGlvbiBtYWtlTm9kZUNvcHkobmQpIHtcbiAgICBpZiAobmQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiBtYWtlSW1hZ2UobmQudG9EYXRhVVJMKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmQuY2xvbmVOb2RlKGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lQ2hpbGRyZW5Jbk9yZGVyKHBhcmVudCwgYXJyQ2hpbGRyZW4sIGZsdCkge1xuICAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgYXJyQ2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBkb25lID0gZG9uZVxuICAgICAgICAudGhlbigoKSA9PiBjbG9uZU5vZGUoY2hpbGQsIGZsdCwgbnVsbCkpXG4gICAgICAgIC50aGVuKGNoaWxkQ2xvbmUgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZENsb25lKSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRDbG9uZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lQ2hpbGRyZW4ob3JpZ2luYWwsIGNsb25lLCBmbHQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG9yaWdpbmFsLmNoaWxkTm9kZXM7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lQ2hpbGRyZW5Jbk9yZGVyKGNsb25lLCBhc0FycmF5KGNoaWxkcmVuKSwgZmx0KS50aGVuKCgpID0+IGNsb25lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWJlZEZvbnRzKG5vZGUpIHtcbiAgcmV0dXJuIGZvbnRGYWNlcy5yZXNvbHZlQWxsKCkudGhlbihjc3NUZXh0ID0+IHtcbiAgICBjb25zdCBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3R5bGVOb2RlKTtcbiAgICBzdHlsZU5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzVGV4dCkpO1xuICAgIHJldHVybiBub2RlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5saW5lSW1hZ2VzKG5vZGUpIHtcbiAgcmV0dXJuIGltYWdlcy5pbmxpbmVBbGwobm9kZSkudGhlbigoKSA9PiBub2RlKTtcbn1cblxuZnVuY3Rpb24gbWFrZVN2Z0RhdGFVcmkobm9kZSwgd2lkdGgsIGhlaWdodCwgZXNjYXBlWGh0bWxGb3JXZWJwYWNrID0gdHJ1ZSkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpLnRoZW4obmQgPT4ge1xuICAgIG5kLnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRTdHJpbmcgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhuZCk7XG5cbiAgICBjb25zdCB4aHRtbCA9IGVzY2FwZVhodG1sRm9yV2VicGFjayA/IGVzY2FwZVhodG1sKHNlcmlhbGl6ZWRTdHJpbmcpIDogc2VyaWFsaXplZFN0cmluZztcbiAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gYDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+JHt4aHRtbH08L2ZvcmVpZ25PYmplY3Q+YDtcbiAgICBjb25zdCBzdmdTdHIgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke3dpZHRofVwiIGhlaWdodD1cIiR7aGVpZ2h0fVwiPiR7Zm9yZWlnbk9iamVjdH08L3N2Zz5gO1xuXG4gICAgLy8gT3B0aW1pemluZyBTVkdzIGluIGRhdGEgVVJJc1xuICAgIC8vIHNlZSBodHRwczovL2NvZGVwZW4uaW8vdGlndC9wb3N0L29wdGltaXppbmctc3Zncy1pbi1kYXRhLXVyaXNcbiAgICAvLyB0aGUgYmVzdCB3YXkgb2YgZW5jb2RpbmcgU1ZHIGluIGEgZGF0YTogVVJJIGlzIGRhdGE6aW1hZ2Uvc3ZnK3htbCxbYWN0dWFsIGRhdGFdLlxuICAgIC8vIFdlIGRvbuKAmXQgbmVlZCB0aGUgO2NoYXJzZXQ9dXRmLTggcGFyYW1ldGVyIGJlY2F1c2UgdGhlIGdpdmVuIFNWRyBpcyBBU0NJSS5cbiAgICByZXR1cm4gc3ZnVG9NaW5pRGF0YVVSSShzdmdTdHIpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbmV3SW5saW5lcigpIHtcbiAgY29uc3QgVVJMX1JFR0VYID0gL3VybFxcKFsnXCJdPyhbXidcIl0rPylbJ1wiXT9cXCkvZztcblxuICByZXR1cm4ge1xuICAgIGlubGluZUFsbCxcbiAgICBzaG91bGRQcm9jZXNzLFxuICAgIGltcGw6IHtcbiAgICAgIHJlYWRVcmxzLFxuICAgICAgaW5saW5lXG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3Moc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5zZWFyY2goVVJMX1JFR0VYKSAhPT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkVXJscyhzdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1hdGNoOiBudWxsIHwgUmVnRXhwRXhlY0FycmF5O1xuICAgIHdoaWxlICgobWF0Y2ggPSBVUkxfUkVHRVguZXhlYyhzdHJpbmcpKSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmZpbHRlcih1cmwgPT4ge1xuICAgICAgcmV0dXJuICFpc0RhdGFVcmwodXJsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVybEFzUmVnZXgodXJsMCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGAodXJsXFxcXChbJ1wiXT8pKCR7ZXNjYXBlKHVybDApfSkoWydcIl0/XFxcXCkpYCwgJ2cnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlubGluZShzdHJpbmcsIHVybCwgYmFzZVVybCwgZ2V0KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmwpXG4gICAgICAudGhlbih1bCA9PiAoYmFzZVVybCA/IHJlc29sdmVVcmwodWwsIGJhc2VVcmwpIDogdWwpKVxuICAgICAgLnRoZW4odWwgPT4gKHR5cGVvZiBnZXQgPT09ICdmdW5jdGlvbicgPyBnZXQodWwpIDogZ2V0QW5kRW5jb2RlKHVsLCBkb210b2ltYWdlLmltcGwub3B0aW9ucykpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBkYXRhQXNVcmwoZGF0YSwgbWltZVR5cGUodXJsKSkpXG4gICAgICAudGhlbihkYXRhVXJsID0+IHN0cmluZy5yZXBsYWNlKHVybEFzUmVnZXgodXJsKSwgYCQxJHtkYXRhVXJsfSQzYCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5saW5lQWxsKHN0cmluZywgYmFzZVVybCwgZ2V0KSB7XG4gICAgaWYgKCFzaG91bGRQcm9jZXNzKHN0cmluZykgfHwgaXNTcmNBc0RhdGFVcmwoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0cmluZylcbiAgICAgIC50aGVuKHJlYWRVcmxzKVxuICAgICAgLnRoZW4odXJscyA9PiB7XG4gICAgICAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKHN0cmluZyk7XG4gICAgICAgIHVybHMuZm9yRWFjaCh1cmwgPT4ge1xuICAgICAgICAgIGRvbmUgPSBkb25lLnRoZW4oc3RyID0+IGlubGluZShzdHIsIHVybCwgYmFzZVVybCwgZ2V0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5ld0ZvbnRGYWNlcygpIHtcbiAgcmV0dXJuIHtcbiAgICByZXNvbHZlQWxsLFxuICAgIGltcGw6IHtyZWFkQWxsfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVBbGwoKSB7XG4gICAgcmV0dXJuIHJlYWRBbGwoKVxuICAgICAgLnRoZW4od2ViRm9udHMgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwod2ViRm9udHMubWFwKHdlYkZvbnQgPT4gd2ViRm9udC5yZXNvbHZlKCkpKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihjc3NTdHJpbmdzID0+IGNzc1N0cmluZ3Muam9pbignXFxuJykpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEFsbCgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFzQXJyYXkoZG9jdW1lbnQuc3R5bGVTaGVldHMpKVxuICAgICAgLnRoZW4obG9hZEV4dGVybmFsU3R5bGVTaGVldHMpXG4gICAgICAudGhlbihnZXRDc3NSdWxlcylcbiAgICAgIC50aGVuKHNlbGVjdFdlYkZvbnRSdWxlcylcbiAgICAgIC50aGVuKHJ1bGVzID0+IHJ1bGVzLm1hcChuZXdXZWJGb250KSk7XG5cbiAgICBmdW5jdGlvbiBzZWxlY3RXZWJGb250UnVsZXMoY3NzUnVsZXMpIHtcbiAgICAgIHJldHVybiBjc3NSdWxlc1xuICAgICAgICAuZmlsdGVyKHJ1bGUgPT4gcnVsZS50eXBlID09PSB3aW5kb3cuQ1NTUnVsZS5GT05UX0ZBQ0VfUlVMRSlcbiAgICAgICAgLmZpbHRlcihydWxlID0+IGlubGluZXIuc2hvdWxkUHJvY2VzcyhydWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3NyYycpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZEV4dGVybmFsU3R5bGVTaGVldHMoc3R5bGVTaGVldHMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgc3R5bGVTaGVldHMubWFwKHNoZWV0ID0+IHtcbiAgICAgICAgICBpZiAoc2hlZXQuaHJlZikge1xuICAgICAgICAgICAgLy8gY2xvdWRmb250IGRvZXNuJ3QgaGF2ZSBhbGxvdyBvcmlnaW4gaGVhZGVyIHByb3Blcmx5IHNldFxuICAgICAgICAgICAgLy8gZXJyb3IgcmVzcG9uc2Ugd2lsbCByZW1haW4gaW4gY2FjaGVcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gc2hlZXQuaHJlZi5pbmNsdWRlcygndWJlci1mb250cycpID8gJ25vLWNhY2hlJyA6ICdkZWZhdWx0JztcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3dcbiAgICAgICAgICAgICAgLmZldGNoKHNoZWV0LmhyZWYsIHtjcmVkZW50aWFsczogJ29taXQnLCBjYWNoZX0pXG4gICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgICAgICAgLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2V0U3R5bGVTaGVldEJhc2VIcmVmKHRleHQsIHNoZWV0LmhyZWYpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0b1N0eWxlU2hlZXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGFueSBlcnJvciB0aGF0IG9jY3VycmVkIGluIGFueSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgICAgICAgICAvLyBwcm9taXNlcyBpbiB0aGUgY2hhaW4uIHN0eWxlc2hlZXQgZmFpbGVkIHRvIGxvYWQgc2hvdWxkIG5vdCBzdG9wXG4gICAgICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MsIGhlbmNlIHJlc3VsdCBpbiBvbmx5IGEgd2FybmluZywgaW5zdGVhZCBvZiByZWplY3RcbiAgICAgICAgICAgICAgICBDb25zb2xlLndhcm4oSU1BR0VfRVhQT1JUX0VSUk9SUy5zdHlsZVNoZWV0LCBzaGVldC5ocmVmKTtcbiAgICAgICAgICAgICAgICBDb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2hlZXQpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDc3NSdWxlcyhzdHlsZVNoZWV0cykge1xuICAgICAgY29uc3QgY3NzUnVsZXM6IGFueVtdID0gW107XG4gICAgICBzdHlsZVNoZWV0cy5mb3JFYWNoKHNoZWV0ID0+IHtcbiAgICAgICAgLy8gdHJ5Li4uY2F0Y2ggYmVjYXVzZSBicm93c2VyIG1heSBub3QgYWJsZSB0byBlbnVtZXJhdGUgcnVsZXMgZm9yIGNyb3NzLWRvbWFpbiBzaGVldHNcbiAgICAgICAgaWYgKCFzaGVldCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVsZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcnVsZXMgPSBzaGVldC5ydWxlcyB8fCBzaGVldC5jc3NSdWxlcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIENvbnNvbGUubG9nKGAnQ2FuJ3QgcmVhZCB0aGUgY3NzIHJ1bGVzIG9mOiAke3NoZWV0LmhyZWZ9YCwgZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVzICYmIHR5cGVvZiBydWxlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXNBcnJheShydWxlcyB8fCBbXSkuZm9yRWFjaChjc3NSdWxlcy5wdXNoLmJpbmQoY3NzUnVsZXMpKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBDb25zb2xlLmxvZyhgRXJyb3Igd2hpbGUgcmVhZGluZyBDU1MgcnVsZXMgZnJvbSAke3NoZWV0LmhyZWZ9YCwgZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIENvbnNvbGUubG9nKCdnZXRDc3NSdWxlcyBjYW4gbm90IGZpbmQgY3NzUnVsZXMnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3NzUnVsZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmV3V2ViRm9udCh3ZWJGb250UnVsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzb2x2ZTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSAod2ViRm9udFJ1bGUucGFyZW50U3R5bGVTaGVldCB8fCB7fSkuaHJlZjtcbiAgICAgICAgICByZXR1cm4gaW5saW5lci5pbmxpbmVBbGwod2ViRm9udFJ1bGUuY3NzVGV4dCwgYmFzZVVybCwgbnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNyYzogKCkgPT4gd2ViRm9udFJ1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnc3JjJylcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5ld0ltYWdlcygpIHtcbiAgcmV0dXJuIHtcbiAgICBpbmxpbmVBbGwsXG4gICAgaW1wbDoge1xuICAgICAgbmV3SW1hZ2VcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gbmV3SW1hZ2UoZWxlbWVudCkge1xuICAgIGZ1bmN0aW9uIGlubGluZShnZXQpIHtcbiAgICAgIGlmIChpc0RhdGFVcmwoZWxlbWVudC5zcmMpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWxlbWVudC5zcmMpXG4gICAgICAgIC50aGVuKHVsID0+XG4gICAgICAgICAgdHlwZW9mIGdldCA9PT0gJ2Z1bmN0aW9uJyA/IGdldCh1bCkgOiBnZXRBbmRFbmNvZGUodWwsIGRvbXRvaW1hZ2UuaW1wbC5vcHRpb25zKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKGRhdGEgPT4gZGF0YUFzVXJsKGRhdGEsIG1pbWVUeXBlKGVsZW1lbnQuc3JjKSkpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIGRhdGFVcmwgPT5cbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3JjID0gZGF0YVVybDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlubGluZVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBpbmxpbmVBbGwobm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5saW5lQmFja2dyb3VuZChub2RlKS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3SW1hZ2Uobm9kZSkuaW5saW5lKG51bGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGFzQXJyYXkobm9kZS5jaGlsZE5vZGVzKS5tYXAoY2hpbGQgPT4gaW5saW5lQWxsKGNoaWxkKSkpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaW5saW5lQmFja2dyb3VuZChuZCkge1xuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IG5kLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQnKTtcblxuICAgICAgaWYgKCFiYWNrZ3JvdW5kKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5saW5lclxuICAgICAgICAuaW5saW5lQWxsKGJhY2tncm91bmQsIG51bGwsIG51bGwpXG4gICAgICAgIC50aGVuKGlubGluZWQgPT4ge1xuICAgICAgICAgIG5kLnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kJywgaW5saW5lZCwgbmQuc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eSgnYmFja2dyb3VuZCcpKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gbmQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBkb210b2ltYWdlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGVBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElB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
@@ -0,0 +1,23 @@
1
+ export declare function processClone(original: any, clone: any): any;
2
+ /** **
3
+ * UTILS
4
+ ****/
5
+ export declare function asArray(arrayLike: any): any[];
6
+ export declare function fourRandomChars(): string;
7
+ export declare function uid(): string;
8
+ export declare function makeImage(uri: any): Promise<unknown>;
9
+ export declare function isDataUrl(url: any): boolean;
10
+ export declare function mimeType(url: any): any;
11
+ export declare function dataAsUrl(content: any, type: any): string;
12
+ export declare function escape(string: any): any;
13
+ export declare function delay(ms: any): (arg: any) => Promise<unknown>;
14
+ export declare function isSrcAsDataUrl(text: any): boolean;
15
+ export declare function canvasToBlob(canvas: any): Promise<unknown>;
16
+ export declare function escapeXhtml(string: any): any;
17
+ export declare function getWidth(node: any): any;
18
+ export declare function getHeight(node: any): any;
19
+ export declare function resolveUrl(url: any, baseUrl: any): any;
20
+ export declare function getAndEncode(url: any, options: any): Promise<unknown>;
21
+ export declare function concatAndResolveUrl(base: any, url: any): string;
22
+ export declare function setStyleSheetBaseHref(text: any, base: any): any;
23
+ export declare function toStyleSheet(text: any): any;