@kepler.gl/utils 3.0.0-alpha.0 → 3.0.0-alpha.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 (60) hide show
  1. package/dist/aggregate-utils.js +1 -21
  2. package/dist/arrow-data-container.d.ts +54 -0
  3. package/dist/arrow-data-container.js +360 -0
  4. package/dist/color-utils.d.ts +8 -0
  5. package/dist/color-utils.js +38 -22
  6. package/dist/data-container-interface.d.ts +18 -0
  7. package/dist/data-container-interface.js +0 -20
  8. package/dist/data-container-utils.d.ts +1 -0
  9. package/dist/data-container-utils.js +10 -22
  10. package/dist/data-row.js +7 -22
  11. package/dist/data-scale-utils.js +7 -22
  12. package/dist/data-utils.d.ts +10 -12
  13. package/dist/data-utils.js +121 -63
  14. package/dist/dataset-utils.d.ts +13 -2
  15. package/dist/dataset-utils.js +85 -33
  16. package/dist/dom-to-image.d.ts +14 -14
  17. package/dist/dom-to-image.js +28 -89
  18. package/dist/dom-utils.d.ts +3 -0
  19. package/dist/dom-utils.js +33 -23
  20. package/dist/effect-utils.d.ts +23 -0
  21. package/dist/effect-utils.js +196 -0
  22. package/dist/export-map-html.js +7 -23
  23. package/dist/export-utils.js +12 -23
  24. package/dist/filter-utils.d.ts +11 -9
  25. package/dist/filter-utils.js +70 -55
  26. package/dist/format.d.ts +1 -0
  27. package/dist/format.js +17 -0
  28. package/dist/gl-utils.js +1 -21
  29. package/dist/h3-utils.d.ts +2 -1
  30. package/dist/h3-utils.js +9 -24
  31. package/dist/index.d.ts +16 -10
  32. package/dist/index.js +250 -558
  33. package/dist/indexed-data-container.js +1 -21
  34. package/dist/locale-utils.js +1 -21
  35. package/dist/map-info-utils.js +6 -22
  36. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +2 -1
  37. package/dist/map-style-utils/mapbox-gl-style-editor.js +8 -22
  38. package/dist/map-style-utils/mapbox-utils.js +7 -22
  39. package/dist/map-utils.d.ts +8 -2
  40. package/dist/map-utils.js +23 -26
  41. package/dist/mapbox-utils.js +7 -22
  42. package/dist/noop.d.ts +1 -0
  43. package/dist/noop.js +11 -0
  44. package/dist/notifications-utils.d.ts +14 -26
  45. package/dist/notifications-utils.js +8 -30
  46. package/dist/observe-dimensions.d.ts +1 -1
  47. package/dist/observe-dimensions.js +13 -29
  48. package/dist/plot.d.ts +6 -0
  49. package/dist/plot.js +31 -0
  50. package/dist/projection-utils.d.ts +9 -0
  51. package/dist/projection-utils.js +40 -22
  52. package/dist/row-data-container.js +1 -21
  53. package/dist/searcher-utils.js +7 -22
  54. package/dist/split-map-utils.d.ts +4 -1
  55. package/dist/split-map-utils.js +9 -23
  56. package/dist/time.d.ts +16 -0
  57. package/dist/time.js +89 -0
  58. package/dist/utils.d.ts +42 -10
  59. package/dist/utils.js +64 -26
  60. package/package.json +14 -13
@@ -1,23 +1,3 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
2
- //
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy
4
- // of this software and associated documentation files (the "Software"), to deal
5
- // in the Software without restriction, including without limitation the rights
6
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- // copies of the Software, and to permit persons to whom the Software is
8
- // furnished to do so, subject to the following conditions:
9
- //
10
- // The above copyright notice and this permission notice shall be included in
11
- // all copies or substantial portions of the Software.
12
- //
13
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- // THE SOFTWARE.
20
-
21
1
  "use strict";
22
2
 
23
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
@@ -32,21 +12,25 @@ exports.getSampleData = getSampleData;
32
12
  exports.timeToUnixMilli = timeToUnixMilli;
33
13
  exports.notNullorUndefined = notNullorUndefined;
34
14
  exports.isNumber = isNumber;
35
- exports.isPlainObject = isPlainObject;
36
15
  exports.hasOwnProperty = hasOwnProperty;
37
16
  exports.numberSort = numberSort;
38
17
  exports.getSortingFunction = getSortingFunction;
39
18
  exports.preciseRound = preciseRound;
19
+ exports.roundToFour = roundToFour;
40
20
  exports.getRoundingDecimalFromStep = getRoundingDecimalFromStep;
41
- exports.snapToMarks = snapToMarks;
42
21
  exports.normalizeSliderValue = normalizeSliderValue;
43
22
  exports.roundValToStep = roundValToStep;
44
23
  exports.getFormatter = getFormatter;
24
+ exports.getColumnFormatter = getColumnFormatter;
25
+ exports.applyValueMap = applyValueMap;
45
26
  exports.applyDefaultFormat = applyDefaultFormat;
46
27
  exports.getBooleanFormatter = getBooleanFormatter;
47
28
  exports.applyCustomFormat = applyCustomFormat;
29
+ exports.formatNumber = formatNumber;
48
30
  exports.datetimeFormatter = datetimeFormatter;
49
- exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.defaultFormatter = void 0;
31
+ exports.arrayMove = exports.parseFieldValue = exports.FIELD_DISPLAY_FORMAT = exports.floatFormatter = exports.defaultFormatter = void 0;
32
+
33
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
50
34
 
51
35
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
52
36
 
@@ -54,14 +38,16 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
54
38
 
55
39
  var _assert = _interopRequireDefault(require("assert"));
56
40
 
57
- var _constants = require("@kepler.gl/constants");
58
-
59
41
  var _d3Format = require("d3-format");
60
42
 
61
- var _d3Array = require("d3-array");
62
-
63
43
  var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
64
44
 
45
+ var _constants = require("@kepler.gl/constants");
46
+
47
+ var _plot = require("./plot");
48
+
49
+ var _utils = require("./utils");
50
+
65
51
  var _FIELD_DISPLAY_FORMAT;
66
52
 
67
53
  /**
@@ -155,15 +141,6 @@ function notNullorUndefined(d) {
155
141
  function isNumber(d) {
156
142
  return Number.isFinite(d);
157
143
  }
158
- /**
159
- * whether is an object
160
- * @returns {boolean} - yes or no
161
- */
162
-
163
-
164
- function isPlainObject(obj) {
165
- return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
166
- }
167
144
  /**
168
145
  * whether object has property
169
146
  * @param {string} prop
@@ -200,6 +177,16 @@ function preciseRound(num, decimals) {
200
177
  var t = Math.pow(10, decimals);
201
178
  return (Math.round(num * t + (decimals > 0 ? 1 : 0) * (Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
202
179
  }
180
+ /**
181
+ * round a giving number at most 4 decimal places
182
+ * e.g. 10 -> 10, 1.12345 -> 1.2345, 2.0 -> 2
183
+ */
184
+
185
+
186
+ function roundToFour(num) {
187
+ // @ts-expect-error
188
+ return Number("".concat(Math.round("".concat(num, "e+4")), "e-4"));
189
+ }
203
190
  /**
204
191
  * get number of decimals to round to for slider from step
205
192
  * @param step
@@ -213,33 +200,23 @@ function getRoundingDecimalFromStep(step) {
213
200
  (0, _assert["default"])(step);
214
201
  }
215
202
 
216
- var splitZero = step.toString().split('.');
203
+ var stepStr = step.toString(); // in case the step is a very small number e.g. 1e-7, return decimal e.g. 7 directly
217
204
 
218
- if (splitZero.length === 1) {
219
- return 0;
220
- }
221
-
222
- return splitZero[1].length;
223
- }
224
- /**
225
- * Use in slider, given a number and an array of numbers, return the nears number from the array
226
- * @param value
227
- * @param marks
228
- */
205
+ var splitExponential = stepStr.split('e-');
229
206
 
207
+ if (splitExponential.length === 2) {
208
+ var coeffZero = splitExponential[0].split('.');
209
+ var coeffDecimal = coeffZero.length === 1 ? 0 : coeffZero[1].length;
210
+ return parseInt(splitExponential[1], 10) + coeffDecimal;
211
+ }
230
212
 
231
- function snapToMarks(value, marks) {
232
- // always use bin x0
233
- var i = (0, _d3Array.bisectLeft)(marks, value);
213
+ var splitZero = stepStr.split('.');
234
214
 
235
- if (i === 0) {
236
- return marks[i];
237
- } else if (i === marks.length) {
238
- return marks[i - 1];
215
+ if (splitZero.length === 1) {
216
+ return 0;
239
217
  }
240
218
 
241
- var idx = marks[i] - value < value - marks[i - 1] ? i : i - 1;
242
- return marks[idx];
219
+ return splitZero[1].length;
243
220
  }
244
221
  /**
245
222
  * If marks is provided, snap to marks, if not normalize to step
@@ -252,7 +229,8 @@ function snapToMarks(value, marks) {
252
229
 
253
230
  function normalizeSliderValue(val, minValue, step, marks) {
254
231
  if (marks && marks.length) {
255
- return snapToMarks(val, marks);
232
+ // Use in slider, given a number and an array of numbers, return the nears number from the array
233
+ return (0, _plot.snapToMarks)(val, marks);
256
234
  }
257
235
 
258
236
  return roundValToStep(minValue, step, val);
@@ -301,9 +279,17 @@ var defaultFormatter = function defaultFormatter(v) {
301
279
  };
302
280
 
303
281
  exports.defaultFormatter = defaultFormatter;
282
+
283
+ var floatFormatter = function floatFormatter(v) {
284
+ return isNumber(v) ? String(roundToFour(v)) : '';
285
+ };
286
+
287
+ exports.floatFormatter = floatFormatter;
304
288
  var FIELD_DISPLAY_FORMAT = (_FIELD_DISPLAY_FORMAT = {}, (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.string, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.timestamp, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.integer, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.real, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES["boolean"], defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.date, defaultFormatter), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.geojson, function (d) {
305
- return typeof d === 'string' ? d : isPlainObject(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
306
- }), _FIELD_DISPLAY_FORMAT);
289
+ return typeof d === 'string' ? d : (0, _utils.isPlainObject)(d) ? JSON.stringify(d) : Array.isArray(d) ? "[".concat(String(d), "]") : '';
290
+ }), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.geoarrow, function (d) {
291
+ return d;
292
+ }), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.object, JSON.stringify), (0, _defineProperty2["default"])(_FIELD_DISPLAY_FORMAT, _constants.ALL_FIELD_TYPES.array, JSON.stringify), _FIELD_DISPLAY_FORMAT);
307
293
  /**
308
294
  * Parse field value and type and return a string representation
309
295
  */
@@ -364,6 +350,35 @@ function getFormatter(format, field) {
364
350
  return defaultFormatter;
365
351
  }
366
352
 
353
+ function getColumnFormatter(colMeta) {
354
+ var format = colMeta.format,
355
+ displayFormat = colMeta.displayFormat;
356
+
357
+ if (!format && !displayFormat) {
358
+ return FIELD_DISPLAY_FORMAT[colMeta.type];
359
+ }
360
+
361
+ var tooltipFormat = Object.values(_constants.TOOLTIP_FORMATS).find(function (f) {
362
+ return f[_constants.TOOLTIP_KEY] === displayFormat;
363
+ });
364
+
365
+ if (tooltipFormat) {
366
+ return applyDefaultFormat(tooltipFormat);
367
+ } else if (typeof displayFormat === 'string' && colMeta) {
368
+ return applyCustomFormat(displayFormat, colMeta);
369
+ } else if ((0, _typeof2["default"])(displayFormat) === 'object') {
370
+ return applyValueMap(displayFormat);
371
+ }
372
+
373
+ return defaultFormatter;
374
+ }
375
+
376
+ function applyValueMap(format) {
377
+ return function (v) {
378
+ return format[v];
379
+ };
380
+ }
381
+
367
382
  function applyDefaultFormat(tooltipFormat) {
368
383
  if (!tooltipFormat || !tooltipFormat.format) {
369
384
  return defaultFormatter;
@@ -424,6 +439,48 @@ function applyCustomFormat(format, field) {
424
439
  };
425
440
  }
426
441
  }
442
+
443
+ function formatLargeNumber(n) {
444
+ // SI-prefix with 4 significant digits
445
+ return (0, _d3Format.format)('.4~s')(n);
446
+ }
447
+
448
+ function formatNumber(n, type) {
449
+ switch (type) {
450
+ case _constants.ALL_FIELD_TYPES.integer:
451
+ if (n < 0) {
452
+ return "-".concat(formatNumber(-n, 'integer'));
453
+ }
454
+
455
+ if (n < 1000) {
456
+ return "".concat(Math.round(n));
457
+ }
458
+
459
+ if (n < 10 * 1000) {
460
+ return (0, _d3Format.format)(',')(Math.round(n));
461
+ }
462
+
463
+ return formatLargeNumber(n);
464
+
465
+ case _constants.ALL_FIELD_TYPES.real:
466
+ if (n < 0) {
467
+ return "-".concat(formatNumber(-n, 'number'));
468
+ }
469
+
470
+ if (n < 1000) {
471
+ return (0, _d3Format.format)('.4~r')(n);
472
+ }
473
+
474
+ if (n < 10 * 1000) {
475
+ return (0, _d3Format.format)(',.2~f')(n);
476
+ }
477
+
478
+ return formatLargeNumber(n);
479
+
480
+ default:
481
+ return formatNumber(n, 'real');
482
+ }
483
+ }
427
484
  /**
428
485
  * Format epoch milliseconds with a format string
429
486
  * @type timezone
@@ -435,10 +492,11 @@ function datetimeFormatter(timezone) {
435
492
  return function (ts) {
436
493
  return _momentTimezone["default"].utc(ts).tz(timezone).format(format);
437
494
  };
438
- } : function (format) {
495
+ } : // return empty string instead of 'Invalid date' if ts is undefined/null
496
+ function (format) {
439
497
  return function (ts) {
440
- return _momentTimezone["default"].utc(ts).format(format);
498
+ return ts ? _momentTimezone["default"].utc(ts).format(format) : '';
441
499
  };
442
500
  };
443
501
  }
444
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImlzUGxhaW5PYmplY3QiLCJvYmoiLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3AiLCJhIiwiYiIsImdldFNvcnRpbmdGdW5jdGlvbiIsImZpZWxkVHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInJlYWwiLCJpbnRlZ2VyIiwidGltZXN0YW1wIiwicHJlY2lzZVJvdW5kIiwibnVtIiwiZGVjaW1hbHMiLCJ0IiwicG93Iiwicm91bmQiLCJzaWduIiwidG9GaXhlZCIsImdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwIiwic3RlcCIsImlzTmFOIiwic3BsaXRaZXJvIiwidG9TdHJpbmciLCJzcGxpdCIsInNuYXBUb01hcmtzIiwibWFya3MiLCJub3JtYWxpemVTbGlkZXJWYWx1ZSIsIm1pblZhbHVlIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJGSUVMRF9ESVNQTEFZX0ZPUk1BVCIsInN0cmluZyIsImRhdGUiLCJnZW9qc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlRmllbGRWYWx1ZSIsInR5cGUiLCJhcnJheU1vdmVNdXRhdGUiLCJhcnJheSIsImZyb20iLCJ0byIsInNwbGljZSIsImFycmF5TW92ZSIsInNsaWNlIiwiZ2V0Rm9ybWF0dGVyIiwiZmllbGQiLCJ0b29sdGlwRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRTIiwiZmluZCIsImYiLCJUT09MVElQX0tFWSIsImFwcGx5RGVmYXVsdEZvcm1hdCIsImFwcGx5Q3VzdG9tRm9ybWF0IiwiVE9PTFRJUF9GT1JNQVRfVFlQRVMiLCJERUNJTUFMIiwiREFURSIsIkRBVEVfVElNRSIsImRhdGV0aW1lRm9ybWF0dGVyIiwiUEVSQ0VOVEFHRSIsIkRFQ0lNQUxfREVDSU1BTF9GSVhFRF8yIiwiQk9PTEVBTiIsImdldEJvb2xlYW5Gb3JtYXR0ZXIiLCJ0aW1lem9uZSIsInRzIiwidHoiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBT0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxNQUFULENBQW1CQyxNQUFuQixFQUFnQztBQUNyQyxNQUFNQyxPQUFZLEdBQUcsRUFBckI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxNQUFSLENBQWxCO0FBQ0FFLEVBQUFBLFNBQVMsQ0FBQ0UsT0FBVixDQUFrQixVQUFBQyxDQUFDLEVBQUk7QUFDckIsUUFBSUMsa0JBQWtCLENBQUNELENBQUQsQ0FBdEIsRUFBMkI7QUFDekJKLE1BQUFBLE9BQU8sQ0FBQ00sSUFBUixDQUFhRixDQUFiO0FBQ0Q7QUFDRixHQUpEO0FBS0EsU0FBT0osT0FBUDtBQUNEOztBQUVNLFNBQVNPLGVBQVQsQ0FDTEMsTUFESyxFQUVMQyxHQUZLLEVBR0xDLEtB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TUFBZixDQUFzQkEsTUFBdEIsQ0FBSjtBQUFBLEtBQU47QUFBQSxHQU5WO0FBT0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVMsXG4gIFRPT0xUSVBfS0VZLFxuICBUb29sdGlwRm9ybWF0XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Zm9ybWF0IGFzIGQzRm9ybWF0fSBmcm9tICdkMy1mb3JtYXQnO1xuaW1wb3J0IHtiaXNlY3RMZWZ0fSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5cbmltcG9ydCB7TWlsbGlzZWNvbmQsIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXR0ZXIgPSAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIHNpbXBsZSBnZXR0aW5nIHVuaXF1ZSB2YWx1ZXMgb2YgYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4odmFsdWVzOiBUW10pIHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGNvbnN0IHVuaXF1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgdW5pcXVlU2V0LmZvckVhY2godiA9PiB7XG4gICAgaWYgKG5vdE51bGxvclVuZGVmaW5lZCh2KSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0TG5nQm91bmRzKFxuICBwb2ludHM6IG51bWJlcltdW10sXG4gIGlkeDogbnVtYmVyLFxuICBsaW1pdDogW251bWJlciwgbnVtYmVyXVxuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICBjb25zdCBsYXRzID0gcG9pbnRzXG4gICAgLm1hcChkID0+IE51bWJlcihBcnJheS5pc0FycmF5KGQpKSAmJiBkW2lkeF0pXG4gICAgLmZpbHRlcihOdW1iZXIuaXNGaW5pdGUpXG4gICAgLnNvcnQobnVtYmVyU29ydCk7XG5cbiAgaWYgKCFsYXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2xhbXAgdG8gbGltaXRcbiAgcmV0dXJuIFtNYXRoLm1heChsYXRzWzBdLCBsaW1pdFswXSksIE1hdGgubWluKGxhdHNbbGF0cy5sZW5ndGggLSAxXSwgbGltaXRbMV0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKFttaW4sIG1heF06IFtudW1iZXIsIG51bWJlcl0sIHZhbDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiB2YWwgPD0gbWluID8gbWluIDogdmFsID49IG1heCA/IG1heCA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbXBsZURhdGEoZGF0YSwgc2FtcGxlU2l6ZSA9IDUwMCwgZ2V0VmFsdWUgPSBkID0+IGQpIHtcbiAgY29uc3Qgc2FtcGxlU3RlcCA9IE1hdGgubWF4KE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyBzYW1wbGVTaXplKSwgMSk7XG4gIGNvbnN0IG91dHB1dDogYW55W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzYW1wbGVTdGVwKSB7XG4gICAgb3V0cHV0LnB1c2goZ2V0VmFsdWUoZGF0YVtpXSkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRpZmZlcmVudCB0aW1lIGZvcm1hdCB0byB1bml4IG1pbGxpc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRvVW5peE1pbGxpKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IE1pbGxpc2Vjb25kIHwgbnVsbCB7XG4gIGlmIChub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtb21lbnQudXRjKHZhbHVlLCBmb3JtYXQpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPT09ICd4JyA/IHZhbHVlICogMTAwMCA6IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPGFueT4+KGQ6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgIT09IHVuZGVmaW5lZCAmJiBkICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZCBpcyBhIG51bWJlciwgdGhpcyBmaWx0ZXJlZCBvdXQgTmFOIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKGQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGQpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgb2JqZWN0IGhhcyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIHt9LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclNvcnQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGRUeXBlOiBzdHJpbmcpOiB0eXBlb2YgbnVtYmVyU29ydCB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBudW1iZXJTb3J0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIHdpdGggZXhhY3QgbnVtYmVyIG9mIGRlY2ltYWxzXG4gKiByZXR1cm4gYXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2VSb3VuZChudW06IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICByZXR1cm4gKFxuICAgIE1hdGgucm91bmQoXG4gICAgICBudW0gKiB0ICsgKGRlY2ltYWxzID4gMCA/IDEgOiAwKSAqIChNYXRoLnNpZ24obnVtKSAqICgxMCAvIE1hdGgucG93KDEwMCwgZGVjaW1hbHMpKSlcbiAgICApIC8gdFxuICApLnRvRml4ZWQoZGVjaW1hbHMpO1xufVxuXG4vKipcbiAqIGdldCBudW1iZXIgb2YgZGVjaW1hbHMgdG8gcm91bmQgdG8gZm9yIHNsaWRlciBmcm9tIHN0ZXBcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcmV0dXJucy0gbnVtYmVyIG9mIGRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdW5kaW5nRGVjaW1hbEZyb21TdGVwKHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihzdGVwKSkge1xuICAgIGFzc2VydCgnc3RlcCBpcyBub3QgYSBudW1iZXInKTtcbiAgICBhc3NlcnQoc3RlcCk7XG4gIH1cblxuICBjb25zdCBzcGxpdFplcm8gPSBzdGVwLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgaWYgKHNwbGl0WmVyby5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3BsaXRaZXJvWzFdLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBVc2UgaW4gc2xpZGVyLCBnaXZlbiBhIG51bWJlciBhbmQgYW4gYXJyYXkgb2YgbnVtYmVycywgcmV0dXJuIHRoZSBuZWFycyBudW1iZXIgZnJvbSB0aGUgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmFwVG9NYXJrcyh2YWx1ZTogbnVtYmVyLCBtYXJrczogbnVtYmVyW10pOiBudW1iZXIge1xuICAvLyBhbHdheXMgdXNlIGJpbiB4MFxuICBjb25zdCBpID0gYmlzZWN0TGVmdChtYXJrcywgdmFsdWUpO1xuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBtYXJrc1tpXTtcbiAgfSBlbHNlIGlmIChpID09PSBtYXJrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbWFya3NbaSAtIDFdO1xuICB9XG4gIGNvbnN0IGlkeCA9IG1hcmtzW2ldIC0gdmFsdWUgPCB2YWx1ZSAtIG1hcmtzW2kgLSAxXSA/IGkgOiBpIC0gMTtcbiAgcmV0dXJuIG1hcmtzW2lkeF07XG59XG5cbi8qKlxuICogSWYgbWFya3MgaXMgcHJvdmlkZWQsIHNuYXAgdG8gbWFya3MsIGlmIG5vdCBub3JtYWxpemUgdG8gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIG1hcmtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTbGlkZXJWYWx1ZShcbiAgdmFsOiBudW1iZXIsXG4gIG1pblZhbHVlOiBudW1iZXIsXG4gIHN0ZXA6IG51bWJlcixcbiAgbWFya3M/OiBudW1iZXJbXVxuKTogbnVtYmVyIHtcbiAgaWYgKG1hcmtzICYmIG1hcmtzLmxlbmd0aCkge1xuICAgIHJldHVybiBzbmFwVG9NYXJrcyh2YWwsIG1hcmtzKTtcbiAgfVxuXG4gIHJldHVybiByb3VuZFZhbFRvU3RlcChtaW5WYWx1ZSwgc3RlcCwgdmFsKTtcbn1cblxuLyoqXG4gKiByb3VuZCB0aGUgdmFsdWUgdG8gc3RlcCBmb3IgdGhlIHNsaWRlclxuICogQHBhcmFtIG1pblZhbHVlXG4gKiBAcGFyYW0gc3RlcFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMgLSByb3VuZGVkIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRWYWxUb1N0ZXAobWluVmFsdWU6IG51bWJlciwgc3RlcDogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghaXNOdW1iZXIoc3RlcCkgfHwgIWlzTnVtYmVyKG1pblZhbHVlKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBjb25zdCBkZWNpbWFsID0gZ2V0Um91bmRpbmdEZWNpbWFsRnJvbVN0ZXAoc3RlcCk7XG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5mbG9vcigodmFsIC0gbWluVmFsdWUpIC8gc3RlcCk7XG4gIGxldCByZW1haW4gPSB2YWwgLSAoc3RlcHMgKiBzdGVwICsgbWluVmFsdWUpO1xuXG4gIC8vIGhhcyB0byByb3VuZCBiZWNhdXNlIGphdmFzY3JpcHQgdHVybnMgMC4xIGludG8gMC45OTk5OTk5OTk5OTk5OTg3XG4gIHJlbWFpbiA9IE51bWJlcihwcmVjaXNlUm91bmQocmVtYWluLCA4KSk7XG5cbiAgbGV0IGNsb3Nlc3Q6IG51bWJlcjtcbiAgaWYgKHJlbWFpbiA9PT0gMCkge1xuICAgIGNsb3Nlc3QgPSB2YWw7XG4gIH0gZWxzZSBpZiAocmVtYWluIDwgc3RlcCAvIDIpIHtcbiAgICBjbG9zZXN0ID0gc3RlcHMgKiBzdGVwICsgbWluVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2xvc2VzdCA9IChzdGVwcyArIDEpICogc3RlcCArIG1pblZhbHVlO1xuICB9XG5cbiAgLy8gcHJlY2lzZSByb3VuZCByZXR1cm4gYSBzdHJpbmcgcm91bmRlZCB0byB0aGUgZGVmaW5lZCBkZWNpbWFsXG4gIGNvbnN0IHJvdW5kZWQgPSBwcmVjaXNlUm91bmQoY2xvc2VzdCwgZGVjaW1hbCk7XG5cbiAgcmV0dXJuIE51bWJlcihyb3VuZGVkKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvcm1hdCBiYXNlZCBvbiBmaWVsZCBhbmQgZm9ybWF0IG9wdGlvbnNcbiAqIFVzZWQgaW4gcmVuZGVyIHRvb2x0aXAgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGb3JtYXR0ZXI6IEZpZWxkRm9ybWF0dGVyID0gdiA9PiAobm90TnVsbG9yVW5kZWZpbmVkKHYpID8gU3RyaW5nKHYpIDogJycpO1xuXG5leHBvcnQgY29uc3QgRklFTERfRElTUExBWV9GT1JNQVQ6IHtcbiAgW2tleTogc3RyaW5nXTogRmllbGRGb3JtYXR0ZXI7XG59ID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ106IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5kYXRlXTogZGVmYXVsdEZvcm1hdHRlcixcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9qc29uXTogZCA9PlxuICAgIHR5cGVvZiBkID09PSAnc3RyaW5nJ1xuICAgICAgPyBkXG4gICAgICA6IGlzUGxhaW5PYmplY3QoZClcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShkKVxuICAgICAgPyBgWyR7U3RyaW5nKGQpfV1gXG4gICAgICA6ICcnXG59O1xuXG4vKipcbiAqIFBhcnNlIGZpZWxkIHZhbHVlIGFuZCB0eXBlIGFuZCByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRmllbGRWYWx1ZSA9ICh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0gPyBGSUVMRF9ESVNQTEFZX0ZPUk1BVFt0eXBlXSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSB0b1xuICovXG5leHBvcnQgY29uc3QgYXJyYXlNb3ZlID0gPFQ+KGFycmF5OiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICBhcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIGFycmF5TW92ZU11dGF0ZShhcnJheSwgZnJvbSwgdG8pO1xuICByZXR1cm4gYXJyYXk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9ybWF0IGJhc2VkIG9uIGZpZWxkIGFuZCBmb3JtYXQgb3B0aW9uc1xuICogVXNlZCBpbiByZW5kZXIgdG9vbHRpcCB2YWx1ZVxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoXG4gIGZvcm1hdDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZmllbGQ/OiBGaWVsZFxuKTogRmllbGRGb3JtYXR0ZXIge1xuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBmb3JtYXQpO1xuXG4gIGlmICh0b29sdGlwRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0IGFzIFRvb2x0aXBGb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmIGZpZWxkKSB7XG4gICAgcmV0dXJuIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdDogVG9vbHRpcEZvcm1hdCk6ICh2OiBhbnkpID0+IHN0cmluZyB7XG4gIGlmICghdG9vbHRpcEZvcm1hdCB8fCAhdG9vbHRpcEZvcm1hdC5mb3JtYXQpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxuXG4gIHN3aXRjaCAodG9vbHRpcEZvcm1hdC50eXBlKSB7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5ERUNJTUFMOlxuICAgICAgcmV0dXJuIGQzRm9ybWF0KHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEU6XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5EQVRFX1RJTUU6XG4gICAgICByZXR1cm4gZGF0ZXRpbWVGb3JtYXR0ZXIobnVsbCkodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuUEVSQ0VOVEFHRTpcbiAgICAgIHJldHVybiB2ID0+IGAke2QzRm9ybWF0KFRPT0xUSVBfRk9STUFUUy5ERUNJTUFMX0RFQ0lNQUxfRklYRURfMi5mb3JtYXQpKHYpfSVgO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuQk9PTEVBTjpcbiAgICAgIHJldHVybiBnZXRCb29sZWFuRm9ybWF0dGVyKHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5Gb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnMDEnOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICcxJyA6ICcwJyk7XG4gICAgY2FzZSAneW4nOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICd5ZXMnIDogJ25vJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG59XG4vLyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgY3VzdG9tIHRvb2x0aXAgZm9ybWF0IHZpYSBjb25maWdcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUN1c3RvbUZvcm1hdChmb3JtYXQsIGZpZWxkKTogRmllbGRGb3JtYXR0ZXIge1xuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICByZXR1cm4gZDNGb3JtYXQoZm9ybWF0KTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKShmb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdiA9PiB2O1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGVwb2NoIG1pbGxpc2Vjb25kcyB3aXRoIGEgZm9ybWF0IHN0cmluZ1xuICogQHR5cGUgdGltZXpvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lRm9ybWF0dGVyKFxuICB0aW1lem9uZT86IHN0cmluZyB8IG51bGxcbik6IChmb3JtYXQ/OiBzdHJpbmcpID0+ICh0czogbnVtYmVyKSA9PiBzdHJpbmcge1xuICByZXR1cm4gdGltZXpvbmVcbiAgICA/IGZvcm1hdCA9PiB0cyA9PlxuICAgICAgICBtb21lbnRcbiAgICAgICAgICAudXRjKHRzKVxuICAgICAgICAgIC50eih0aW1lem9uZSlcbiAgICAgICAgICAuZm9ybWF0KGZvcm1hdClcbiAgICA6IGZvcm1hdCA9PiB0cyA9PiBtb21lbnQudXRjKHRzKS5mb3JtYXQoZm9ybWF0KTtcbn1cbiJdfQ==
502
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXV0aWxzLnRzIl0sIm5hbWVzIjpbInVuaXF1ZSIsInZhbHVlcyIsInJlc3VsdHMiLCJ1bmlxdWVTZXQiLCJTZXQiLCJmb3JFYWNoIiwidiIsIm5vdE51bGxvclVuZGVmaW5lZCIsInB1c2giLCJnZXRMYXRMbmdCb3VuZHMiLCJwb2ludHMiLCJpZHgiLCJsaW1pdCIsImxhdHMiLCJtYXAiLCJkIiwiTnVtYmVyIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNGaW5pdGUiLCJzb3J0IiwibnVtYmVyU29ydCIsImxlbmd0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJjbGFtcCIsInZhbCIsImdldFNhbXBsZURhdGEiLCJkYXRhIiwic2FtcGxlU2l6ZSIsImdldFZhbHVlIiwic2FtcGxlU3RlcCIsImZsb29yIiwib3V0cHV0IiwiaSIsInRpbWVUb1VuaXhNaWxsaSIsInZhbHVlIiwiZm9ybWF0IiwibW9tZW50IiwidXRjIiwidmFsdWVPZiIsIkRhdGUiLCJ1bmRlZmluZWQiLCJpc051bWJlciIsImhhc093blByb3BlcnR5Iiwib2JqIiwicHJvcCIsImEiLCJiIiwiZ2V0U29ydGluZ0Z1bmN0aW9uIiwiZmllbGRUeXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsImludGVnZXIiLCJ0aW1lc3RhbXAiLCJwcmVjaXNlUm91bmQiLCJudW0iLCJkZWNpbWFscyIsInQiLCJwb3ciLCJyb3VuZCIsInNpZ24iLCJ0b0ZpeGVkIiwicm91bmRUb0ZvdXIiLCJnZXRSb3VuZGluZ0RlY2ltYWxGcm9tU3RlcCIsInN0ZXAiLCJpc05hTiIsInN0ZXBTdHIiLCJ0b1N0cmluZyIsInNwbGl0RXhwb25lbnRpYWwiLCJzcGxpdCIsImNvZWZmWmVybyIsImNvZWZmRGVjaW1hbCIsInBhcnNlSW50Iiwic3BsaXRaZXJvIiwibm9ybWFsaXplU2xpZGVyVmFsdWUiLCJtaW5WYWx1ZSIsIm1hcmtzIiwicm91bmRWYWxUb1N0ZXAiLCJkZWNpbWFsIiwic3RlcHMiLCJyZW1haW4iLCJjbG9zZXN0Iiwicm91bmRlZCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJTdHJpbmciLCJmbG9hdEZvcm1hdHRlciIsIkZJRUxEX0RJU1BMQVlfRk9STUFUIiwic3RyaW5nIiwiZGF0ZSIsImdlb2pzb24iLCJKU09OIiwic3RyaW5naWZ5IiwiZ2VvYXJyb3ciLCJvYmplY3QiLCJhcnJheSIsInBhcnNlRmllbGRWYWx1ZSIsInR5cGUiLCJhcnJheU1vdmVNdXRhdGUiLCJmcm9tIiwidG8iLCJzcGxpY2UiLCJhcnJheU1vdmUiLCJzbGljZSIsImdldEZvcm1hdHRlciIsImZpZWxkIiwidG9vbHRpcEZvcm1hdCIsIk9iamVjdCIsIlRPT0xUSVBfRk9STUFUUyIsImZpbmQiLCJmIiwiVE9PTFRJUF9LRVkiLCJhcHBseURlZmF1bHRGb3JtYXQiLCJhcHBseUN1c3RvbUZvcm1hdCIsImdldENvbHVtbkZvcm1hdHRlciIsImNvbE1ldGEiLCJkaXNwbGF5Rm9ybWF0IiwiYXBwbHlWYWx1ZU1hcCIsIlRPT0xUSVBfRk9STUFUX1RZUEVTIiwiREVDSU1BTCIsIkRBVEUiLCJEQVRFX1RJTUUiLCJkYXRldGltZUZvcm1hdHRlciIsIlBFUkNFTlRBR0UiLCJERUNJTUFMX0RFQ0lNQUxfRklYRURfMiIsIkJPT0xFQU4iLCJnZXRCb29sZWFuRm9ybWF0dGVyIiwiZm9ybWF0TGFyZ2VOdW1iZXIiLCJuIiwiZm9ybWF0TnVtYmVyIiwidGltZXpvbmUiLCJ0cyIsInR6Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUVBOztBQVNBOztBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsTUFBVCxDQUFtQkMsTUFBbkIsRUFBZ0M7QUFDckMsTUFBTUMsT0FBWSxHQUFHLEVBQXJCO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLElBQUlDLEdBQUosQ0FBUUgsTUFBUixDQUFsQjtBQUNBRSxFQUFBQSxTQUFT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LE1BQU07QUFBQSxXQUFJLFVBQUE4RixFQUFFO0FBQUEsYUFDVjdGLDJCQUNHQyxHQURILENBQ080RixFQURQLEVBRUdDLEVBRkgsQ0FFTUYsUUFGTixFQUdHN0YsTUFISCxDQUdVQSxNQUhWLENBRFU7QUFBQSxLQUFOO0FBQUEsR0FESyxHQU1YO0FBQ0EsWUFBQUEsTUFBTTtBQUFBLFdBQUksVUFBQThGLEVBQUU7QUFBQSxhQUFLQSxFQUFFLEdBQUc3RiwyQkFBT0MsR0FBUCxDQUFXNEYsRUFBWCxFQUFlOUYsTUFBZixDQUFzQkEsTUFBdEIsQ0FBSCxHQUFtQyxFQUExQztBQUFBLEtBQU47QUFBQSxHQVBWO0FBUUQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2Zvcm1hdCBhcyBkM0Zvcm1hdH0gZnJvbSAnZDMtZm9ybWF0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBUT09MVElQX0ZPUk1BVFMsXG4gIFRPT0xUSVBfRk9STUFUX1RZUEVTLFxuICBUT09MVElQX0tFWSxcbiAgVG9vbHRpcEZvcm1hdFxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge01pbGxpc2Vjb25kLCBGaWVsZCwgQ29sTWV0YVByb3BzfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuaW1wb3J0IHtzbmFwVG9NYXJrc30gZnJvbSAnLi9wbG90JztcbmltcG9ydCB7aXNQbGFpbk9iamVjdH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIEZpZWxkRm9ybWF0dGVyID0gKHZhbHVlOiBhbnkpID0+IHN0cmluZztcblxuLyoqXG4gKiBzaW1wbGUgZ2V0dGluZyB1bmlxdWUgdmFsdWVzIG9mIGFuIGFycmF5XG4gKlxuICogQHBhcmFtIHZhbHVlc1xuICogQHJldHVybnMgdW5pcXVlIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlPFQ+KHZhbHVlczogVFtdKSB7XG4gIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdO1xuICBjb25zdCB1bmlxdWVTZXQgPSBuZXcgU2V0KHZhbHVlcyk7XG4gIHVuaXF1ZVNldC5mb3JFYWNoKHYgPT4ge1xuICAgIGlmIChub3ROdWxsb3JVbmRlZmluZWQodikpIHtcbiAgICAgIHJlc3VsdHMucHVzaCh2KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdExuZ0JvdW5kcyhcbiAgcG9pbnRzOiBudW1iZXJbXVtdLFxuICBpZHg6IG51bWJlcixcbiAgbGltaXQ6IFtudW1iZXIsIG51bWJlcl1cbik6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgY29uc3QgbGF0cyA9IHBvaW50c1xuICAgIC5tYXAoZCA9PiBOdW1iZXIoQXJyYXkuaXNBcnJheShkKSkgJiYgZFtpZHhdKVxuICAgIC5maWx0ZXIoTnVtYmVyLmlzRmluaXRlKVxuICAgIC5zb3J0KG51bWJlclNvcnQpO1xuXG4gIGlmICghbGF0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGNsYW1wIHRvIGxpbWl0XG4gIHJldHVybiBbTWF0aC5tYXgobGF0c1swXSwgbGltaXRbMF0pLCBNYXRoLm1pbihsYXRzW2xhdHMubGVuZ3RoIC0gMV0sIGxpbWl0WzFdKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChbbWluLCBtYXhdOiBbbnVtYmVyLCBudW1iZXJdLCB2YWw6IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gdmFsIDw9IG1pbiA/IG1pbiA6IHZhbCA+PSBtYXggPyBtYXggOiB2YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW1wbGVEYXRhKGRhdGEsIHNhbXBsZVNpemUgPSA1MDAsIGdldFZhbHVlID0gZCA9PiBkKSB7XG4gIGNvbnN0IHNhbXBsZVN0ZXAgPSBNYXRoLm1heChNYXRoLmZsb29yKGRhdGEubGVuZ3RoIC8gc2FtcGxlU2l6ZSksIDEpO1xuICBjb25zdCBvdXRwdXQ6IGFueVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gc2FtcGxlU3RlcCkge1xuICAgIG91dHB1dC5wdXNoKGdldFZhbHVlKGRhdGFbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBkaWZmZXJlbnQgdGltZSBmb3JtYXQgdG8gdW5peCBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVUb1VuaXhNaWxsaSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgZm9ybWF0OiBzdHJpbmcpOiBNaWxsaXNlY29uZCB8IG51bGwge1xuICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbW9tZW50LnV0Yyh2YWx1ZSwgZm9ybWF0KS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZm9ybWF0ID09PSAneCcgPyB2YWx1ZSAqIDEwMDAgOiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogd2hldGhlciBudWxsIG9yIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90TnVsbG9yVW5kZWZpbmVkPFQgZXh0ZW5kcyBOb25OdWxsYWJsZTxhbnk+PihkOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGQgaXMgVCB7XG4gIHJldHVybiBkICE9PSB1bmRlZmluZWQgJiYgZCAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGQgaXMgYSBudW1iZXIsIHRoaXMgZmlsdGVyZWQgb3V0IE5hTiBhcyB3ZWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihkOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShkKTtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIG9iamVjdCBoYXMgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5PFggZXh0ZW5kcyB7fSwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgb2JqOiBYLFxuICBwcm9wOiBZXG4pOiBvYmogaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkocHJvcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJTb3J0KGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEgLSBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29ydGluZ0Z1bmN0aW9uKGZpZWxkVHlwZTogc3RyaW5nKTogdHlwZW9mIG51bWJlclNvcnQgfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXA6XG4gICAgICByZXR1cm4gbnVtYmVyU29ydDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIHJvdW5kIG51bWJlciB3aXRoIGV4YWN0IG51bWJlciBvZiBkZWNpbWFsc1xuICogcmV0dXJuIGFzIGEgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVjaXNlUm91bmQobnVtOiBudW1iZXIsIGRlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0ID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLnJvdW5kKFxuICAgICAgbnVtICogdCArIChkZWNpbWFscyA+IDAgPyAxIDogMCkgKiAoTWF0aC5zaWduKG51bSkgKiAoMTAgLyBNYXRoLnBvdygxMDAsIGRlY2ltYWxzKSkpXG4gICAgKSAvIHRcbiAgKS50b0ZpeGVkKGRlY2ltYWxzKTtcbn1cblxuLyoqXG4gKiByb3VuZCBhIGdpdmluZyBudW1iZXIgYXQgbW9zdCA0IGRlY2ltYWwgcGxhY2VzXG4gKiBlLmcuIDEwIC0+IDEwLCAxLjEyMzQ1IC0+IDEuMjM0NSwgMi4wIC0+IDJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kVG9Gb3VyKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICByZXR1cm4gTnVtYmVyKGAke01hdGgucm91bmQoYCR7bnVtfWUrNGApfWUtNGApO1xufVxuLyoqXG4gKiBnZXQgbnVtYmVyIG9mIGRlY2ltYWxzIHRvIHJvdW5kIHRvIGZvciBzbGlkZXIgZnJvbSBzdGVwXG4gKiBAcGFyYW0gc3RlcFxuICogQHJldHVybnMtIG51bWJlciBvZiBkZWNpbWFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3VuZGluZ0RlY2ltYWxGcm9tU3RlcChzdGVwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaXNOYU4oc3RlcCkpIHtcbiAgICBhc3NlcnQoJ3N0ZXAgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgYXNzZXJ0KHN0ZXApO1xuICB9XG5cbiAgY29uc3Qgc3RlcFN0ciA9IHN0ZXAudG9TdHJpbmcoKTtcblxuICAvLyBpbiBjYXNlIHRoZSBzdGVwIGlzIGEgdmVyeSBzbWFsbCBudW1iZXIgZS5nLiAxZS03LCByZXR1cm4gZGVjaW1hbCBlLmcuIDcgZGlyZWN0bHlcbiAgY29uc3Qgc3BsaXRFeHBvbmVudGlhbCA9IHN0ZXBTdHIuc3BsaXQoJ2UtJyk7XG4gIGlmIChzcGxpdEV4cG9uZW50aWFsLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IGNvZWZmWmVybyA9IHNwbGl0RXhwb25lbnRpYWxbMF0uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBjb2VmZkRlY2ltYWwgPSBjb2VmZlplcm8ubGVuZ3RoID09PSAxID8gMCA6IGNvZWZmWmVyb1sxXS5sZW5ndGg7XG4gICAgcmV0dXJuIHBhcnNlSW50KHNwbGl0RXhwb25lbnRpYWxbMV0sIDEwKSArIGNvZWZmRGVjaW1hbDtcbiAgfVxuXG4gIGNvbnN0IHNwbGl0WmVybyA9IHN0ZXBTdHIuc3BsaXQoJy4nKTtcbiAgaWYgKHNwbGl0WmVyby5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3BsaXRaZXJvWzFdLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBJZiBtYXJrcyBpcyBwcm92aWRlZCwgc25hcCB0byBtYXJrcywgaWYgbm90IG5vcm1hbGl6ZSB0byBzdGVwXG4gKiBAcGFyYW0gdmFsXG4gKiBAcGFyYW0gbWluVmFsdWVcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcGFyYW0gbWFya3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNsaWRlclZhbHVlKFxuICB2YWw6IG51bWJlcixcbiAgbWluVmFsdWU6IG51bWJlcixcbiAgc3RlcDogbnVtYmVyLFxuICBtYXJrcz86IG51bWJlcltdXG4pOiBudW1iZXIge1xuICBpZiAobWFya3MgJiYgbWFya3MubGVuZ3RoKSB7XG4gICAgLy8gVXNlIGluIHNsaWRlciwgZ2l2ZW4gYSBudW1iZXIgYW5kIGFuIGFycmF5IG9mIG51bWJlcnMsIHJldHVybiB0aGUgbmVhcnMgbnVtYmVyIGZyb20gdGhlIGFycmF5XG4gICAgcmV0dXJuIHNuYXBUb01hcmtzKHZhbCwgbWFya3MpO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kVmFsVG9TdGVwKG1pblZhbHVlLCBzdGVwLCB2YWwpO1xufVxuXG4vKipcbiAqIHJvdW5kIHRoZSB2YWx1ZSB0byBzdGVwIGZvciB0aGUgc2xpZGVyXG4gKiBAcGFyYW0gbWluVmFsdWVcbiAqIEBwYXJhbSBzdGVwXG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJucyAtIHJvdW5kZWQgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFZhbFRvU3RlcChtaW5WYWx1ZTogbnVtYmVyLCBzdGVwOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCFpc051bWJlcihzdGVwKSB8fCAhaXNOdW1iZXIobWluVmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGNvbnN0IGRlY2ltYWwgPSBnZXRSb3VuZGluZ0RlY2ltYWxGcm9tU3RlcChzdGVwKTtcbiAgY29uc3Qgc3RlcHMgPSBNYXRoLmZsb29yKCh2YWwgLSBtaW5WYWx1ZSkgLyBzdGVwKTtcbiAgbGV0IHJlbWFpbiA9IHZhbCAtIChzdGVwcyAqIHN0ZXAgKyBtaW5WYWx1ZSk7XG5cbiAgLy8gaGFzIHRvIHJvdW5kIGJlY2F1c2UgamF2YXNjcmlwdCB0dXJucyAwLjEgaW50byAwLjk5OTk5OTk5OTk5OTk5ODdcbiAgcmVtYWluID0gTnVtYmVyKHByZWNpc2VSb3VuZChyZW1haW4sIDgpKTtcblxuICBsZXQgY2xvc2VzdDogbnVtYmVyO1xuICBpZiAocmVtYWluID09PSAwKSB7XG4gICAgY2xvc2VzdCA9IHZhbDtcbiAgfSBlbHNlIGlmIChyZW1haW4gPCBzdGVwIC8gMikge1xuICAgIGNsb3Nlc3QgPSBzdGVwcyAqIHN0ZXAgKyBtaW5WYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBjbG9zZXN0ID0gKHN0ZXBzICsgMSkgKiBzdGVwICsgbWluVmFsdWU7XG4gIH1cblxuICAvLyBwcmVjaXNlIHJvdW5kIHJldHVybiBhIHN0cmluZyByb3VuZGVkIHRvIHRoZSBkZWZpbmVkIGRlY2ltYWxcbiAgY29uc3Qgcm91bmRlZCA9IHByZWNpc2VSb3VuZChjbG9zZXN0LCBkZWNpbWFsKTtcblxuICByZXR1cm4gTnVtYmVyKHJvdW5kZWQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9ybWF0IGJhc2VkIG9uIGZpZWxkIGFuZCBmb3JtYXQgb3B0aW9uc1xuICogVXNlZCBpbiByZW5kZXIgdG9vbHRpcCB2YWx1ZVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZvcm1hdHRlcjogRmllbGRGb3JtYXR0ZXIgPSB2ID0+IChub3ROdWxsb3JVbmRlZmluZWQodikgPyBTdHJpbmcodikgOiAnJyk7XG5cbmV4cG9ydCBjb25zdCBmbG9hdEZvcm1hdHRlciA9IHYgPT4gKGlzTnVtYmVyKHYpID8gU3RyaW5nKHJvdW5kVG9Gb3VyKHYpKSA6ICcnKTtcblxuZXhwb3J0IGNvbnN0IEZJRUxEX0RJU1BMQVlfRk9STUFUOiB7XG4gIFtrZXk6IHN0cmluZ106IEZpZWxkRm9ybWF0dGVyO1xufSA9IHtcbiAgW0FMTF9GSUVMRF9UWVBFUy5zdHJpbmddOiBkZWZhdWx0Rm9ybWF0dGVyLFxuICBbQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcF06IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMuaW50ZWdlcl06IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMucmVhbF06IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMuYm9vbGVhbl06IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMuZGF0ZV06IGRlZmF1bHRGb3JtYXR0ZXIsXG4gIFtBTExfRklFTERfVFlQRVMuZ2VvanNvbl06IGQgPT5cbiAgICB0eXBlb2YgZCA9PT0gJ3N0cmluZydcbiAgICAgID8gZFxuICAgICAgOiBpc1BsYWluT2JqZWN0KGQpXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KGQpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZClcbiAgICAgID8gYFske1N0cmluZyhkKX1dYFxuICAgICAgOiAnJyxcbiAgW0FMTF9GSUVMRF9UWVBFUy5nZW9hcnJvd106IGQgPT4gZCxcbiAgW0FMTF9GSUVMRF9UWVBFUy5vYmplY3RdOiBKU09OLnN0cmluZ2lmeSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5hcnJheV06IEpTT04uc3RyaW5naWZ5XG59O1xuXG4vKipcbiAqIFBhcnNlIGZpZWxkIHZhbHVlIGFuZCB0eXBlIGFuZCByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRmllbGRWYWx1ZSA9ICh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIEZJRUxEX0RJU1BMQVlfRk9STUFUW3R5cGVdID8gRklFTERfRElTUExBWV9GT1JNQVRbdHlwZV0odmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGFycmF5TW92ZU11dGF0ZSA9IDxUPihhcnJheTogVFtdLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgYXJyYXkuc3BsaWNlKHRvIDwgMCA/IGFycmF5Lmxlbmd0aCArIHRvIDogdG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gYXJyYXlcbiAqIEBwYXJhbSBmcm9tXG4gKiBAcGFyYW0gdG9cbiAqL1xuZXhwb3J0IGNvbnN0IGFycmF5TW92ZSA9IDxUPihhcnJheTogVFtdLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBUW10gPT4ge1xuICBhcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIGFycmF5TW92ZU11dGF0ZShhcnJheSwgZnJvbSwgdG8pO1xuICByZXR1cm4gYXJyYXk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9ybWF0IGJhc2VkIG9uIGZpZWxkIGFuZCBmb3JtYXQgb3B0aW9uc1xuICogVXNlZCBpbiByZW5kZXIgdG9vbHRpcCB2YWx1ZVxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoXG4gIGZvcm1hdDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZmllbGQ/OiBGaWVsZFxuKTogRmllbGRGb3JtYXR0ZXIge1xuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG4gIGNvbnN0IHRvb2x0aXBGb3JtYXQgPSBPYmplY3QudmFsdWVzKFRPT0xUSVBfRk9STUFUUykuZmluZChmID0+IGZbVE9PTFRJUF9LRVldID09PSBmb3JtYXQpO1xuXG4gIGlmICh0b29sdGlwRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5RGVmYXVsdEZvcm1hdCh0b29sdGlwRm9ybWF0IGFzIFRvb2x0aXBGb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmIGZpZWxkKSB7XG4gICAgcmV0dXJuIGFwcGx5Q3VzdG9tRm9ybWF0KGZvcm1hdCwgZmllbGQpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5Gb3JtYXR0ZXIoY29sTWV0YTogQ29sTWV0YVByb3BzKTogRmllbGRGb3JtYXR0ZXIge1xuICBjb25zdCB7Zm9ybWF0LCBkaXNwbGF5Rm9ybWF0fSA9IGNvbE1ldGE7XG5cbiAgaWYgKCFmb3JtYXQgJiYgIWRpc3BsYXlGb3JtYXQpIHtcbiAgICByZXR1cm4gRklFTERfRElTUExBWV9GT1JNQVRbY29sTWV0YS50eXBlXTtcbiAgfVxuICBjb25zdCB0b29sdGlwRm9ybWF0ID0gT2JqZWN0LnZhbHVlcyhUT09MVElQX0ZPUk1BVFMpLmZpbmQoZiA9PiBmW1RPT0xUSVBfS0VZXSA9PT0gZGlzcGxheUZvcm1hdCk7XG5cbiAgaWYgKHRvb2x0aXBGb3JtYXQpIHtcbiAgICByZXR1cm4gYXBwbHlEZWZhdWx0Rm9ybWF0KHRvb2x0aXBGb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkaXNwbGF5Rm9ybWF0ID09PSAnc3RyaW5nJyAmJiBjb2xNZXRhKSB7XG4gICAgcmV0dXJuIGFwcGx5Q3VzdG9tRm9ybWF0KGRpc3BsYXlGb3JtYXQsIGNvbE1ldGEpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkaXNwbGF5Rm9ybWF0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBhcHBseVZhbHVlTWFwKGRpc3BsYXlGb3JtYXQpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZhbHVlTWFwKGZvcm1hdCkge1xuICByZXR1cm4gdiA9PiBmb3JtYXRbdl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRGb3JtYXQodG9vbHRpcEZvcm1hdDogVG9vbHRpcEZvcm1hdCk6ICh2OiBhbnkpID0+IHN0cmluZyB7XG4gIGlmICghdG9vbHRpcEZvcm1hdCB8fCAhdG9vbHRpcEZvcm1hdC5mb3JtYXQpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZvcm1hdHRlcjtcbiAgfVxuXG4gIHN3aXRjaCAodG9vbHRpcEZvcm1hdC50eXBlKSB7XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5ERUNJTUFMOlxuICAgICAgcmV0dXJuIGQzRm9ybWF0KHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBjYXNlIFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEU6XG4gICAgY2FzZSBUT09MVElQX0ZPUk1BVF9UWVBFUy5EQVRFX1RJTUU6XG4gICAgICByZXR1cm4gZGF0ZXRpbWVGb3JtYXR0ZXIobnVsbCkodG9vbHRpcEZvcm1hdC5mb3JtYXQpO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuUEVSQ0VOVEFHRTpcbiAgICAgIHJldHVybiB2ID0+IGAke2QzRm9ybWF0KFRPT0xUSVBfRk9STUFUUy5ERUNJTUFMX0RFQ0lNQUxfRklYRURfMi5mb3JtYXQpKHYpfSVgO1xuICAgIGNhc2UgVE9PTFRJUF9GT1JNQVRfVFlQRVMuQk9PTEVBTjpcbiAgICAgIHJldHVybiBnZXRCb29sZWFuRm9ybWF0dGVyKHRvb2x0aXBGb3JtYXQuZm9ybWF0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXR0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5Gb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpOiBGaWVsZEZvcm1hdHRlciB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnMDEnOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICcxJyA6ICcwJyk7XG4gICAgY2FzZSAneW4nOlxuICAgICAgcmV0dXJuICh2OiBCb29sZWFuKSA9PiAodiA/ICd5ZXMnIDogJ25vJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICB9XG59XG4vLyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgY3VzdG9tIHRvb2x0aXAgZm9ybWF0IHZpYSBjb25maWdcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUN1c3RvbUZvcm1hdChmb3JtYXQsIGZpZWxkKTogRmllbGRGb3JtYXR0ZXIge1xuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICByZXR1cm4gZDNGb3JtYXQoZm9ybWF0KTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiBkYXRldGltZUZvcm1hdHRlcihudWxsKShmb3JtYXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdiA9PiB2O1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExhcmdlTnVtYmVyKG4pIHtcbiAgLy8gU0ktcHJlZml4IHdpdGggNCBzaWduaWZpY2FudCBkaWdpdHNcbiAgcmV0dXJuIGQzRm9ybWF0KCcuNH5zJykobik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIobjogbnVtYmVyLCB0eXBlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICAgIGlmIChuIDwgMCkge1xuICAgICAgICByZXR1cm4gYC0ke2Zvcm1hdE51bWJlcigtbiwgJ2ludGVnZXInKX1gO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAxMDAwKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG4pfWA7XG4gICAgICB9XG4gICAgICBpZiAobiA8IDEwICogMTAwMCkge1xuICAgICAgICByZXR1cm4gZDNGb3JtYXQoJywnKShNYXRoLnJvdW5kKG4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXRMYXJnZU51bWJlcihuKTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgIHJldHVybiBgLSR7Zm9ybWF0TnVtYmVyKC1uLCAnbnVtYmVyJyl9YDtcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMTAwMCkge1xuICAgICAgICByZXR1cm4gZDNGb3JtYXQoJy40fnInKShuKTtcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMTAgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiBkM0Zvcm1hdCgnLC4yfmYnKShuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXRMYXJnZU51bWJlcihuKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKG4sICdyZWFsJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgZXBvY2ggbWlsbGlzZWNvbmRzIHdpdGggYSBmb3JtYXQgc3RyaW5nXG4gKiBAdHlwZSB0aW1lem9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWVGb3JtYXR0ZXIoXG4gIHRpbWV6b25lPzogc3RyaW5nIHwgbnVsbFxuKTogKGZvcm1hdD86IHN0cmluZykgPT4gKHRzOiBudW1iZXIpID0+IHN0cmluZyB7XG4gIHJldHVybiB0aW1lem9uZVxuICAgID8gZm9ybWF0ID0+IHRzID0+XG4gICAgICAgIG1vbWVudFxuICAgICAgICAgIC51dGModHMpXG4gICAgICAgICAgLnR6KHRpbWV6b25lKVxuICAgICAgICAgIC5mb3JtYXQoZm9ybWF0KVxuICAgIDogLy8gcmV0dXJuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICdJbnZhbGlkIGRhdGUnIGlmIHRzIGlzIHVuZGVmaW5lZC9udWxsXG4gICAgICBmb3JtYXQgPT4gdHMgPT4gKHRzID8gbW9tZW50LnV0Yyh0cykuZm9ybWF0KGZvcm1hdCkgOiAnJyk7XG59XG4iXX0=
@@ -1,4 +1,5 @@
1
- import { ProcessorResult, RGBColor, RowData, Field, FieldPair } from '@kepler.gl/types';
1
+ import { ProcessorResult, RGBColor, RowData, Field, FieldPair, TooltipFields, ProtoDataset } from '@kepler.gl/types';
2
+ import { TooltipFormat } from '@kepler.gl/constants';
2
3
  export declare const datasetColorMaker: Generator<RGBColor, any, unknown>;
3
4
  /**
4
5
  * Choose a field to use as the default color field of a layer.
@@ -34,7 +35,7 @@ export declare const ACCEPTED_ANALYZER_TYPES: any[];
34
35
  /**
35
36
  * Validate input data, adding missing field types, rename duplicate columns
36
37
  */
37
- export declare function validateInputData(data: Record<string, unknown>): ProcessorResult;
38
+ export declare function validateInputData(data: ProtoDataset['data']): ProcessorResult;
38
39
  /**
39
40
  * Getting sample data for analyzing field type.
40
41
  */
@@ -43,6 +44,14 @@ export declare function getSampleForTypeAnalyze({ fields, rows, sampleCount }: {
43
44
  rows: unknown[][];
44
45
  sampleCount?: number;
45
46
  }): RowData;
47
+ /**
48
+ * Check if string is a valid Well-known binary (WKB) in HEX format
49
+ * https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
50
+ *
51
+ * @param str input string
52
+ * @returns true if string is a valid WKB in HEX format
53
+ */
54
+ export declare function isHexWkb(str: string | null): boolean;
46
55
  /**
47
56
  * Analyze field types from data in `string` format, e.g. uploaded csv.
48
57
  * Assign `type`, `fieldIdx` and `format` (timestamp only) to each field
@@ -103,3 +112,5 @@ export declare function renameDuplicateFields(fieldOrder: string[]): {
103
112
  * @returns corresponding type in `ALL_FIELD_TYPES`
104
113
  */
105
114
  export declare function analyzerTypeToFieldType(aType: string): string;
115
+ export declare function getFieldFormatLabels(fieldType?: string): TooltipFormat[];
116
+ export declare function getFormatLabels(fields: TooltipFields[], fieldName: string): TooltipFormat[];