kepler.gl 3.1.0 → 3.1.1

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 (234) hide show
  1. package/README.md +27 -132
  2. package/dist/src/common-utils/src/data-type.d.ts +9 -1
  3. package/dist/src/components/src/common/data-table/header-cell.d.ts +1 -0
  4. package/dist/src/components/src/common/data-table/index.d.ts +1 -0
  5. package/dist/src/components/src/common/file-uploader/file-drop.d.ts +1 -32
  6. package/dist/src/components/src/common/item-selector/dropdown-list.d.ts +2 -2
  7. package/dist/src/components/src/common/item-selector/item-selector.d.ts +1 -1
  8. package/dist/src/components/src/common/item-selector/typeahead.d.ts +1 -1
  9. package/dist/src/components/src/geocoder/geocoder.d.ts +7 -0
  10. package/dist/src/components/src/geocoder-panel.d.ts +2 -2
  11. package/dist/src/components/src/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  12. package/dist/src/constants/src/default-settings.d.ts +14 -1
  13. package/dist/src/deckgl-arrow-layers/src/constants.d.ts +0 -12
  14. package/dist/src/deckgl-arrow-layers/src/index.d.ts +0 -1
  15. package/dist/src/deckgl-arrow-layers/src/utils/utils.d.ts +12 -1
  16. package/dist/src/duckdb/src/components/preview-data-panel.d.ts +7 -2
  17. package/dist/src/duckdb/src/components/schema-panel.d.ts +12 -3
  18. package/dist/src/duckdb/src/processors/data-processor.d.ts +1 -0
  19. package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +106 -0
  20. package/dist/src/duckdb/src/table/duckdb-table.d.ts +5 -3
  21. package/dist/src/processors/src/data-processor.d.ts +15 -1
  22. package/dist/src/reducers/src/provider-state-updaters.d.ts +1 -0
  23. package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -1
  24. package/dist/src/table/src/dataset-utils.d.ts +1 -1
  25. package/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  26. package/dist/src/utils/src/application-config.d.ts +4 -3
  27. package/dist/src/utils/src/data-utils.d.ts +9 -3
  28. package/dist/src/utils/src/indexed-data-container.d.ts +2 -2
  29. package/dist/src/utils/src/map-style-utils/mapbox-utils.d.ts +1 -1
  30. package/dist/src/utils/src/map-utils.d.ts +1 -1
  31. package/dist/src/utils/src/plot.d.ts +2 -2
  32. package/package.json +5 -5
  33. package/src/actions/package.json +8 -8
  34. package/src/ai-assistant/dist/components/ai-assistant-component.js +2 -1
  35. package/src/ai-assistant/package.json +7 -7
  36. package/src/ai-assistant/src/components/ai-assistant-component.tsx +1 -0
  37. package/src/cloud-providers/package.json +2 -2
  38. package/src/common-utils/dist/data-type.d.ts +9 -1
  39. package/src/common-utils/dist/data-type.js +50 -1
  40. package/src/common-utils/package.json +3 -3
  41. package/src/common-utils/src/data-type.ts +49 -1
  42. package/src/components/dist/common/data-table/header-cell.d.ts +1 -0
  43. package/src/components/dist/common/data-table/header-cell.js +2 -2
  44. package/src/components/dist/common/data-table/index.d.ts +1 -0
  45. package/src/components/dist/common/data-table/index.js +5 -1
  46. package/src/components/dist/common/file-uploader/file-drop.d.ts +1 -32
  47. package/src/components/dist/common/file-uploader/file-drop.js +152 -167
  48. package/src/components/dist/common/item-selector/dropdown-list.d.ts +2 -2
  49. package/src/components/dist/common/item-selector/dropdown-list.js +2 -3
  50. package/src/components/dist/common/item-selector/item-selector.d.ts +1 -1
  51. package/src/components/dist/common/item-selector/typeahead.d.ts +1 -1
  52. package/src/components/dist/common/range-brush.js +3 -3
  53. package/src/components/dist/geocoder/geocoder.d.ts +7 -0
  54. package/src/components/dist/geocoder/geocoder.js +19 -11
  55. package/src/components/dist/geocoder-panel.d.ts +2 -2
  56. package/src/components/dist/geocoder-panel.js +64 -91
  57. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  58. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.js +35 -26
  59. package/src/components/dist/hooks/use-legend-position.js +8 -4
  60. package/src/components/dist/map/map-legend-panel.js +2 -3
  61. package/src/components/dist/modal-container.js +8 -8
  62. package/src/components/dist/modals/tilesets-modals/tileset-vector-form.js +31 -12
  63. package/src/components/dist/side-panel/layer-panel/color-palette-preset.js +2 -2
  64. package/src/components/dist/side-panel/layer-panel/color-range-selector.js +10 -11
  65. package/src/components/dist/side-panel/layer-panel/color-selector.js +3 -3
  66. package/src/components/dist/side-panel/layer-panel/custom-palette.js +1 -2
  67. package/src/components/dist/side-panel/layer-panel/layer-configurator.js +6 -8
  68. package/src/components/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +1 -2
  69. package/src/components/package.json +16 -16
  70. package/src/components/src/common/data-table/header-cell.tsx +2 -1
  71. package/src/components/src/common/data-table/index.tsx +4 -0
  72. package/src/components/src/common/file-uploader/file-drop.tsx +186 -161
  73. package/src/components/src/common/item-selector/dropdown-list.tsx +1 -6
  74. package/src/components/src/common/range-brush.tsx +2 -2
  75. package/src/components/src/geocoder/geocoder.tsx +16 -8
  76. package/src/components/src/geocoder-panel.tsx +95 -85
  77. package/src/components/src/hooks/use-fetch-vector-tile-metadata.ts +27 -25
  78. package/src/components/src/hooks/use-legend-position.ts +5 -2
  79. package/src/components/src/map/map-legend-panel.tsx +1 -2
  80. package/src/components/src/modal-container.tsx +7 -7
  81. package/src/components/src/modals/tilesets-modals/tileset-vector-form.tsx +12 -3
  82. package/src/components/src/side-panel/layer-panel/color-palette-preset.tsx +1 -1
  83. package/src/components/src/side-panel/layer-panel/color-range-selector.tsx +6 -11
  84. package/src/components/src/side-panel/layer-panel/color-selector.tsx +2 -2
  85. package/src/components/src/side-panel/layer-panel/custom-palette.tsx +0 -1
  86. package/src/components/src/side-panel/layer-panel/layer-configurator.tsx +23 -33
  87. package/src/components/src/side-panel/layer-panel/vector-tile-layer-configurator.tsx +0 -1
  88. package/src/constants/dist/default-settings.d.ts +14 -1
  89. package/src/constants/dist/default-settings.js +20 -5
  90. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/91/4f/6c65f3a1eba584ffd2d892cabc25ab5804d4a9ef53694c98707372a83e56343a274bec04f15927a6fe7602615f0f23f73ccf599f524ef97ad6c77c8832ea +1 -0
  91. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/a6/b2/5424aa4477192fb44cc90fd80892efdc96731f2ff0f48e8f28abf64243cc +2 -0
  92. package/src/constants/package.json +2 -2
  93. package/src/constants/src/default-settings.ts +16 -1
  94. package/src/constants/umd/keplergl.min.js +2 -2
  95. package/src/deckgl-arrow-layers/dist/constants.d.ts +0 -12
  96. package/src/deckgl-arrow-layers/dist/constants.js +4 -15
  97. package/src/deckgl-arrow-layers/dist/index.d.ts +0 -1
  98. package/src/deckgl-arrow-layers/dist/index.js +1 -8
  99. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-scatterplot-layer.js +4 -4
  100. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-text-layer.js +5 -5
  101. package/src/deckgl-arrow-layers/dist/utils/utils.d.ts +12 -1
  102. package/src/deckgl-arrow-layers/dist/utils/utils.js +7 -5
  103. package/src/deckgl-arrow-layers/package.json +2 -1
  104. package/src/deckgl-arrow-layers/src/constants.ts +0 -13
  105. package/src/deckgl-arrow-layers/src/index.ts +0 -2
  106. package/src/deckgl-arrow-layers/src/layers/geo-arrow-scatterplot-layer.ts +5 -3
  107. package/src/deckgl-arrow-layers/src/layers/geo-arrow-text-layer.ts +8 -4
  108. package/src/deckgl-arrow-layers/src/utils/utils.ts +7 -5
  109. package/src/deckgl-layers/dist/deckgl-extensions/filter-arrow-layer.d.ts +1 -1
  110. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.d.ts +1 -1
  111. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.js +3 -3
  112. package/src/deckgl-layers/package.json +5 -5
  113. package/src/deckgl-layers/src/deckgl-extensions/filter-shader-module.ts +4 -3
  114. package/src/duckdb/dist/components/monaco-editor.js +4 -5
  115. package/src/duckdb/dist/components/preview-data-panel.d.ts +7 -2
  116. package/src/duckdb/dist/components/preview-data-panel.js +7 -8
  117. package/src/duckdb/dist/components/schema-panel.d.ts +12 -3
  118. package/src/duckdb/dist/components/schema-panel.js +41 -24
  119. package/src/duckdb/dist/components/sql-panel.js +245 -56
  120. package/src/duckdb/dist/init.js +20 -14
  121. package/src/duckdb/dist/processors/data-processor.d.ts +1 -0
  122. package/src/duckdb/dist/processors/data-processor.js +4 -4
  123. package/src/duckdb/dist/table/duckdb-table-utils.d.ts +106 -0
  124. package/src/duckdb/dist/table/duckdb-table-utils.js +493 -2
  125. package/src/duckdb/dist/table/duckdb-table.d.ts +5 -3
  126. package/src/duckdb/dist/table/duckdb-table.js +153 -261
  127. package/src/duckdb/package.json +6 -6
  128. package/src/duckdb/src/components/monaco-editor.tsx +3 -3
  129. package/src/duckdb/src/components/preview-data-panel.tsx +15 -8
  130. package/src/duckdb/src/components/schema-panel.tsx +92 -21
  131. package/src/duckdb/src/components/sql-panel.tsx +160 -22
  132. package/src/duckdb/src/init.ts +4 -1
  133. package/src/duckdb/src/processors/data-processor.ts +2 -2
  134. package/src/duckdb/src/table/duckdb-table-utils.ts +407 -1
  135. package/src/duckdb/src/table/duckdb-table.ts +61 -92
  136. package/src/effects/package.json +5 -5
  137. package/src/layers/dist/arc-layer/arc-layer.d.ts +1 -1
  138. package/src/layers/dist/arc-layer/arc-layer.js +2 -3
  139. package/src/layers/dist/base-layer.d.ts +7 -6
  140. package/src/layers/dist/base-layer.js +36 -19
  141. package/src/layers/dist/geojson-layer/geojson-layer.js +4 -2
  142. package/src/layers/dist/geojson-layer/geojson-utils.js +10 -3
  143. package/src/layers/dist/heatmap-layer/heatmap-layer.d.ts +2 -0
  144. package/src/layers/dist/heatmap-layer/heatmap-layer.js +16 -9
  145. package/src/layers/dist/icon-layer/icon-layer.d.ts +6 -3
  146. package/src/layers/dist/icon-layer/icon-layer.js +19 -11
  147. package/src/layers/dist/index.d.ts +1 -1
  148. package/src/layers/dist/index.js +1 -1
  149. package/src/layers/dist/layer-text-label.d.ts +9 -0
  150. package/src/layers/dist/layer-text-label.js +51 -6
  151. package/src/layers/dist/layer-utils.d.ts +39 -30
  152. package/src/layers/dist/layer-utils.js +69 -9
  153. package/src/layers/dist/line-layer/line-layer.d.ts +1 -1
  154. package/src/layers/dist/line-layer/line-layer.js +2 -3
  155. package/src/layers/dist/point-layer/point-layer.d.ts +10 -7
  156. package/src/layers/dist/point-layer/point-layer.js +16 -8
  157. package/src/layers/dist/trip-layer/trip-layer.d.ts +2 -2
  158. package/src/layers/dist/trip-layer/trip-layer.js +4 -2
  159. package/src/layers/dist/vector-tile/abstract-tile-layer.d.ts +3 -7
  160. package/src/layers/dist/vector-tile/abstract-tile-layer.js +7 -6
  161. package/src/layers/dist/vector-tile/vector-tile-layer.d.ts +5 -7
  162. package/src/layers/dist/vector-tile/vector-tile-layer.js +23 -2
  163. package/src/layers/package.json +11 -10
  164. package/src/layers/src/arc-layer/arc-layer.ts +1 -1
  165. package/src/layers/src/base-layer.ts +50 -9
  166. package/src/layers/src/geojson-layer/geojson-layer.ts +3 -1
  167. package/src/layers/src/geojson-layer/geojson-utils.ts +4 -1
  168. package/src/layers/src/heatmap-layer/heatmap-layer.ts +17 -12
  169. package/src/layers/src/icon-layer/icon-layer.ts +7 -3
  170. package/src/layers/src/index.ts +1 -2
  171. package/src/layers/src/layer-text-label.ts +53 -4
  172. package/src/layers/src/layer-utils.ts +88 -9
  173. package/src/layers/src/line-layer/line-layer.ts +1 -1
  174. package/src/layers/src/point-layer/point-layer.ts +15 -11
  175. package/src/layers/src/trip-layer/trip-layer.ts +4 -2
  176. package/src/layers/src/vector-tile/abstract-tile-layer.ts +11 -5
  177. package/src/layers/src/vector-tile/vector-tile-layer.ts +33 -4
  178. package/src/localization/package.json +1 -1
  179. package/src/processors/dist/data-processor.d.ts +15 -1
  180. package/src/processors/dist/data-processor.js +104 -11
  181. package/src/processors/package.json +8 -7
  182. package/src/processors/src/data-processor.ts +116 -13
  183. package/src/reducers/dist/export-utils.js +2 -2
  184. package/src/reducers/dist/layer-utils.js +1 -1
  185. package/src/reducers/dist/provider-state-updaters.d.ts +1 -0
  186. package/src/reducers/dist/provider-state-updaters.js +5 -2
  187. package/src/reducers/dist/vis-state-updaters.d.ts +1 -1
  188. package/src/reducers/dist/vis-state-updaters.js +23 -12
  189. package/src/reducers/package.json +16 -16
  190. package/src/reducers/src/export-utils.ts +1 -1
  191. package/src/reducers/src/layer-utils.ts +2 -1
  192. package/src/reducers/src/provider-state-updaters.ts +4 -1
  193. package/src/reducers/src/vis-state-updaters.ts +45 -10
  194. package/src/schemas/dist/dataset-schema.js +35 -6
  195. package/src/schemas/package.json +7 -7
  196. package/src/schemas/src/dataset-schema.ts +36 -8
  197. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/a3/a9/7f26bbc52905b0e21e9366a30ef0ba98f4ccf9aa8dd8326d90ba90191ba2e305323f505bf134c825356156c793bf9386ed2cef2aeb48eb327c26d106f69a +1 -0
  198. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/7e/51/b8756555a0e2e696d944445ac23f7febf769006013fbc8419f39a701649d +2 -0
  199. package/src/styles/package.json +2 -2
  200. package/src/styles/umd/keplergl.min.js +2 -2
  201. package/src/table/dist/dataset-utils.js +23 -14
  202. package/src/table/dist/src/table/src/dataset-utils.d.ts +1 -1
  203. package/src/table/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  204. package/src/table/dist/tileset/vector-tile-utils.js +122 -2
  205. package/src/table/package.json +5 -5
  206. package/src/table/src/dataset-utils.ts +16 -6
  207. package/src/table/src/tileset/vector-tile-utils.ts +131 -8
  208. package/src/tasks/package.json +2 -2
  209. package/src/types/actions.d.ts +1 -0
  210. package/src/types/layers.d.ts +1 -0
  211. package/src/types/package.json +1 -1
  212. package/src/types/types.d.ts +17 -0
  213. package/src/utils/dist/application-config.d.ts +4 -3
  214. package/src/utils/dist/application-config.js +3 -2
  215. package/src/utils/dist/data-scale-utils.js +4 -4
  216. package/src/utils/dist/data-utils.d.ts +9 -3
  217. package/src/utils/dist/data-utils.js +40 -7
  218. package/src/utils/dist/dataset-utils.js +23 -8
  219. package/src/utils/dist/indexed-data-container.d.ts +2 -2
  220. package/src/utils/dist/indexed-data-container.js +1 -1
  221. package/src/utils/dist/map-style-utils/mapbox-utils.d.ts +1 -1
  222. package/src/utils/dist/map-style-utils/mapbox-utils.js +3 -3
  223. package/src/utils/dist/plot.d.ts +2 -2
  224. package/src/utils/dist/plot.js +6 -6
  225. package/src/utils/map-utils.spec.js +1 -2
  226. package/src/utils/package.json +5 -4
  227. package/src/utils/src/application-config.ts +11 -8
  228. package/src/utils/src/data-scale-utils.ts +3 -3
  229. package/src/utils/src/data-utils.ts +36 -7
  230. package/src/utils/src/dataset-utils.ts +41 -9
  231. package/src/utils/src/indexed-data-container.ts +1 -1
  232. package/src/utils/src/map-style-utils/mapbox-utils.ts +2 -2
  233. package/src/utils/src/plot.ts +5 -5
  234. package/umd/keplergl.min.js +1279 -1295
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.Processors = exports.PARSE_FIELD_VALUE_FROM_STRING = exports.DATASET_HANDLERS = exports.CSV_NULLS = void 0;
9
9
  exports.arrowSchemaToFields = arrowSchemaToFields;
10
+ exports.getGeoArrowMetadataFromSchema = getGeoArrowMetadataFromSchema;
10
11
  exports.parseCsvRowsByFieldType = parseCsvRowsByFieldType;
11
12
  exports.parseRowsByFields = parseRowsByFields;
12
13
  exports.processArrowBatches = processArrowBatches;
@@ -22,6 +23,8 @@ var arrow = _interopRequireWildcard(require("apache-arrow"));
22
23
  var _d3Dsv = require("d3-dsv");
23
24
  var _typeAnalyzer = require("type-analyzer");
24
25
  var _geojsonNormalize = _interopRequireDefault(require("@mapbox/geojson-normalize"));
26
+ var _core = require("@loaders.gl/core");
27
+ var _wkt = require("@loaders.gl/wkt");
25
28
  var _constants = require("@kepler.gl/constants");
26
29
  var _utils = require("@kepler.gl/utils");
27
30
  var _commonUtils = require("@kepler.gl/common-utils");
@@ -394,27 +397,114 @@ function processArrowTable(arrowTable) {
394
397
  // @ts-ignore - Unknown data type causing build failures
395
398
  return processArrowBatches(arrowTable.data.batches);
396
399
  }
397
- function arrowSchemaToFields(schema) {
398
- return schema.fields.map(function (field, index) {
400
+
401
+ /**
402
+ * Extracts GeoArrow metadata from an Apache Arrow table schema.
403
+ * For geoparquet files geoarrow metadata isn't present in fields, so extract extra info from schema.
404
+ * @param table The Apache Arrow table to extract metadata from.
405
+ * @returns An object mapping column names to their GeoArrow encoding type.
406
+ * @throws Logs an error message if parsing of metadata fails.
407
+ */
408
+ function getGeoArrowMetadataFromSchema(table) {
409
+ var geoArrowMetadata = {};
410
+ try {
411
+ var _table$schema$metadat;
412
+ var geoString = (_table$schema$metadat = table.schema.metadata) === null || _table$schema$metadat === void 0 ? void 0 : _table$schema$metadat.get('geo');
413
+ if (geoString) {
414
+ var parsedGeoString = JSON.parse(geoString);
415
+ if (parsedGeoString.columns) {
416
+ Object.keys(parsedGeoString.columns).forEach(function (columnName) {
417
+ var columnData = parsedGeoString.columns[columnName];
418
+ if ((columnData === null || columnData === void 0 ? void 0 : columnData.encoding) === 'WKB') {
419
+ geoArrowMetadata[columnName] = _constants.GEOARROW_EXTENSIONS.WKB;
420
+ }
421
+ // TODO potentially there are other types but no datasets to test
422
+ });
423
+ }
424
+ }
425
+ } catch (error) {
426
+ console.error('An error during arrow table schema metadata parsing');
427
+ }
428
+ return geoArrowMetadata;
429
+ }
430
+
431
+ /**
432
+ * Converts an Apache Arrow table schema into an array of Kepler.gl field objects.
433
+ * @param table The Apache Arrow table whose schema needs to be converted.
434
+ * @param fieldTypeSuggestions Optional mapping of field names to suggested field types.
435
+ * @returns An array of field objects suitable for Kepler.gl.
436
+ */
437
+ function arrowSchemaToFields(table) {
438
+ var fieldTypeSuggestions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
439
+ var headerRow = table.schema.fields.map(function (f) {
440
+ return f.name;
441
+ });
442
+ var sample = (0, _commonUtils.getSampleForTypeAnalyzeArrow)(table, headerRow);
443
+ var keplerFields = (0, _commonUtils.getFieldsFromData)(sample, headerRow);
444
+ var geoArrowMetadata = getGeoArrowMetadataFromSchema(table);
445
+ return table.schema.fields.map(function (field, fieldIndex) {
399
446
  var _field$metadata$get;
400
- var isGeoArrowColumn = (_field$metadata$get = field.metadata.get('ARROW:extension:name')) === null || _field$metadata$get === void 0 ? void 0 : _field$metadata$get.startsWith('geoarrow');
447
+ var type = (0, _utils.arrowDataTypeToFieldType)(field.type);
448
+ var analyzerType = (0, _utils.arrowDataTypeToAnalyzerDataType)(field.type);
449
+ var format = '';
450
+
451
+ // geometry fields produced by DuckDB's st_asgeojson()
452
+ if (fieldTypeSuggestions[field.name] === 'JSON') {
453
+ type = _constants.ALL_FIELD_TYPES.geojson;
454
+ analyzerType = _typeAnalyzer.DATA_TYPES.GEOMETRY_FROM_STRING;
455
+ } else if (fieldTypeSuggestions[field.name] === 'GEOMETRY' || (_field$metadata$get = field.metadata.get(_constants.GEOARROW_METADATA_KEY)) !== null && _field$metadata$get !== void 0 && _field$metadata$get.startsWith('geoarrow')) {
456
+ type = _constants.ALL_FIELD_TYPES.geoarrow;
457
+ analyzerType = _typeAnalyzer.DATA_TYPES.GEOMETRY;
458
+ } else if (geoArrowMetadata[field.name]) {
459
+ var _field$metadata;
460
+ type = _constants.ALL_FIELD_TYPES.geoarrow;
461
+ analyzerType = _typeAnalyzer.DATA_TYPES.GEOMETRY;
462
+ (_field$metadata = field.metadata) === null || _field$metadata === void 0 || _field$metadata.set(_constants.GEOARROW_METADATA_KEY, geoArrowMetadata[field.name]);
463
+ } else if (fieldTypeSuggestions[field.name] === 'BLOB') {
464
+ // When arrow wkb column saved to DuckDB as BLOB without any metadata, then queried back
465
+ try {
466
+ var _table$getChildAt;
467
+ var data = (_table$getChildAt = table.getChildAt(fieldIndex)) === null || _table$getChildAt === void 0 ? void 0 : _table$getChildAt.get(0);
468
+ if (data) {
469
+ var binaryGeo = (0, _core.parseSync)(data, _wkt.WKBLoader);
470
+ if (binaryGeo) {
471
+ var _field$metadata2;
472
+ type = _constants.ALL_FIELD_TYPES.geoarrow;
473
+ analyzerType = _typeAnalyzer.DATA_TYPES.GEOMETRY;
474
+ (_field$metadata2 = field.metadata) === null || _field$metadata2 === void 0 || _field$metadata2.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.WKB);
475
+ }
476
+ }
477
+ } catch (error) {
478
+ // ignore, not WKB
479
+ }
480
+ } else {
481
+ // TODO should we use Kepler getFieldsFromData instead
482
+ // of arrowDataTypeToFieldType for all fields?
483
+ var keplerField = keplerFields[fieldIndex];
484
+ if (keplerField.type === _constants.ALL_FIELD_TYPES.timestamp) {
485
+ type = keplerField.type;
486
+ analyzerType = keplerField.analyzerType;
487
+ format = keplerField.format;
488
+ }
489
+ }
401
490
  return _objectSpread(_objectSpread({}, field), {}, {
402
491
  name: field.name,
403
492
  id: field.name,
404
493
  displayName: field.name,
405
- format: '',
406
- fieldIdx: index,
407
- type: isGeoArrowColumn ? _constants.ALL_FIELD_TYPES.geoarrow : (0, _utils.arrowDataTypeToFieldType)(field.type),
408
- analyzerType: isGeoArrowColumn ? _typeAnalyzer.DATA_TYPES.GEOMETRY : (0, _utils.arrowDataTypeToAnalyzerDataType)(field.type),
494
+ format: format,
495
+ fieldIdx: fieldIndex,
496
+ type: type,
497
+ analyzerType: analyzerType,
409
498
  valueAccessor: function valueAccessor(dc) {
410
499
  return function (d) {
411
- return dc.valueAt(d.index, index);
500
+ return dc.valueAt(d.index, fieldIndex);
412
501
  };
413
502
  },
414
503
  metadata: field.metadata
415
504
  });
416
505
  });
417
506
  }
507
+
418
508
  /**
419
509
  * Parse arrow batches returned from parseInBatches()
420
510
  *
@@ -426,7 +516,7 @@ function processArrowBatches(arrowBatches) {
426
516
  return null;
427
517
  }
428
518
  var arrowTable = new arrow.Table(arrowBatches);
429
- var fields = arrowSchemaToFields(arrowTable.schema);
519
+ var fields = arrowSchemaToFields(arrowTable);
430
520
  var cols = (0, _toConsumableArray2["default"])(Array(arrowTable.numCols).keys()).map(function (i) {
431
521
  return arrowTable.getChildAt(i);
432
522
  });
@@ -436,7 +526,10 @@ function processArrowBatches(arrowBatches) {
436
526
  fields: fields,
437
527
  rows: [],
438
528
  cols: cols,
439
- metadata: arrowTable.schema.metadata
529
+ metadata: arrowTable.schema.metadata,
530
+ // Save original arrow schema, for better ingestion into DuckDB.
531
+ // TODO consider returning arrowTable in cols, not an array of Vectors from arrowTable.
532
+ arrowSchema: arrowTable.schema
440
533
  };
441
534
  }
442
535
  var DATASET_HANDLERS = exports.DATASET_HANDLERS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.DATASET_FORMATS.row, processRowObject), _constants.DATASET_FORMATS.geojson, processGeojson), _constants.DATASET_FORMATS.csv, processCsvData), _constants.DATASET_FORMATS.arrow, processArrowTable), _constants.DATASET_FORMATS.keplergl, processKeplerglDataset);
@@ -452,4 +545,4 @@ var Processors = exports.Processors = {
452
545
  getFieldsFromData: _commonUtils.getFieldsFromData,
453
546
  parseCsvRowsByFieldType: parseCsvRowsByFieldType
454
547
  };
455
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9kM0RzdiIsIl90eXBlQW5hbHl6ZXIiLCJfZ2VvanNvbk5vcm1hbGl6ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2NvbW1vblV0aWxzIiwiX3NjaGVtYXMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJDU1ZfTlVMTFMiLCJleHBvcnRzIiwidHJ5UGFyc2VKc29uU3RyaW5nIiwic3RyIiwiSlNPTiIsInBhcnNlIiwiUEFSU0VfRklFTERfVkFMVUVfRlJPTV9TVFJJTkciLCJBTExfRklFTERfVFlQRVMiLCJ2YWxpZCIsImQiLCJpbnRlZ2VyIiwicGFyc2VJbnQiLCJ0aW1lc3RhbXAiLCJmaWVsZCIsImluY2x1ZGVzIiwiZm9ybWF0IiwiTnVtYmVyIiwicmVhbCIsInBhcnNlRmxvYXQiLCJvYmplY3QiLCJpc1BsYWluT2JqZWN0IiwiYXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJoMyIsImgzSXNWYWxpZCIsInByb2Nlc3NDc3ZEYXRhIiwicmF3RGF0YSIsImhlYWRlciIsInJvd3MiLCJoZWFkZXJSb3ciLCJwYXJzZWRSb3dzIiwiY3N2UGFyc2VSb3dzIiwiRXJyb3IiLCJzbGljZSIsImNsZWFuVXBGYWxzeUNzdlZhbHVlIiwic2FtcGxlIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJmaWVsZHMiLCJnZXRGaWVsZHNGcm9tRGF0YSIsInBhcnNlUm93c0J5RmllbGRzIiwiZ2VvanNvbkZpZWxkSWR4IiwiZmluZEluZGV4IiwiZiIsIm5hbWUiLCJwYXJzZUNzdlJvd3NCeUZpZWxkVHlwZSIsImJpbmQiLCJyZSIsIlJlZ0V4cCIsImoiLCJtYXRjaCIsImdlb0ZpZWxkSWR4IiwicGFyc2VyIiwidHlwZSIsImZpcnN0IiwiZmluZCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInJvdyIsInByb3BlcnRpZXMiLCJwcm9jZXNzUm93T2JqZWN0IiwibWFwIiwia2V5IiwicHJvY2Vzc0dlb2pzb24iLCJub3JtYWxpemVkR2VvanNvbiIsIm5vcm1hbGl6ZSIsImZlYXR1cmVzIiwiY29uY2F0IiwiR1VJREVTX0ZJTEVfRk9STUFUX0RPQyIsImFsbERhdGFSb3dzIiwiZ2VvbWV0cnkiLCJfZ2VvanNvbiIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwicHJvY2Vzc0tlcGxlcmdsSlNPTiIsInNjaGVtYSIsInVuZGVmaW5lZCIsIktlcGxlckdsU2NoZW1hIiwibG9hZCIsImRhdGFzZXRzIiwiY29uZmlnIiwicHJvY2Vzc0tlcGxlcmdsRGF0YXNldCIsInJlc3VsdHMiLCJwYXJzZVNhdmVkRGF0YSIsInRvQXJyYXkiLCJwcm9jZXNzQXJyb3dUYWJsZSIsImFycm93VGFibGUiLCJwcm9jZXNzQXJyb3dCYXRjaGVzIiwiZGF0YSIsImJhdGNoZXMiLCJhcnJvd1NjaGVtYVRvRmllbGRzIiwiaW5kZXgiLCJfZmllbGQkbWV0YWRhdGEkZ2V0IiwiaXNHZW9BcnJvd0NvbHVtbiIsIm1ldGFkYXRhIiwic3RhcnRzV2l0aCIsImlkIiwiZGlzcGxheU5hbWUiLCJmaWVsZElkeCIsImdlb2Fycm93IiwiYXJyb3dEYXRhVHlwZVRvRmllbGRUeXBlIiwiYW5hbHl6ZXJUeXBlIiwiQW5hbHl6ZXJEQVRBX1RZUEVTIiwiR0VPTUVUUlkiLCJhcnJvd0RhdGFUeXBlVG9BbmFseXplckRhdGFUeXBlIiwidmFsdWVBY2Nlc3NvciIsImRjIiwidmFsdWVBdCIsImFycm93QmF0Y2hlcyIsIlRhYmxlIiwiY29scyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJudW1Db2xzIiwiZ2V0Q2hpbGRBdCIsIkRBVEFTRVRfSEFORExFUlMiLCJEQVRBU0VUX0ZPUk1BVFMiLCJnZW9qc29uIiwiY3N2Iiwia2VwbGVyZ2wiLCJQcm9jZXNzb3JzIiwiYW5hbHl6ZXJUeXBlVG9GaWVsZFR5cGUiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YS1wcm9jZXNzb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7Y3N2UGFyc2VSb3dzfSBmcm9tICdkMy1kc3YnO1xuaW1wb3J0IHtEQVRBX1RZUEVTIGFzIEFuYWx5emVyREFUQV9UWVBFU30gZnJvbSAndHlwZS1hbmFseXplcic7XG5pbXBvcnQgbm9ybWFsaXplIGZyb20gJ0BtYXBib3gvZ2VvanNvbi1ub3JtYWxpemUnO1xuaW1wb3J0IHtBcnJvd1RhYmxlfSBmcm9tICdAbG9hZGVycy5nbC9zY2hlbWEnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIERBVEFTRVRfRk9STUFUUywgR1VJREVTX0ZJTEVfRk9STUFUX0RPQ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtQcm9jZXNzb3JSZXN1bHQsIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIGFycm93RGF0YVR5cGVUb0FuYWx5emVyRGF0YVR5cGUsXG4gIGFycm93RGF0YVR5cGVUb0ZpZWxkVHlwZSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGlzUGxhaW5PYmplY3Rcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge1xuICBhbmFseXplclR5cGVUb0ZpZWxkVHlwZSxcbiAgZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUsXG4gIGdldEZpZWxkc0Zyb21EYXRhLFxuICBoM0lzVmFsaWQsXG4gIG5vdE51bGxvclVuZGVmaW5lZCxcbiAgdG9BcnJheVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0tlcGxlckdsU2NoZW1hLCBQYXJzZWREYXRhc2V0LCBTYXZlZE1hcCwgTG9hZGVkTWFwfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtGZWF0dXJlfSBmcm9tICdAbmVidWxhLmdsL2VkaXQtbW9kZXMnO1xuXG4vLyBpZiBhbnkgb2YgdGhlc2UgdmFsdWUgb2NjdXJzIGluIGNzdiwgcGFyc2UgaXQgdG8gbnVsbDtcbi8vIGNvbnN0IENTVl9OVUxMUyA9IFsnJywgJ251bGwnLCAnTlVMTCcsICdOdWxsJywgJ05hTicsICcvTiddO1xuLy8gbWF0Y2hlcyBlbXB0eSBzdHJpbmdcbmV4cG9ydCBjb25zdCBDU1ZfTlVMTFMgPSAvXihudWxsfE5VTEx8TnVsbHxOYU58XFwvTnx8KSQvO1xuXG5mdW5jdGlvbiB0cnlQYXJzZUpzb25TdHJpbmcoc3RyKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQQVJTRV9GSUVMRF9WQUxVRV9GUk9NX1NUUklORyA9IHtcbiAgW0FMTF9GSUVMRF9UWVBFUy5ib29sZWFuXToge1xuICAgIHZhbGlkOiAoZDogdW5rbm93bik6IGJvb2xlYW4gPT4gdHlwZW9mIGQgPT09ICdib29sZWFuJyxcbiAgICBwYXJzZTogKGQ6IHVua25vd24pOiBib29sZWFuID0+IGQgPT09ICd0cnVlJyB8fCBkID09PSAnVHJ1ZScgfHwgZCA9PT0gJ1RSVUUnIHx8IGQgPT09ICcxJ1xuICB9LFxuICBbQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJdOiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhbGlkOiAoZDogdW5rbm93bik6IGJvb2xlYW4gPT4gcGFyc2VJbnQoZCwgMTApID09PSBkLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwYXJzZTogKGQ6IHVua25vd24pOiBudW1iZXIgPT4gcGFyc2VJbnQoZCwgMTApXG4gIH0sXG4gIFtBTExfRklFTERfVFlQRVMudGltZXN0YW1wXToge1xuICAgIHZhbGlkOiAoZDogdW5rbm93biwgZmllbGQ6IEZpZWxkKTogYm9vbGVhbiA9PlxuICAgICAgWyd4JywgJ1gnXS5pbmNsdWRlcyhmaWVsZC5mb3JtYXQpID8gdHlwZW9mIGQgPT09ICdudW1iZXInIDogdHlwZW9mIGQgPT09ICdzdHJpbmcnLFxuICAgIHBhcnNlOiAoZDogYW55LCBmaWVsZDogRmllbGQpID0+IChbJ3gnLCAnWCddLmluY2x1ZGVzKGZpZWxkLmZvcm1hdCkgPyBOdW1iZXIoZCkgOiBkKVxuICB9LFxuICBbQUxMX0ZJRUxEX1RZUEVTLnJlYWxdOiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhbGlkOiAoZDogdW5rbm93bik6IGJvb2xlYW4gPT4gcGFyc2VGbG9hdChkKSA9PT0gZCxcbiAgICAvLyBOb3RlIHRoaXMgd2lsbCByZXN1bHQgaW4gTmFOIGZvciBzb21lIHN0cmluZ1xuICAgIHBhcnNlOiBwYXJzZUZsb2F0XG4gIH0sXG4gIFtBTExfRklFTERfVFlQRVMub2JqZWN0XToge1xuICAgIHZhbGlkOiBpc1BsYWluT2JqZWN0LFxuICAgIHBhcnNlOiB0cnlQYXJzZUpzb25TdHJpbmdcbiAgfSxcblxuICBbQUxMX0ZJRUxEX1RZUEVTLmFycmF5XToge1xuICAgIHZhbGlkOiBBcnJheS5pc0FycmF5LFxuICAgIHBhcnNlOiB0cnlQYXJzZUpzb25TdHJpbmdcbiAgfSxcblxuICBbQUxMX0ZJRUxEX1RZUEVTLmgzXToge1xuICAgIHZhbGlkOiBkID0+IGgzSXNWYWxpZChkKSxcbiAgICBwYXJzZTogZCA9PiBkXG4gIH1cbn07XG5cbi8qKlxuICogUHJvY2VzcyBjc3YgZGF0YSwgb3V0cHV0IGEgZGF0YSBvYmplY3Qgd2l0aCBge2ZpZWxkczogW10sIHJvd3M6IFtdfWAuXG4gKiBUaGUgZGF0YSBvYmplY3QgY2FuIGJlIHdyYXBwZWQgaW4gYSBgZGF0YXNldGAgYW5kIHBhc3MgdG8gW2BhZGREYXRhVG9NYXBgXSguLi9hY3Rpb25zL2FjdGlvbnMubWQjYWRkZGF0YXRvbWFwKVxuICogQHBhcmFtIHJhd0RhdGEgcmF3IGNzdiBzdHJpbmdcbiAqIEByZXR1cm5zIGRhdGEgb2JqZWN0IGB7ZmllbGRzOiBbXSwgcm93czogW119YCBjYW4gYmUgcGFzc2VkIHRvIGFkZERhdGFUb01hcHNcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge3Byb2Nlc3NDc3ZEYXRhfSBmcm9tICdrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG4gKlxuICogY29uc3QgdGVzdERhdGEgPSBgZ3BzX2RhdGEudXRjX3RpbWVzdGFtcCxncHNfZGF0YS5sYXQsZ3BzX2RhdGEubG5nLGdwc19kYXRhLnR5cGVzLGVwb2NoLGhhc19yZXN1bHQsaWQsdGltZSxiZWdpbnRyaXBfdHNfdXRjLGJlZ2ludHJpcF90c19sb2NhbCxkYXRlXG4gKiAyMDE2LTA5LTE3IDAwOjA5OjU1LDI5Ljk5MDA5MzcsMzEuMjU5MDU0Mixkcml2ZXJfYW5hbHl0aWNzLDE0NzI2ODgwMDAwMDAsRmFsc2UsMSwyMDE2LTA5LTIzVDAwOjAwOjAwLjAwMFosMjAxNi0xMC0wMSAwOTo0MTozOSswMDowMCwyMDE2LTEwLTAxIDA5OjQxOjM5KzAwOjAwLDIwMTYtMDktMjNcbiAqIDIwMTYtMDktMTcgMDA6MTA6NTYsMjkuOTkyNzY5OSwzMS4yNDYxMTQyLGRyaXZlcl9hbmFseXRpY3MsMTQ3MjY4ODAwMDAwMCxGYWxzZSwyLDIwMTYtMDktMjNUMDA6MDA6MDAuMDAwWiwyMDE2LTEwLTAxIDA5OjQ2OjM3KzAwOjAwLDIwMTYtMTAtMDEgMTY6NDY6MzcrMDA6MDAsMjAxNi0wOS0yM1xuICogMjAxNi0wOS0xNyAwMDoxMTo1NiwyOS45OTA3MjYxLDMxLjIzMTI3NDIsZHJpdmVyX2FuYWx5dGljcywxNDcyNjg4MDAwMDAwLEZhbHNlLDMsMjAxNi0wOS0yM1QwMDowMDowMC4wMDBaLCwsMjAxNi0wOS0yM1xuICogMjAxNi0wOS0xNyAwMDoxMjo1OCwyOS45ODcwMDc0LDMxLjIxNzU4MjcsZHJpdmVyX2FuYWx5dGljcywxNDcyNjg4MDAwMDAwLEZhbHNlLDQsMjAxNi0wOS0yM1QwMDowMDowMC4wMDBaLCwsMjAxNi0wOS0yM2BcbiAqXG4gKiBjb25zdCBkYXRhc2V0ID0ge1xuICogIGluZm86IHtpZDogJ3Rlc3RfZGF0YScsIGxhYmVsOiAnTXkgQ3N2J30sXG4gKiAgZGF0YTogcHJvY2Vzc0NzdkRhdGEodGVzdERhdGEpXG4gKiB9O1xuICpcbiAqIGRpc3BhdGNoKGFkZERhdGFUb01hcCh7XG4gKiAgZGF0YXNldHM6IFtkYXRhc2V0XSxcbiAqICBvcHRpb25zOiB7Y2VudGVyTWFwOiB0cnVlLCByZWFkT25seTogdHJ1ZX1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NDc3ZEYXRhKHJhd0RhdGE6IHVua25vd25bXVtdIHwgc3RyaW5nLCBoZWFkZXI/OiBzdHJpbmdbXSk6IFByb2Nlc3NvclJlc3VsdCB7XG4gIGxldCByb3dzOiB1bmtub3duW11bXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGhlYWRlclJvdzogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKHR5cGVvZiByYXdEYXRhID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlZFJvd3M6IHN0cmluZ1tdW10gPSBjc3ZQYXJzZVJvd3MocmF3RGF0YSk7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkUm93cykgfHwgcGFyc2VkUm93cy5sZW5ndGggPCAyKSB7XG4gICAgICAvLyBsb29rcyBsaWtlIGFuIGVtcHR5IGZpbGUsIHRocm93IGVycm9yIHRvIGJlIGNhdGNoXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MgQ3N2IERhdGEgRmFpbGVkOiBDU1YgaXMgZW1wdHknKTtcbiAgICB9XG4gICAgaGVhZGVyUm93ID0gcGFyc2VkUm93c1swXTtcbiAgICByb3dzID0gcGFyc2VkUm93cy5zbGljZSgxKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJhd0RhdGEpICYmIHJhd0RhdGEubGVuZ3RoKSB7XG4gICAgcm93cyA9IHJhd0RhdGE7XG4gICAgaGVhZGVyUm93ID0gaGVhZGVyO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhlYWRlclJvdykpIHtcbiAgICAgIC8vIGlmIGRhdGEgaXMgcGFzc2VkIGluIGFzIGFycmF5IG9mIHJvd3MgYW5kIG1pc3NpbmcgaGVhZGVyXG4gICAgICAvLyBhc3N1bWUgZmlyc3Qgcm93IGlzIGhlYWRlclxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaGVhZGVyUm93ID0gcmF3RGF0YVswXTtcbiAgICAgIHJvd3MgPSByYXdEYXRhLnNsaWNlKDEpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcm93cyB8fCAhaGVhZGVyUm93KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGlucHV0IHBhc3NlZCB0byBwcm9jZXNzQ3N2RGF0YScpO1xuICB9XG5cbiAgLy8gaGVyZSB3ZSBhc3N1bWUgdGhlIGNzdiBmaWxlIHRoYXQgcGVvcGxlIHVwbG9hZGVkIHdpbGwgaGF2ZSBmaXJzdCByb3dcbiAgLy8gYXMgbmFtZSBvZiB0aGUgY29sdW1uXG5cbiAgY2xlYW5VcEZhbHN5Q3N2VmFsdWUocm93cyk7XG4gIC8vIE5vIG5lZWQgdG8gcnVuIHR5cGUgZGV0ZWN0aW9uIG9uIGV2ZXJ5IGRhdGEgcG9pbnRcbiAgLy8gaGVyZSB3ZSBnZXQgYSBsaXN0IG9mIG5vbmUgbnVsbCB2YWx1ZXMgdG8gcnVuIGFuYWx5emUgb25cbiAgY29uc3Qgc2FtcGxlID0gZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUoe2ZpZWxkczogaGVhZGVyUm93LCByb3dzfSk7XG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkc0Zyb21EYXRhKHNhbXBsZSwgaGVhZGVyUm93KTtcbiAgY29uc3QgcGFyc2VkUm93cyA9IHBhcnNlUm93c0J5RmllbGRzKHJvd3MsIGZpZWxkcyk7XG5cbiAgcmV0dXJuIHtmaWVsZHMsIHJvd3M6IHBhcnNlZFJvd3N9O1xufVxuXG4vKipcbiAqIFBhcnNlIHJvd3Mgb2YgY3N2IGJ5IGFuYWx5emVkIGZpZWxkIHR5cGVzLiBTbyB0aGF0IGAnMSdgIC0+IGAxYCwgYCdUcnVlJ2AgLT4gYHRydWVgXG4gKiBAcGFyYW0gcm93c1xuICogQHBhcmFtIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSb3dzQnlGaWVsZHMocm93czogYW55W11bXSwgZmllbGRzOiBGaWVsZFtdKSB7XG4gIC8vIEVkaXQgcm93cyBpbiBwbGFjZVxuICBjb25zdCBnZW9qc29uRmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSAnX2dlb2pzb24nKTtcbiAgZmllbGRzLmZvckVhY2gocGFyc2VDc3ZSb3dzQnlGaWVsZFR5cGUuYmluZChudWxsLCByb3dzLCBnZW9qc29uRmllbGRJZHgpKTtcblxuICByZXR1cm4gcm93cztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGZhbHN5IHZhbHVlIGluIGNzdiBpbmNsdWRpbmcgYCcnLCAnbnVsbCcsICdOVUxMJywgJ051bGwnLCAnTmFOJ2AgdG8gYG51bGxgLFxuICogc28gdGhhdCB0eXBlLWFuYWx5emVyIHdvbid0IGRldGVjdCBpdCBhcyBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gcm93c1xuICovXG5mdW5jdGlvbiBjbGVhblVwRmFsc3lDc3ZWYWx1ZShyb3dzOiB1bmtub3duW11bXSk6IHZvaWQge1xuICBjb25zdCByZSA9IG5ldyBSZWdFeHAoQ1NWX05VTExTLCAnZycpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvd3NbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIC8vIGFuYWx5emVyIHdpbGwgc2V0IGFueSBmaWVsZHMgdG8gJ3N0cmluZycgaWYgdGhlcmUgYXJlIGVtcHR5IHZhbHVlc1xuICAgICAgLy8gd2hpY2ggd2lsbCBiZSBwYXJzZWQgYXMgJycgYnkgZDMuY3N2XG4gICAgICAvLyBoZXJlIHdlIHBhcnNlIGVtcHR5IGRhdGEgYXMgbnVsbFxuICAgICAgLy8gVE9ETzogY3JlYXRlIHdhcm5pbmcgd2hlbiBkZWx0ZWN0IGBDU1ZfTlVMTFNgIGluIHRoZSBkYXRhXG4gICAgICBpZiAodHlwZW9mIHJvd3NbaV1bal0gPT09ICdzdHJpbmcnICYmIChyb3dzW2ldW2pdIGFzIHN0cmluZykubWF0Y2gocmUpKSB7XG4gICAgICAgIHJvd3NbaV1bal0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3MgdXBsb2FkZWQgY3N2IGZpbGUgdG8gcGFyc2UgdmFsdWUgYnkgZmllbGQgdHlwZVxuICpcbiAqIEBwYXJhbSByb3dzXG4gKiBAcGFyYW0gZ2VvRmllbGRJZHggZmllbGQgaW5kZXhcbiAqIEBwYXJhbSBmaWVsZFxuICogQHBhcmFtIGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3N2Um93c0J5RmllbGRUeXBlKFxuICByb3dzOiB1bmtub3duW11bXSxcbiAgZ2VvRmllbGRJZHg6IG51bWJlcixcbiAgZmllbGQ6IEZpZWxkLFxuICBpOiBudW1iZXJcbik6IHZvaWQge1xuICBjb25zdCBwYXJzZXIgPSBQQVJTRV9GSUVMRF9WQUxVRV9GUk9NX1NUUklOR1tmaWVsZC50eXBlXTtcbiAgaWYgKHBhcnNlcikge1xuICAgIC8vIGNoZWNrIGZpcnN0IG5vdCBudWxsIHZhbHVlIG9mIGl0J3MgYWxyZWFkeSBwYXJzZWRcbiAgICBjb25zdCBmaXJzdCA9IHJvd3MuZmluZChyID0+IG5vdE51bGxvclVuZGVmaW5lZChyW2ldKSk7XG4gICAgaWYgKCFmaXJzdCB8fCBwYXJzZXIudmFsaWQoZmlyc3RbaV0sIGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgIC8vIHBhcnNlIHN0cmluZyB2YWx1ZSBiYXNlZCBvbiBmaWVsZCB0eXBlXG4gICAgICBpZiAocm93W2ldICE9PSBudWxsKSB7XG4gICAgICAgIHJvd1tpXSA9IHBhcnNlci5wYXJzZShyb3dbaV0sIGZpZWxkKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdlb0ZpZWxkSWR4ID4gLTEgJiZcbiAgICAgICAgICBpc1BsYWluT2JqZWN0KHJvd1tnZW9GaWVsZElkeF0pICYmXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGhhc093blByb3BlcnR5KHJvd1tnZW9GaWVsZElkeF0sICdwcm9wZXJ0aWVzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHJvd1tnZW9GaWVsZElkeF0ucHJvcGVydGllc1tmaWVsZC5uYW1lXSA9IHJvd1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4vKipcbiAqIFByb2Nlc3MgZGF0YSB3aGVyZSBlYWNoIHJvdyBpcyBhbiBvYmplY3QsIG91dHB1dCBjYW4gYmUgcGFzc2VkIHRvIFtgYWRkRGF0YVRvTWFwYF0oLi4vYWN0aW9ucy9hY3Rpb25zLm1kI2FkZGRhdGF0b21hcClcbiAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gbWF5IG11dGF0ZSBpbnB1dC5cbiAqIEBwYXJhbSByYXdEYXRhIGFuIGFycmF5IG9mIHJvdyBvYmplY3QsIGVhY2ggb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzXG4gKiBAcmV0dXJucyBkYXRhc2V0IGNvbnRhaW5pbmcgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdrZXBsZXIuZ2wvYWN0aW9ucyc7XG4gKiBpbXBvcnQge3Byb2Nlc3NSb3dPYmplY3R9IGZyb20gJ2tlcGxlci5nbC9wcm9jZXNzb3JzJztcbiAqXG4gKiBjb25zdCBkYXRhID0gW1xuICogIHtsYXQ6IDMxLjI3LCBsbmc6IDEyNy41NiwgdmFsdWU6IDN9LFxuICogIHtsYXQ6IDMxLjIyLCBsbmc6IDEyNi4yNiwgdmFsdWU6IDF9XG4gKiBdO1xuICpcbiAqIGRpc3BhdGNoKGFkZERhdGFUb01hcCh7XG4gKiAgZGF0YXNldHM6IHtcbiAqICAgIGluZm86IHtsYWJlbDogJ015IERhdGEnLCBpZDogJ215X2RhdGEnfSxcbiAqICAgIGRhdGE6IHByb2Nlc3NSb3dPYmplY3QoZGF0YSlcbiAqICB9XG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzUm93T2JqZWN0KHJhd0RhdGE6IHVua25vd25bXSk6IFByb2Nlc3NvclJlc3VsdCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdEYXRhKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKCFyYXdEYXRhLmxlbmd0aCkge1xuICAgIC8vIGRhdGEgaXMgZW1wdHlcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIHJvd3M6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyYXdEYXRhWzBdKTsgLy8gW2xhdCwgbG5nLCB2YWx1ZV1cbiAgY29uc3Qgcm93cyA9IHJhd0RhdGEubWFwKGQgPT4ga2V5cy5tYXAoa2V5ID0+IGRba2V5XSkpOyAvLyBbWzMxLjI3LCAxMjcuNTYsIDNdXVxuXG4gIC8vIHJvdyBvYmplY3QgY2FuIHN0aWxsIGNvbnRhaW4gdmFsdWVzIGxpa2UgYE51bGxgIG9yIGBOL0FgXG4gIGNsZWFuVXBGYWxzeUNzdlZhbHVlKHJvd3MpO1xuXG4gIHJldHVybiBwcm9jZXNzQ3N2RGF0YShyb3dzLCBrZXlzKTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIEdlb0pTT04gW2BGZWF0dXJlQ29sbGVjdGlvbmBdKGh0dHA6Ly93aWtpLmdlb2pzb24ub3JnL0dlb0pTT05fZHJhZnRfdmVyc2lvbl82I0ZlYXR1cmVDb2xsZWN0aW9uKSxcbiAqIG91dHB1dCBhIGRhdGEgb2JqZWN0IHdpdGggYHtmaWVsZHM6IFtdLCByb3dzOiBbXX1gLlxuICogVGhlIGRhdGEgb2JqZWN0IGNhbiBiZSB3cmFwcGVkIGluIGEgYGRhdGFzZXRgIGFuZCBwYXNzZWQgdG8gW2BhZGREYXRhVG9NYXBgXSguLi9hY3Rpb25zL2FjdGlvbnMubWQjYWRkZGF0YXRvbWFwKVxuICogTk9URTogVGhpcyBmdW5jdGlvbiBtYXkgbXV0YXRlIGlucHV0LlxuICpcbiAqIEBwYXJhbSByYXdEYXRhIHJhdyBnZW9qc29uIGZlYXR1cmUgY29sbGVjdGlvblxuICogQHJldHVybnMgZGF0YXNldCBjb250YWluaW5nIGBmaWVsZHNgIGFuZCBgcm93c2BcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge2FkZERhdGFUb01hcH0gZnJvbSAna2VwbGVyLmdsL2FjdGlvbnMnO1xuICogaW1wb3J0IHtwcm9jZXNzR2VvanNvbn0gZnJvbSAna2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuICpcbiAqIGNvbnN0IGdlb2pzb24gPSB7XG4gKiBcdFwidHlwZVwiIDogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogXHRcImZlYXR1cmVzXCIgOiBbe1xuICogXHRcdFwidHlwZVwiIDogXCJGZWF0dXJlXCIsXG4gKiBcdFx0XCJwcm9wZXJ0aWVzXCIgOiB7XG4gKiBcdFx0XHRcImNhcGFjaXR5XCIgOiBcIjEwXCIsXG4gKiBcdFx0XHRcInR5cGVcIiA6IFwiVS1SYWNrXCJcbiAqIFx0XHR9LFxuICogXHRcdFwiZ2VvbWV0cnlcIiA6IHtcbiAqIFx0XHRcdFwidHlwZVwiIDogXCJQb2ludFwiLFxuICogXHRcdFx0XCJjb29yZGluYXRlc1wiIDogWyAtNzEuMDczMjgzLCA0Mi40MTc1MDAgXVxuICogXHRcdH1cbiAqIFx0fV1cbiAqIH07XG4gKlxuICogZGlzcGF0Y2goYWRkRGF0YVRvTWFwKHtcbiAqICBkYXRhc2V0czoge1xuICogICAgaW5mbzoge1xuICogICAgICBsYWJlbDogJ1NhbXBsZSBUYXhpIFRyaXBzIGluIE5ldyBZb3JrIENpdHknLFxuICogICAgICBpZDogJ3Rlc3RfdHJpcF9kYXRhJ1xuICogICAgfSxcbiAqICAgIGRhdGE6IHByb2Nlc3NHZW9qc29uKGdlb2pzb24pXG4gKiAgfVxuICogfSkpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0dlb2pzb24ocmF3RGF0YTogdW5rbm93bik6IFByb2Nlc3NvclJlc3VsdCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRHZW9qc29uID0gbm9ybWFsaXplKHJhd0RhdGEpO1xuXG4gIGlmICghbm9ybWFsaXplZEdlb2pzb24gfHwgIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZEdlb2pzb24uZmVhdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFJlYWQgRmlsZSBGYWlsZWQ6IEZpbGUgaXMgbm90IGEgdmFsaWQgR2VvSlNPTi4gUmVhZCBtb3JlIGFib3V0IFtzdXBwb3J0ZWQgZmlsZSBmb3JtYXRdKCR7R1VJREVTX0ZJTEVfRk9STUFUX0RPQ30pYFxuICAgICk7XG4gIH1cblxuICAvLyBnZXR0aW5nIGFsbCBmZWF0dXJlIGZpZWxkc1xuICBjb25zdCBhbGxEYXRhUm93czogQXJyYXk8e19nZW9qc29uOiBGZWF0dXJlfSAmIGtleW9mIEZlYXR1cmU+ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9ybWFsaXplZEdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmID0gbm9ybWFsaXplZEdlb2pzb24uZmVhdHVyZXNbaV07XG4gICAgaWYgKGYuZ2VvbWV0cnkpIHtcbiAgICAgIGFsbERhdGFSb3dzLnB1c2goe1xuICAgICAgICAvLyBhZGQgZmVhdHVyZSB0byBfZ2VvanNvbiBmaWVsZFxuICAgICAgICBfZ2VvanNvbjogZixcbiAgICAgICAgLi4uKGYucHJvcGVydGllcyB8fCB7fSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvLyBnZXQgYWxsIHRoZSBmaWVsZFxuICBjb25zdCBmaWVsZHMgPSBhbGxEYXRhUm93cy5yZWR1Y2U8c3RyaW5nW10+KChhY2N1LCBjdXJyKSA9PiB7XG4gICAgT2JqZWN0LmtleXMoY3VycikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKCFhY2N1LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgYWNjdS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIFtdKTtcblxuICAvLyBtYWtlIHN1cmUgZWFjaCBmZWF0dXJlIGhhcyBleGFjdCBzYW1lIGZpZWxkc1xuICBhbGxEYXRhUm93cy5mb3JFYWNoKGQgPT4ge1xuICAgIGZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKCEoZiBpbiBkKSkge1xuICAgICAgICBkW2ZdID0gbnVsbDtcbiAgICAgICAgaWYgKGQuX2dlb2pzb24ucHJvcGVydGllcykge1xuICAgICAgICAgIGQuX2dlb2pzb24ucHJvcGVydGllc1tmXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb2Nlc3NSb3dPYmplY3QoYWxsRGF0YVJvd3MpO1xufVxuXG4vKipcbiAqIFByb2Nlc3Mgc2F2ZWQga2VwbGVyLmdsIGpzb24gdG8gYmUgcGFzcyB0byBbYGFkZERhdGFUb01hcGBdKC4uL2FjdGlvbnMvYWN0aW9ucy5tZCNhZGRkYXRhdG9tYXApLlxuICogVGhlIGpzb24gb2JqZWN0IHNob3VsZCBjb250YWluIGBkYXRhc2V0c2AgYW5kIGBjb25maWdgLlxuICogQHBhcmFtIHJhd0RhdGFcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm5zIGRhdGFzZXRzIGFuZCBjb25maWcgYHtkYXRhc2V0czoge30sIGNvbmZpZzoge319YFxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdrZXBsZXIuZ2wvYWN0aW9ucyc7XG4gKiBpbXBvcnQge3Byb2Nlc3NLZXBsZXJnbEpTT059IGZyb20gJ2tlcGxlci5nbC9wcm9jZXNzb3JzJztcbiAqXG4gKiBkaXNwYXRjaChhZGREYXRhVG9NYXAocHJvY2Vzc0tlcGxlcmdsSlNPTihrZXBsZXJHbEpzb24pKSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzS2VwbGVyZ2xKU09OKHJhd0RhdGE6IFNhdmVkTWFwLCBzY2hlbWEgPSBLZXBsZXJHbFNjaGVtYSk6IExvYWRlZE1hcCB8IG51bGwge1xuICByZXR1cm4gcmF3RGF0YSA/IHNjaGVtYS5sb2FkKHJhd0RhdGEuZGF0YXNldHMsIHJhd0RhdGEuY29uZmlnKSA6IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgb3IgYW4gYXJyYXkgb2YgZGF0YXNldHMgc2F2ZWQgdXNpbmcga2VwbGVyLmdsIHNjaGVtYVxuICogQHBhcmFtIHJhd0RhdGFcbiAqIEBwYXJhbSBzY2hlbWFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NLZXBsZXJnbERhdGFzZXQoXG4gIHJhd0RhdGE6IG9iamVjdCB8IG9iamVjdFtdLFxuICBzY2hlbWEgPSBLZXBsZXJHbFNjaGVtYVxuKTogUGFyc2VkRGF0YXNldCB8IFBhcnNlZERhdGFzZXRbXSB8IG51bGwge1xuICBpZiAoIXJhd0RhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdHMgPSBzY2hlbWEucGFyc2VTYXZlZERhdGEodG9BcnJheShyYXdEYXRhKSk7XG4gIGlmICghcmVzdWx0cykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJhd0RhdGEpID8gcmVzdWx0cyA6IHJlc3VsdHNbMF07XG59XG5cbi8qKlxuICogUGFyc2UgYXJyb3cgdGFibGUgYW5kIHJldHVybiBhIGRhdGFzZXRcbiAqXG4gKiBAcGFyYW0gYXJyb3dUYWJsZSBBcnJvd1RhYmxlIHRvIHBhcnNlLCBzZWUgbG9hZGVycy5nbC9zY2hlbWFcbiAqIEByZXR1cm5zIGRhdGFzZXQgY29udGFpbmluZyBgZmllbGRzYCBhbmQgYHJvd3NgIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBcnJvd1RhYmxlKGFycm93VGFibGU6IEFycm93VGFibGUpOiBQcm9jZXNzb3JSZXN1bHQgfCBudWxsIHtcbiAgLy8gQHRzLWlnbm9yZSAtIFVua25vd24gZGF0YSB0eXBlIGNhdXNpbmcgYnVpbGQgZmFpbHVyZXNcbiAgcmV0dXJuIHByb2Nlc3NBcnJvd0JhdGNoZXMoYXJyb3dUYWJsZS5kYXRhLmJhdGNoZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyb3dTY2hlbWFUb0ZpZWxkcyhzY2hlbWE6IGFycm93LlNjaGVtYSk6IEZpZWxkW10ge1xuICByZXR1cm4gc2NoZW1hLmZpZWxkcy5tYXAoKGZpZWxkOiBhcnJvdy5GaWVsZCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGlzR2VvQXJyb3dDb2x1bW4gPSBmaWVsZC5tZXRhZGF0YS5nZXQoJ0FSUk9XOmV4dGVuc2lvbjpuYW1lJyk/LnN0YXJ0c1dpdGgoJ2dlb2Fycm93Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgbmFtZTogZmllbGQubmFtZSxcbiAgICAgIGlkOiBmaWVsZC5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICBmb3JtYXQ6ICcnLFxuICAgICAgZmllbGRJZHg6IGluZGV4LFxuICAgICAgdHlwZTogaXNHZW9BcnJvd0NvbHVtbiA/IEFMTF9GSUVMRF9UWVBFUy5nZW9hcnJvdyA6IGFycm93RGF0YVR5cGVUb0ZpZWxkVHlwZShmaWVsZC50eXBlKSxcbiAgICAgIGFuYWx5emVyVHlwZTogaXNHZW9BcnJvd0NvbHVtblxuICAgICAgICA/IEFuYWx5emVyREFUQV9UWVBFUy5HRU9NRVRSWVxuICAgICAgICA6IGFycm93RGF0YVR5cGVUb0FuYWx5emVyRGF0YVR5cGUoZmllbGQudHlwZSksXG4gICAgICB2YWx1ZUFjY2Vzc29yOiAoZGM6IGFueSkgPT4gZCA9PiB7XG4gICAgICAgIHJldHVybiBkYy52YWx1ZUF0KGQuaW5kZXgsIGluZGV4KTtcbiAgICAgIH0sXG4gICAgICBtZXRhZGF0YTogZmllbGQubWV0YWRhdGFcbiAgICB9O1xuICB9KTtcbn1cbi8qKlxuICogUGFyc2UgYXJyb3cgYmF0Y2hlcyByZXR1cm5lZCBmcm9tIHBhcnNlSW5CYXRjaGVzKClcbiAqXG4gKiBAcGFyYW0gYXJyb3dUYWJsZSB0aGUgYXJyb3cgdGFibGUgdG8gcGFyc2VcbiAqIEByZXR1cm5zIGRhdGFzZXQgY29udGFpbmluZyBgZmllbGRzYCBhbmQgYHJvd3NgIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBcnJvd0JhdGNoZXMoYXJyb3dCYXRjaGVzOiBhcnJvdy5SZWNvcmRCYXRjaFtdKTogUHJvY2Vzc29yUmVzdWx0IHwgbnVsbCB7XG4gIGlmIChhcnJvd0JhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYXJyb3dUYWJsZSA9IG5ldyBhcnJvdy5UYWJsZShhcnJvd0JhdGNoZXMpO1xuICBjb25zdCBmaWVsZHMgPSBhcnJvd1NjaGVtYVRvRmllbGRzKGFycm93VGFibGUuc2NoZW1hKTtcblxuICBjb25zdCBjb2xzID0gWy4uLkFycmF5KGFycm93VGFibGUubnVtQ29scykua2V5cygpXS5tYXAoaSA9PiBhcnJvd1RhYmxlLmdldENoaWxkQXQoaSkpO1xuXG4gIC8vIHJldHVybiBlbXB0eSByb3dzIGFuZCB1c2UgcmF3IGFycm93IHRhYmxlIHRvIGNvbnN0cnVjdCBjb2x1bW4td2lzZSBkYXRhIGNvbnRhaW5lclxuICByZXR1cm4ge2ZpZWxkcywgcm93czogW10sIGNvbHMsIG1ldGFkYXRhOiBhcnJvd1RhYmxlLnNjaGVtYS5tZXRhZGF0YX07XG59XG5cbmV4cG9ydCBjb25zdCBEQVRBU0VUX0hBTkRMRVJTID0ge1xuICBbREFUQVNFVF9GT1JNQVRTLnJvd106IHByb2Nlc3NSb3dPYmplY3QsXG4gIFtEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbl06IHByb2Nlc3NHZW9qc29uLFxuICBbREFUQVNFVF9GT1JNQVRTLmNzdl06IHByb2Nlc3NDc3ZEYXRhLFxuICBbREFUQVNFVF9GT1JNQVRTLmFycm93XTogcHJvY2Vzc0Fycm93VGFibGUsXG4gIFtEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2xdOiBwcm9jZXNzS2VwbGVyZ2xEYXRhc2V0XG59O1xuXG5leHBvcnQgY29uc3QgUHJvY2Vzc29yczoge1xuICBwcm9jZXNzR2VvanNvbjogdHlwZW9mIHByb2Nlc3NHZW9qc29uO1xuICBwcm9jZXNzQ3N2RGF0YTogdHlwZW9mIHByb2Nlc3NDc3ZEYXRhO1xuICBwcm9jZXNzQXJyb3dUYWJsZTogdHlwZW9mIHByb2Nlc3NBcnJvd1RhYmxlO1xuICBwcm9jZXNzQXJyb3dCYXRjaGVzOiB0eXBlb2YgcHJvY2Vzc0Fycm93QmF0Y2hlcztcbiAgcHJvY2Vzc1Jvd09iamVjdDogdHlwZW9mIHByb2Nlc3NSb3dPYmplY3Q7XG4gIHByb2Nlc3NLZXBsZXJnbEpTT046IHR5cGVvZiBwcm9jZXNzS2VwbGVyZ2xKU09OO1xuICBwcm9jZXNzS2VwbGVyZ2xEYXRhc2V0OiB0eXBlb2YgcHJvY2Vzc0tlcGxlcmdsRGF0YXNldDtcbiAgYW5hbHl6ZXJUeXBlVG9GaWVsZFR5cGU6IHR5cGVvZiBhbmFseXplclR5cGVUb0ZpZWxkVHlwZTtcbiAgZ2V0RmllbGRzRnJvbURhdGE6IHR5cGVvZiBnZXRGaWVsZHNGcm9tRGF0YTtcbiAgcGFyc2VDc3ZSb3dzQnlGaWVsZFR5cGU6IHR5cGVvZiBwYXJzZUNzdlJvd3NCeUZpZWxkVHlwZTtcbn0gPSB7XG4gIHByb2Nlc3NHZW9qc29uLFxuICBwcm9jZXNzQ3N2RGF0YSxcbiAgcHJvY2Vzc0Fycm93VGFibGUsXG4gIHByb2Nlc3NBcnJvd0JhdGNoZXMsXG4gIHByb2Nlc3NSb3dPYmplY3QsXG4gIHByb2Nlc3NLZXBsZXJnbEpTT04sXG4gIHByb2Nlc3NLZXBsZXJnbERhdGFzZXQsXG4gIGFuYWx5emVyVHlwZVRvRmllbGRUeXBlLFxuICBnZXRGaWVsZHNGcm9tRGF0YSxcbiAgcGFyc2VDc3ZSb3dzQnlGaWVsZFR5cGVcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsYUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUVBLElBQUFLLFVBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQU1BLElBQUFPLFlBQUEsR0FBQVAsT0FBQTtBQVFBLElBQUFRLFFBQUEsR0FBQVIsT0FBQTtBQUFzRixTQUFBUyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVgsd0JBQUFXLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FB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
548
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9kM0RzdiIsIl90eXBlQW5hbHl6ZXIiLCJfZ2VvanNvbk5vcm1hbGl6ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29yZSIsIl93a3QiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2NvbW1vblV0aWxzIiwiX3NjaGVtYXMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJDU1ZfTlVMTFMiLCJleHBvcnRzIiwidHJ5UGFyc2VKc29uU3RyaW5nIiwic3RyIiwiSlNPTiIsInBhcnNlIiwiUEFSU0VfRklFTERfVkFMVUVfRlJPTV9TVFJJTkciLCJBTExfRklFTERfVFlQRVMiLCJ2YWxpZCIsImQiLCJpbnRlZ2VyIiwicGFyc2VJbnQiLCJ0aW1lc3RhbXAiLCJmaWVsZCIsImluY2x1ZGVzIiwiZm9ybWF0IiwiTnVtYmVyIiwicmVhbCIsInBhcnNlRmxvYXQiLCJvYmplY3QiLCJpc1BsYWluT2JqZWN0IiwiYXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJoMyIsImgzSXNWYWxpZCIsInByb2Nlc3NDc3ZEYXRhIiwicmF3RGF0YSIsImhlYWRlciIsInJvd3MiLCJoZWFkZXJSb3ciLCJwYXJzZWRSb3dzIiwiY3N2UGFyc2VSb3dzIiwiRXJyb3IiLCJzbGljZSIsImNsZWFuVXBGYWxzeUNzdlZhbHVlIiwic2FtcGxlIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJmaWVsZHMiLCJnZXRGaWVsZHNGcm9tRGF0YSIsInBhcnNlUm93c0J5RmllbGRzIiwiZ2VvanNvbkZpZWxkSWR4IiwiZmluZEluZGV4IiwiZiIsIm5hbWUiLCJwYXJzZUNzdlJvd3NCeUZpZWxkVHlwZSIsImJpbmQiLCJyZSIsIlJlZ0V4cCIsImoiLCJtYXRjaCIsImdlb0ZpZWxkSWR4IiwicGFyc2VyIiwidHlwZSIsImZpcnN0IiwiZmluZCIsIm5vdE51bGxvclVuZGVmaW5lZCIsInJvdyIsInByb3BlcnRpZXMiLCJwcm9jZXNzUm93T2JqZWN0IiwibWFwIiwia2V5IiwicHJvY2Vzc0dlb2pzb24iLCJub3JtYWxpemVkR2VvanNvbiIsIm5vcm1hbGl6ZSIsImZlYXR1cmVzIiwiY29uY2F0IiwiR1VJREVTX0ZJTEVfRk9STUFUX0RPQyIsImFsbERhdGFSb3dzIiwiZ2VvbWV0cnkiLCJfZ2VvanNvbiIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwicHJvY2Vzc0tlcGxlcmdsSlNPTiIsInNjaGVtYSIsInVuZGVmaW5lZCIsIktlcGxlckdsU2NoZW1hIiwibG9hZCIsImRhdGFzZXRzIiwiY29uZmlnIiwicHJvY2Vzc0tlcGxlcmdsRGF0YXNldCIsInJlc3VsdHMiLCJwYXJzZVNhdmVkRGF0YSIsInRvQXJyYXkiLCJwcm9jZXNzQXJyb3dUYWJsZSIsImFycm93VGFibGUiLCJwcm9jZXNzQXJyb3dCYXRjaGVzIiwiZGF0YSIsImJhdGNoZXMiLCJnZXRHZW9BcnJvd01ldGFkYXRhRnJvbVNjaGVtYSIsInRhYmxlIiwiZ2VvQXJyb3dNZXRhZGF0YSIsIl90YWJsZSRzY2hlbWEkbWV0YWRhdCIsImdlb1N0cmluZyIsIm1ldGFkYXRhIiwicGFyc2VkR2VvU3RyaW5nIiwiY29sdW1ucyIsImNvbHVtbk5hbWUiLCJjb2x1bW5EYXRhIiwiZW5jb2RpbmciLCJHRU9BUlJPV19FWFRFTlNJT05TIiwiV0tCIiwiZXJyb3IiLCJjb25zb2xlIiwiYXJyb3dTY2hlbWFUb0ZpZWxkcyIsImZpZWxkVHlwZVN1Z2dlc3Rpb25zIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emVBcnJvdyIsImtlcGxlckZpZWxkcyIsImZpZWxkSW5kZXgiLCJfZmllbGQkbWV0YWRhdGEkZ2V0IiwiYXJyb3dEYXRhVHlwZVRvRmllbGRUeXBlIiwiYW5hbHl6ZXJUeXBlIiwiYXJyb3dEYXRhVHlwZVRvQW5hbHl6ZXJEYXRhVHlwZSIsImdlb2pzb24iLCJBbmFseXplckRBVEFfVFlQRVMiLCJHRU9NRVRSWV9GUk9NX1NUUklORyIsIkdFT0FSUk9XX01FVEFEQVRBX0tFWSIsInN0YXJ0c1dpdGgiLCJnZW9hcnJvdyIsIkdFT01FVFJZIiwiX2ZpZWxkJG1ldGFkYXRhIiwiX3RhYmxlJGdldENoaWxkQXQiLCJnZXRDaGlsZEF0IiwiYmluYXJ5R2VvIiwicGFyc2VTeW5jIiwiV0tCTG9hZGVyIiwiX2ZpZWxkJG1ldGFkYXRhMiIsImtlcGxlckZpZWxkIiwiaWQiLCJkaXNwbGF5TmFtZSIsImZpZWxkSWR4IiwidmFsdWVBY2Nlc3NvciIsImRjIiwidmFsdWVBdCIsImluZGV4IiwiYXJyb3dCYXRjaGVzIiwiVGFibGUiLCJjb2xzIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIm51bUNvbHMiLCJhcnJvd1NjaGVtYSIsIkRBVEFTRVRfSEFORExFUlMiLCJEQVRBU0VUX0ZPUk1BVFMiLCJjc3YiLCJrZXBsZXJnbCIsIlByb2Nlc3NvcnMiLCJhbmFseXplclR5cGVUb0ZpZWxkVHlwZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXByb2Nlc3Nvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IHtjc3ZQYXJzZVJvd3N9IGZyb20gJ2QzLWRzdic7XG5pbXBvcnQge0RBVEFfVFlQRVMgYXMgQW5hbHl6ZXJEQVRBX1RZUEVTfSBmcm9tICd0eXBlLWFuYWx5emVyJztcbmltcG9ydCBub3JtYWxpemUgZnJvbSAnQG1hcGJveC9nZW9qc29uLW5vcm1hbGl6ZSc7XG5pbXBvcnQge3BhcnNlU3luY30gZnJvbSAnQGxvYWRlcnMuZ2wvY29yZSc7XG5pbXBvcnQge0Fycm93VGFibGV9IGZyb20gJ0Bsb2FkZXJzLmdsL3NjaGVtYSc7XG5pbXBvcnQge1dLQkxvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvd2t0JztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBEQVRBU0VUX0ZPUk1BVFMsXG4gIEdFT0FSUk9XX0VYVEVOU0lPTlMsXG4gIEdFT0FSUk9XX01FVEFEQVRBX0tFWSxcbiAgR1VJREVTX0ZJTEVfRk9STUFUX0RPQ1xufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1Byb2Nlc3NvclJlc3VsdCwgRmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtcbiAgYXJyb3dEYXRhVHlwZVRvQW5hbHl6ZXJEYXRhVHlwZSxcbiAgYXJyb3dEYXRhVHlwZVRvRmllbGRUeXBlLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaXNQbGFpbk9iamVjdFxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7XG4gIGFuYWx5emVyVHlwZVRvRmllbGRUeXBlLFxuICBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSxcbiAgZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emVBcnJvdyxcbiAgZ2V0RmllbGRzRnJvbURhdGEsXG4gIGgzSXNWYWxpZCxcbiAgbm90TnVsbG9yVW5kZWZpbmVkLFxuICB0b0FycmF5XG59IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7S2VwbGVyR2xTY2hlbWEsIFBhcnNlZERhdGFzZXQsIFNhdmVkTWFwLCBMb2FkZWRNYXB9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge0ZlYXR1cmV9IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5cbi8vIGlmIGFueSBvZiB0aGVzZSB2YWx1ZSBvY2N1cnMgaW4gY3N2LCBwYXJzZSBpdCB0byBudWxsO1xuLy8gY29uc3QgQ1NWX05VTExTID0gWycnLCAnbnVsbCcsICdOVUxMJywgJ051bGwnLCAnTmFOJywgJy9OJ107XG4vLyBtYXRjaGVzIGVtcHR5IHN0cmluZ1xuZXhwb3J0IGNvbnN0IENTVl9OVUxMUyA9IC9eKG51bGx8TlVMTHxOdWxsfE5hTnxcXC9OfHwpJC87XG5cbmZ1bmN0aW9uIHRyeVBhcnNlSnNvblN0cmluZyhzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBBUlNFX0ZJRUxEX1ZBTFVFX0ZST01fU1RSSU5HID0ge1xuICBbQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW5dOiB7XG4gICAgdmFsaWQ6IChkOiB1bmtub3duKTogYm9vbGVhbiA9PiB0eXBlb2YgZCA9PT0gJ2Jvb2xlYW4nLFxuICAgIHBhcnNlOiAoZDogdW5rbm93bik6IGJvb2xlYW4gPT4gZCA9PT0gJ3RydWUnIHx8IGQgPT09ICdUcnVlJyB8fCBkID09PSAnVFJVRScgfHwgZCA9PT0gJzEnXG4gIH0sXG4gIFtBTExfRklFTERfVFlQRVMuaW50ZWdlcl06IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdmFsaWQ6IChkOiB1bmtub3duKTogYm9vbGVhbiA9PiBwYXJzZUludChkLCAxMCkgPT09IGQsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHBhcnNlOiAoZDogdW5rbm93bik6IG51bWJlciA9PiBwYXJzZUludChkLCAxMClcbiAgfSxcbiAgW0FMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXBdOiB7XG4gICAgdmFsaWQ6IChkOiB1bmtub3duLCBmaWVsZDogRmllbGQpOiBib29sZWFuID0+XG4gICAgICBbJ3gnLCAnWCddLmluY2x1ZGVzKGZpZWxkLmZvcm1hdCkgPyB0eXBlb2YgZCA9PT0gJ251bWJlcicgOiB0eXBlb2YgZCA9PT0gJ3N0cmluZycsXG4gICAgcGFyc2U6IChkOiBhbnksIGZpZWxkOiBGaWVsZCkgPT4gKFsneCcsICdYJ10uaW5jbHVkZXMoZmllbGQuZm9ybWF0KSA/IE51bWJlcihkKSA6IGQpXG4gIH0sXG4gIFtBTExfRklFTERfVFlQRVMucmVhbF06IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdmFsaWQ6IChkOiB1bmtub3duKTogYm9vbGVhbiA9PiBwYXJzZUZsb2F0KGQpID09PSBkLFxuICAgIC8vIE5vdGUgdGhpcyB3aWxsIHJlc3VsdCBpbiBOYU4gZm9yIHNvbWUgc3RyaW5nXG4gICAgcGFyc2U6IHBhcnNlRmxvYXRcbiAgfSxcbiAgW0FMTF9GSUVMRF9UWVBFUy5vYmplY3RdOiB7XG4gICAgdmFsaWQ6IGlzUGxhaW5PYmplY3QsXG4gICAgcGFyc2U6IHRyeVBhcnNlSnNvblN0cmluZ1xuICB9LFxuXG4gIFtBTExfRklFTERfVFlQRVMuYXJyYXldOiB7XG4gICAgdmFsaWQ6IEFycmF5LmlzQXJyYXksXG4gICAgcGFyc2U6IHRyeVBhcnNlSnNvblN0cmluZ1xuICB9LFxuXG4gIFtBTExfRklFTERfVFlQRVMuaDNdOiB7XG4gICAgdmFsaWQ6IGQgPT4gaDNJc1ZhbGlkKGQpLFxuICAgIHBhcnNlOiBkID0+IGRcbiAgfVxufTtcblxuLyoqXG4gKiBQcm9jZXNzIGNzdiBkYXRhLCBvdXRwdXQgYSBkYXRhIG9iamVjdCB3aXRoIGB7ZmllbGRzOiBbXSwgcm93czogW119YC5cbiAqIFRoZSBkYXRhIG9iamVjdCBjYW4gYmUgd3JhcHBlZCBpbiBhIGBkYXRhc2V0YCBhbmQgcGFzcyB0byBbYGFkZERhdGFUb01hcGBdKC4uL2FjdGlvbnMvYWN0aW9ucy5tZCNhZGRkYXRhdG9tYXApXG4gKiBAcGFyYW0gcmF3RGF0YSByYXcgY3N2IHN0cmluZ1xuICogQHJldHVybnMgZGF0YSBvYmplY3QgYHtmaWVsZHM6IFtdLCByb3dzOiBbXX1gIGNhbiBiZSBwYXNzZWQgdG8gYWRkRGF0YVRvTWFwc1xuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7cHJvY2Vzc0NzdkRhdGF9IGZyb20gJ2tlcGxlci5nbC9wcm9jZXNzb3JzJztcbiAqXG4gKiBjb25zdCB0ZXN0RGF0YSA9IGBncHNfZGF0YS51dGNfdGltZXN0YW1wLGdwc19kYXRhLmxhdCxncHNfZGF0YS5sbmcsZ3BzX2RhdGEudHlwZXMsZXBvY2gsaGFzX3Jlc3VsdCxpZCx0aW1lLGJlZ2ludHJpcF90c191dGMsYmVnaW50cmlwX3RzX2xvY2FsLGRhdGVcbiAqIDIwMTYtMDktMTcgMDA6MDk6NTUsMjkuOTkwMDkzNywzMS4yNTkwNTQyLGRyaXZlcl9hbmFseXRpY3MsMTQ3MjY4ODAwMDAwMCxGYWxzZSwxLDIwMTYtMDktMjNUMDA6MDA6MDAuMDAwWiwyMDE2LTEwLTAxIDA5OjQxOjM5KzAwOjAwLDIwMTYtMTAtMDEgMDk6NDE6MzkrMDA6MDAsMjAxNi0wOS0yM1xuICogMjAxNi0wOS0xNyAwMDoxMDo1NiwyOS45OTI3Njk5LDMxLjI0NjExNDIsZHJpdmVyX2FuYWx5dGljcywxNDcyNjg4MDAwMDAwLEZhbHNlLDIsMjAxNi0wOS0yM1QwMDowMDowMC4wMDBaLDIwMTYtMTAtMDEgMDk6NDY6MzcrMDA6MDAsMjAxNi0xMC0wMSAxNjo0NjozNyswMDowMCwyMDE2LTA5LTIzXG4gKiAyMDE2LTA5LTE3IDAwOjExOjU2LDI5Ljk5MDcyNjEsMzEuMjMxMjc0Mixkcml2ZXJfYW5hbHl0aWNzLDE0NzI2ODgwMDAwMDAsRmFsc2UsMywyMDE2LTA5LTIzVDAwOjAwOjAwLjAwMFosLCwyMDE2LTA5LTIzXG4gKiAyMDE2LTA5LTE3IDAwOjEyOjU4LDI5Ljk4NzAwNzQsMzEuMjE3NTgyNyxkcml2ZXJfYW5hbHl0aWNzLDE0NzI2ODgwMDAwMDAsRmFsc2UsNCwyMDE2LTA5LTIzVDAwOjAwOjAwLjAwMFosLCwyMDE2LTA5LTIzYFxuICpcbiAqIGNvbnN0IGRhdGFzZXQgPSB7XG4gKiAgaW5mbzoge2lkOiAndGVzdF9kYXRhJywgbGFiZWw6ICdNeSBDc3YnfSxcbiAqICBkYXRhOiBwcm9jZXNzQ3N2RGF0YSh0ZXN0RGF0YSlcbiAqIH07XG4gKlxuICogZGlzcGF0Y2goYWRkRGF0YVRvTWFwKHtcbiAqICBkYXRhc2V0czogW2RhdGFzZXRdLFxuICogIG9wdGlvbnM6IHtjZW50ZXJNYXA6IHRydWUsIHJlYWRPbmx5OiB0cnVlfVxuICogfSkpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0NzdkRhdGEocmF3RGF0YTogdW5rbm93bltdW10gfCBzdHJpbmcsIGhlYWRlcj86IHN0cmluZ1tdKTogUHJvY2Vzc29yUmVzdWx0IHtcbiAgbGV0IHJvd3M6IHVua25vd25bXVtdIHwgdW5kZWZpbmVkO1xuICBsZXQgaGVhZGVyUm93OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAodHlwZW9mIHJhd0RhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgcGFyc2VkUm93czogc3RyaW5nW11bXSA9IGNzdlBhcnNlUm93cyhyYXdEYXRhKTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWRSb3dzKSB8fCBwYXJzZWRSb3dzLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIGxvb2tzIGxpa2UgYW4gZW1wdHkgZmlsZSwgdGhyb3cgZXJyb3IgdG8gYmUgY2F0Y2hcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvY2VzcyBDc3YgRGF0YSBGYWlsZWQ6IENTViBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBoZWFkZXJSb3cgPSBwYXJzZWRSb3dzWzBdO1xuICAgIHJvd3MgPSBwYXJzZWRSb3dzLnNsaWNlKDEpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmF3RGF0YSkgJiYgcmF3RGF0YS5sZW5ndGgpIHtcbiAgICByb3dzID0gcmF3RGF0YTtcbiAgICBoZWFkZXJSb3cgPSBoZWFkZXI7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVyUm93KSkge1xuICAgICAgLy8gaWYgZGF0YSBpcyBwYXNzZWQgaW4gYXMgYXJyYXkgb2Ygcm93cyBhbmQgbWlzc2luZyBoZWFkZXJcbiAgICAgIC8vIGFzc3VtZSBmaXJzdCByb3cgaXMgaGVhZGVyXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBoZWFkZXJSb3cgPSByYXdEYXRhWzBdO1xuICAgICAgcm93cyA9IHJhd0RhdGEuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyb3dzIHx8ICFoZWFkZXJSb3cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5wdXQgcGFzc2VkIHRvIHByb2Nlc3NDc3ZEYXRhJyk7XG4gIH1cblxuICAvLyBoZXJlIHdlIGFzc3VtZSB0aGUgY3N2IGZpbGUgdGhhdCBwZW9wbGUgdXBsb2FkZWQgd2lsbCBoYXZlIGZpcnN0IHJvd1xuICAvLyBhcyBuYW1lIG9mIHRoZSBjb2x1bW5cblxuICBjbGVhblVwRmFsc3lDc3ZWYWx1ZShyb3dzKTtcbiAgLy8gTm8gbmVlZCB0byBydW4gdHlwZSBkZXRlY3Rpb24gb24gZXZlcnkgZGF0YSBwb2ludFxuICAvLyBoZXJlIHdlIGdldCBhIGxpc3Qgb2Ygbm9uZSBudWxsIHZhbHVlcyB0byBydW4gYW5hbHl6ZSBvblxuICBjb25zdCBzYW1wbGUgPSBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSh7ZmllbGRzOiBoZWFkZXJSb3csIHJvd3N9KTtcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzRnJvbURhdGEoc2FtcGxlLCBoZWFkZXJSb3cpO1xuICBjb25zdCBwYXJzZWRSb3dzID0gcGFyc2VSb3dzQnlGaWVsZHMocm93cywgZmllbGRzKTtcblxuICByZXR1cm4ge2ZpZWxkcywgcm93czogcGFyc2VkUm93c307XG59XG5cbi8qKlxuICogUGFyc2Ugcm93cyBvZiBjc3YgYnkgYW5hbHl6ZWQgZmllbGQgdHlwZXMuIFNvIHRoYXQgYCcxJ2AgLT4gYDFgLCBgJ1RydWUnYCAtPiBgdHJ1ZWBcbiAqIEBwYXJhbSByb3dzXG4gKiBAcGFyYW0gZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJvd3NCeUZpZWxkcyhyb3dzOiBhbnlbXVtdLCBmaWVsZHM6IEZpZWxkW10pIHtcbiAgLy8gRWRpdCByb3dzIGluIHBsYWNlXG4gIGNvbnN0IGdlb2pzb25GaWVsZElkeCA9IGZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09ICdfZ2VvanNvbicpO1xuICBmaWVsZHMuZm9yRWFjaChwYXJzZUNzdlJvd3NCeUZpZWxkVHlwZS5iaW5kKG51bGwsIHJvd3MsIGdlb2pzb25GaWVsZElkeCkpO1xuXG4gIHJldHVybiByb3dzO1xufVxuXG4vKipcbiAqIENvbnZlcnQgZmFsc3kgdmFsdWUgaW4gY3N2IGluY2x1ZGluZyBgJycsICdudWxsJywgJ05VTEwnLCAnTnVsbCcsICdOYU4nYCB0byBgbnVsbGAsXG4gKiBzbyB0aGF0IHR5cGUtYW5hbHl6ZXIgd29uJ3QgZGV0ZWN0IGl0IGFzIHN0cmluZ1xuICpcbiAqIEBwYXJhbSByb3dzXG4gKi9cbmZ1bmN0aW9uIGNsZWFuVXBGYWxzeUNzdlZhbHVlKHJvd3M6IHVua25vd25bXVtdKTogdm9pZCB7XG4gIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChDU1ZfTlVMTFMsICdnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgLy8gYW5hbHl6ZXIgd2lsbCBzZXQgYW55IGZpZWxkcyB0byAnc3RyaW5nJyBpZiB0aGVyZSBhcmUgZW1wdHkgdmFsdWVzXG4gICAgICAvLyB3aGljaCB3aWxsIGJlIHBhcnNlZCBhcyAnJyBieSBkMy5jc3ZcbiAgICAgIC8vIGhlcmUgd2UgcGFyc2UgZW1wdHkgZGF0YSBhcyBudWxsXG4gICAgICAvLyBUT0RPOiBjcmVhdGUgd2FybmluZyB3aGVuIGRlbHRlY3QgYENTVl9OVUxMU2AgaW4gdGhlIGRhdGFcbiAgICAgIGlmICh0eXBlb2Ygcm93c1tpXVtqXSA9PT0gJ3N0cmluZycgJiYgKHJvd3NbaV1bal0gYXMgc3RyaW5nKS5tYXRjaChyZSkpIHtcbiAgICAgICAgcm93c1tpXVtqXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyB1cGxvYWRlZCBjc3YgZmlsZSB0byBwYXJzZSB2YWx1ZSBieSBmaWVsZCB0eXBlXG4gKlxuICogQHBhcmFtIHJvd3NcbiAqIEBwYXJhbSBnZW9GaWVsZElkeCBmaWVsZCBpbmRleFxuICogQHBhcmFtIGZpZWxkXG4gKiBAcGFyYW0gaVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ZSb3dzQnlGaWVsZFR5cGUoXG4gIHJvd3M6IHVua25vd25bXVtdLFxuICBnZW9GaWVsZElkeDogbnVtYmVyLFxuICBmaWVsZDogRmllbGQsXG4gIGk6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcnNlciA9IFBBUlNFX0ZJRUxEX1ZBTFVFX0ZST01fU1RSSU5HW2ZpZWxkLnR5cGVdO1xuICBpZiAocGFyc2VyKSB7XG4gICAgLy8gY2hlY2sgZmlyc3Qgbm90IG51bGwgdmFsdWUgb2YgaXQncyBhbHJlYWR5IHBhcnNlZFxuICAgIGNvbnN0IGZpcnN0ID0gcm93cy5maW5kKHIgPT4gbm90TnVsbG9yVW5kZWZpbmVkKHJbaV0pKTtcbiAgICBpZiAoIWZpcnN0IHx8IHBhcnNlci52YWxpZChmaXJzdFtpXSwgZmllbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgLy8gcGFyc2Ugc3RyaW5nIHZhbHVlIGJhc2VkIG9uIGZpZWxkIHR5cGVcbiAgICAgIGlmIChyb3dbaV0gIT09IG51bGwpIHtcbiAgICAgICAgcm93W2ldID0gcGFyc2VyLnBhcnNlKHJvd1tpXSwgZmllbGQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2VvRmllbGRJZHggPiAtMSAmJlxuICAgICAgICAgIGlzUGxhaW5PYmplY3Qocm93W2dlb0ZpZWxkSWR4XSkgJiZcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaGFzT3duUHJvcGVydHkocm93W2dlb0ZpZWxkSWR4XSwgJ3Byb3BlcnRpZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcm93W2dlb0ZpZWxkSWR4XS5wcm9wZXJ0aWVzW2ZpZWxkLm5hbWVdID0gcm93W2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbi8qKlxuICogUHJvY2VzcyBkYXRhIHdoZXJlIGVhY2ggcm93IGlzIGFuIG9iamVjdCwgb3V0cHV0IGNhbiBiZSBwYXNzZWQgdG8gW2BhZGREYXRhVG9NYXBgXSguLi9hY3Rpb25zL2FjdGlvbnMubWQjYWRkZGF0YXRvbWFwKVxuICogTk9URTogVGhpcyBmdW5jdGlvbiBtYXkgbXV0YXRlIGlucHV0LlxuICogQHBhcmFtIHJhd0RhdGEgYW4gYXJyYXkgb2Ygcm93IG9iamVjdCwgZWFjaCBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXNcbiAqIEByZXR1cm5zIGRhdGFzZXQgY29udGFpbmluZyBgZmllbGRzYCBhbmQgYHJvd3NgXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ2tlcGxlci5nbC9hY3Rpb25zJztcbiAqIGltcG9ydCB7cHJvY2Vzc1Jvd09iamVjdH0gZnJvbSAna2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuICpcbiAqIGNvbnN0IGRhdGEgPSBbXG4gKiAge2xhdDogMzEuMjcsIGxuZzogMTI3LjU2LCB2YWx1ZTogM30sXG4gKiAge2xhdDogMzEuMjIsIGxuZzogMTI2LjI2LCB2YWx1ZTogMX1cbiAqIF07XG4gKlxuICogZGlzcGF0Y2goYWRkRGF0YVRvTWFwKHtcbiAqICBkYXRhc2V0czoge1xuICogICAgaW5mbzoge2xhYmVsOiAnTXkgRGF0YScsIGlkOiAnbXlfZGF0YSd9LFxuICogICAgZGF0YTogcHJvY2Vzc1Jvd09iamVjdChkYXRhKVxuICogIH1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NSb3dPYmplY3QocmF3RGF0YTogdW5rbm93bltdKTogUHJvY2Vzc29yUmVzdWx0IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhd0RhdGEpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAoIXJhd0RhdGEubGVuZ3RoKSB7XG4gICAgLy8gZGF0YSBpcyBlbXB0eVxuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgICAgcm93czogW11cbiAgICB9O1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJhd0RhdGFbMF0pOyAvLyBbbGF0LCBsbmcsIHZhbHVlXVxuICBjb25zdCByb3dzID0gcmF3RGF0YS5tYXAoZCA9PiBrZXlzLm1hcChrZXkgPT4gZFtrZXldKSk7IC8vIFtbMzEuMjcsIDEyNy41NiwgM11dXG5cbiAgLy8gcm93IG9iamVjdCBjYW4gc3RpbGwgY29udGFpbiB2YWx1ZXMgbGlrZSBgTnVsbGAgb3IgYE4vQWBcbiAgY2xlYW5VcEZhbHN5Q3N2VmFsdWUocm93cyk7XG5cbiAgcmV0dXJuIHByb2Nlc3NDc3ZEYXRhKHJvd3MsIGtleXMpO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgR2VvSlNPTiBbYEZlYXR1cmVDb2xsZWN0aW9uYF0oaHR0cDovL3dpa2kuZ2VvanNvbi5vcmcvR2VvSlNPTl9kcmFmdF92ZXJzaW9uXzYjRmVhdHVyZUNvbGxlY3Rpb24pLFxuICogb3V0cHV0IGEgZGF0YSBvYmplY3Qgd2l0aCBge2ZpZWxkczogW10sIHJvd3M6IFtdfWAuXG4gKiBUaGUgZGF0YSBvYmplY3QgY2FuIGJlIHdyYXBwZWQgaW4gYSBgZGF0YXNldGAgYW5kIHBhc3NlZCB0byBbYGFkZERhdGFUb01hcGBdKC4uL2FjdGlvbnMvYWN0aW9ucy5tZCNhZGRkYXRhdG9tYXApXG4gKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIG1heSBtdXRhdGUgaW5wdXQuXG4gKlxuICogQHBhcmFtIHJhd0RhdGEgcmF3IGdlb2pzb24gZmVhdHVyZSBjb2xsZWN0aW9uXG4gKiBAcmV0dXJucyBkYXRhc2V0IGNvbnRhaW5pbmcgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdrZXBsZXIuZ2wvYWN0aW9ucyc7XG4gKiBpbXBvcnQge3Byb2Nlc3NHZW9qc29ufSBmcm9tICdrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG4gKlxuICogY29uc3QgZ2VvanNvbiA9IHtcbiAqIFx0XCJ0eXBlXCIgOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiBcdFwiZmVhdHVyZXNcIiA6IFt7XG4gKiBcdFx0XCJ0eXBlXCIgOiBcIkZlYXR1cmVcIixcbiAqIFx0XHRcInByb3BlcnRpZXNcIiA6IHtcbiAqIFx0XHRcdFwiY2FwYWNpdHlcIiA6IFwiMTBcIixcbiAqIFx0XHRcdFwidHlwZVwiIDogXCJVLVJhY2tcIlxuICogXHRcdH0sXG4gKiBcdFx0XCJnZW9tZXRyeVwiIDoge1xuICogXHRcdFx0XCJ0eXBlXCIgOiBcIlBvaW50XCIsXG4gKiBcdFx0XHRcImNvb3JkaW5hdGVzXCIgOiBbIC03MS4wNzMyODMsIDQyLjQxNzUwMCBdXG4gKiBcdFx0fVxuICogXHR9XVxuICogfTtcbiAqXG4gKiBkaXNwYXRjaChhZGREYXRhVG9NYXAoe1xuICogIGRhdGFzZXRzOiB7XG4gKiAgICBpbmZvOiB7XG4gKiAgICAgIGxhYmVsOiAnU2FtcGxlIFRheGkgVHJpcHMgaW4gTmV3IFlvcmsgQ2l0eScsXG4gKiAgICAgIGlkOiAndGVzdF90cmlwX2RhdGEnXG4gKiAgICB9LFxuICogICAgZGF0YTogcHJvY2Vzc0dlb2pzb24oZ2VvanNvbilcbiAqICB9XG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzR2VvanNvbihyYXdEYXRhOiB1bmtub3duKTogUHJvY2Vzc29yUmVzdWx0IHtcbiAgY29uc3Qgbm9ybWFsaXplZEdlb2pzb24gPSBub3JtYWxpemUocmF3RGF0YSk7XG5cbiAgaWYgKCFub3JtYWxpemVkR2VvanNvbiB8fCAhQXJyYXkuaXNBcnJheShub3JtYWxpemVkR2VvanNvbi5mZWF0dXJlcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUmVhZCBGaWxlIEZhaWxlZDogRmlsZSBpcyBub3QgYSB2YWxpZCBHZW9KU09OLiBSZWFkIG1vcmUgYWJvdXQgW3N1cHBvcnRlZCBmaWxlIGZvcm1hdF0oJHtHVUlERVNfRklMRV9GT1JNQVRfRE9DfSlgXG4gICAgKTtcbiAgfVxuXG4gIC8vIGdldHRpbmcgYWxsIGZlYXR1cmUgZmllbGRzXG4gIGNvbnN0IGFsbERhdGFSb3dzOiBBcnJheTx7X2dlb2pzb246IEZlYXR1cmV9ICYga2V5b2YgRmVhdHVyZT4gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub3JtYWxpemVkR2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGYgPSBub3JtYWxpemVkR2VvanNvbi5mZWF0dXJlc1tpXTtcbiAgICBpZiAoZi5nZW9tZXRyeSkge1xuICAgICAgYWxsRGF0YVJvd3MucHVzaCh7XG4gICAgICAgIC8vIGFkZCBmZWF0dXJlIHRvIF9nZW9qc29uIGZpZWxkXG4gICAgICAgIF9nZW9qc29uOiBmLFxuICAgICAgICAuLi4oZi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIGdldCBhbGwgdGhlIGZpZWxkXG4gIGNvbnN0IGZpZWxkcyA9IGFsbERhdGFSb3dzLnJlZHVjZTxzdHJpbmdbXT4oKGFjY3UsIGN1cnIpID0+IHtcbiAgICBPYmplY3Qua2V5cyhjdXJyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIWFjY3UuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBhY2N1LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdTtcbiAgfSwgW10pO1xuXG4gIC8vIG1ha2Ugc3VyZSBlYWNoIGZlYXR1cmUgaGFzIGV4YWN0IHNhbWUgZmllbGRzXG4gIGFsbERhdGFSb3dzLmZvckVhY2goZCA9PiB7XG4gICAgZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgICBpZiAoIShmIGluIGQpKSB7XG4gICAgICAgIGRbZl0gPSBudWxsO1xuICAgICAgICBpZiAoZC5fZ2VvanNvbi5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgZC5fZ2VvanNvbi5wcm9wZXJ0aWVzW2ZdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gcHJvY2Vzc1Jvd09iamVjdChhbGxEYXRhUm93cyk7XG59XG5cbi8qKlxuICogUHJvY2VzcyBzYXZlZCBrZXBsZXIuZ2wganNvbiB0byBiZSBwYXNzIHRvIFtgYWRkRGF0YVRvTWFwYF0oLi4vYWN0aW9ucy9hY3Rpb25zLm1kI2FkZGRhdGF0b21hcCkuXG4gKiBUaGUganNvbiBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gYGRhdGFzZXRzYCBhbmQgYGNvbmZpZ2AuXG4gKiBAcGFyYW0gcmF3RGF0YVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybnMgZGF0YXNldHMgYW5kIGNvbmZpZyBge2RhdGFzZXRzOiB7fSwgY29uZmlnOiB7fX1gXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ2tlcGxlci5nbC9hY3Rpb25zJztcbiAqIGltcG9ydCB7cHJvY2Vzc0tlcGxlcmdsSlNPTn0gZnJvbSAna2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuICpcbiAqIGRpc3BhdGNoKGFkZERhdGFUb01hcChwcm9jZXNzS2VwbGVyZ2xKU09OKGtlcGxlckdsSnNvbikpKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NLZXBsZXJnbEpTT04ocmF3RGF0YTogU2F2ZWRNYXAsIHNjaGVtYSA9IEtlcGxlckdsU2NoZW1hKTogTG9hZGVkTWFwIHwgbnVsbCB7XG4gIHJldHVybiByYXdEYXRhID8gc2NoZW1hLmxvYWQocmF3RGF0YS5kYXRhc2V0cywgcmF3RGF0YS5jb25maWcpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBkYXRhc2V0cyBzYXZlZCB1c2luZyBrZXBsZXIuZ2wgc2NoZW1hXG4gKiBAcGFyYW0gcmF3RGF0YVxuICogQHBhcmFtIHNjaGVtYVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0tlcGxlcmdsRGF0YXNldChcbiAgcmF3RGF0YTogb2JqZWN0IHwgb2JqZWN0W10sXG4gIHNjaGVtYSA9IEtlcGxlckdsU2NoZW1hXG4pOiBQYXJzZWREYXRhc2V0IHwgUGFyc2VkRGF0YXNldFtdIHwgbnVsbCB7XG4gIGlmICghcmF3RGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0cyA9IHNjaGVtYS5wYXJzZVNhdmVkRGF0YSh0b0FycmF5KHJhd0RhdGEpKTtcbiAgaWYgKCFyZXN1bHRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmF3RGF0YSkgPyByZXN1bHRzIDogcmVzdWx0c1swXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhcnJvdyB0YWJsZSBhbmQgcmV0dXJuIGEgZGF0YXNldFxuICpcbiAqIEBwYXJhbSBhcnJvd1RhYmxlIEFycm93VGFibGUgdG8gcGFyc2UsIHNlZSBsb2FkZXJzLmdsL3NjaGVtYVxuICogQHJldHVybnMgZGF0YXNldCBjb250YWluaW5nIGBmaWVsZHNgIGFuZCBgcm93c2Agb3IgbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0Fycm93VGFibGUoYXJyb3dUYWJsZTogQXJyb3dUYWJsZSk6IFByb2Nlc3NvclJlc3VsdCB8IG51bGwge1xuICAvLyBAdHMtaWdub3JlIC0gVW5rbm93biBkYXRhIHR5cGUgY2F1c2luZyBidWlsZCBmYWlsdXJlc1xuICByZXR1cm4gcHJvY2Vzc0Fycm93QmF0Y2hlcyhhcnJvd1RhYmxlLmRhdGEuYmF0Y2hlcyk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgR2VvQXJyb3cgbWV0YWRhdGEgZnJvbSBhbiBBcGFjaGUgQXJyb3cgdGFibGUgc2NoZW1hLlxuICogRm9yIGdlb3BhcnF1ZXQgZmlsZXMgZ2VvYXJyb3cgbWV0YWRhdGEgaXNuJ3QgcHJlc2VudCBpbiBmaWVsZHMsIHNvIGV4dHJhY3QgZXh0cmEgaW5mbyBmcm9tIHNjaGVtYS5cbiAqIEBwYXJhbSB0YWJsZSBUaGUgQXBhY2hlIEFycm93IHRhYmxlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBtYXBwaW5nIGNvbHVtbiBuYW1lcyB0byB0aGVpciBHZW9BcnJvdyBlbmNvZGluZyB0eXBlLlxuICogQHRocm93cyBMb2dzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcGFyc2luZyBvZiBtZXRhZGF0YSBmYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb0Fycm93TWV0YWRhdGFGcm9tU2NoZW1hKHRhYmxlOiBhcnJvdy5UYWJsZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBnZW9BcnJvd01ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QgZ2VvU3RyaW5nID0gdGFibGUuc2NoZW1hLm1ldGFkYXRhPy5nZXQoJ2dlbycpO1xuICAgIGlmIChnZW9TdHJpbmcpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEdlb1N0cmluZyA9IEpTT04ucGFyc2UoZ2VvU3RyaW5nKTtcbiAgICAgIGlmIChwYXJzZWRHZW9TdHJpbmcuY29sdW1ucykge1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJzZWRHZW9TdHJpbmcuY29sdW1ucykuZm9yRWFjaChjb2x1bW5OYW1lID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5EYXRhID0gcGFyc2VkR2VvU3RyaW5nLmNvbHVtbnNbY29sdW1uTmFtZV07XG4gICAgICAgICAgaWYgKGNvbHVtbkRhdGE/LmVuY29kaW5nID09PSAnV0tCJykge1xuICAgICAgICAgICAgZ2VvQXJyb3dNZXRhZGF0YVtjb2x1bW5OYW1lXSA9IEdFT0FSUk9XX0VYVEVOU0lPTlMuV0tCO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUT0RPIHBvdGVudGlhbGx5IHRoZXJlIGFyZSBvdGhlciB0eXBlcyBidXQgbm8gZGF0YXNldHMgdG8gdGVzdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignQW4gZXJyb3IgZHVyaW5nIGFycm93IHRhYmxlIHNjaGVtYSBtZXRhZGF0YSBwYXJzaW5nJyk7XG4gIH1cbiAgcmV0dXJuIGdlb0Fycm93TWV0YWRhdGE7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gQXBhY2hlIEFycm93IHRhYmxlIHNjaGVtYSBpbnRvIGFuIGFycmF5IG9mIEtlcGxlci5nbCBmaWVsZCBvYmplY3RzLlxuICogQHBhcmFtIHRhYmxlIFRoZSBBcGFjaGUgQXJyb3cgdGFibGUgd2hvc2Ugc2NoZW1hIG5lZWRzIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSBmaWVsZFR5cGVTdWdnZXN0aW9ucyBPcHRpb25hbCBtYXBwaW5nIG9mIGZpZWxkIG5hbWVzIHRvIHN1Z2dlc3RlZCBmaWVsZCB0eXBlcy5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZpZWxkIG9iamVjdHMgc3VpdGFibGUgZm9yIEtlcGxlci5nbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycm93U2NoZW1hVG9GaWVsZHMoXG4gIHRhYmxlOiBhcnJvdy5UYWJsZSxcbiAgZmllbGRUeXBlU3VnZ2VzdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuKTogRmllbGRbXSB7XG4gIGNvbnN0IGhlYWRlclJvdyA9IHRhYmxlLnNjaGVtYS5maWVsZHMubWFwKGYgPT4gZi5uYW1lKTtcbiAgY29uc3Qgc2FtcGxlID0gZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emVBcnJvdyh0YWJsZSwgaGVhZGVyUm93KTtcbiAgY29uc3Qga2VwbGVyRmllbGRzID0gZ2V0RmllbGRzRnJvbURhdGEoc2FtcGxlLCBoZWFkZXJSb3cpO1xuICBjb25zdCBnZW9BcnJvd01ldGFkYXRhID0gZ2V0R2VvQXJyb3dNZXRhZGF0YUZyb21TY2hlbWEodGFibGUpO1xuXG4gIHJldHVybiB0YWJsZS5zY2hlbWEuZmllbGRzLm1hcCgoZmllbGQ6IGFycm93LkZpZWxkLCBmaWVsZEluZGV4OiBudW1iZXIpID0+IHtcbiAgICBsZXQgdHlwZSA9IGFycm93RGF0YVR5cGVUb0ZpZWxkVHlwZShmaWVsZC50eXBlKTtcbiAgICBsZXQgYW5hbHl6ZXJUeXBlID0gYXJyb3dEYXRhVHlwZVRvQW5hbHl6ZXJEYXRhVHlwZShmaWVsZC50eXBlKTtcbiAgICBsZXQgZm9ybWF0ID0gJyc7XG5cbiAgICAvLyBnZW9tZXRyeSBmaWVsZHMgcHJvZHVjZWQgYnkgRHVja0RCJ3Mgc3RfYXNnZW9qc29uKClcbiAgICBpZiAoZmllbGRUeXBlU3VnZ2VzdGlvbnNbZmllbGQubmFtZV0gPT09ICdKU09OJykge1xuICAgICAgdHlwZSA9IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29uO1xuICAgICAgYW5hbHl6ZXJUeXBlID0gQW5hbHl6ZXJEQVRBX1RZUEVTLkdFT01FVFJZX0ZST01fU1RSSU5HO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBmaWVsZFR5cGVTdWdnZXN0aW9uc1tmaWVsZC5uYW1lXSA9PT0gJ0dFT01FVFJZJyB8fFxuICAgICAgZmllbGQubWV0YWRhdGEuZ2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSk/LnN0YXJ0c1dpdGgoJ2dlb2Fycm93JylcbiAgICApIHtcbiAgICAgIHR5cGUgPSBBTExfRklFTERfVFlQRVMuZ2VvYXJyb3c7XG4gICAgICBhbmFseXplclR5cGUgPSBBbmFseXplckRBVEFfVFlQRVMuR0VPTUVUUlk7XG4gICAgfSBlbHNlIGlmIChnZW9BcnJvd01ldGFkYXRhW2ZpZWxkLm5hbWVdKSB7XG4gICAgICB0eXBlID0gQUxMX0ZJRUxEX1RZUEVTLmdlb2Fycm93O1xuICAgICAgYW5hbHl6ZXJUeXBlID0gQW5hbHl6ZXJEQVRBX1RZUEVTLkdFT01FVFJZO1xuICAgICAgZmllbGQubWV0YWRhdGE/LnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIGdlb0Fycm93TWV0YWRhdGFbZmllbGQubmFtZV0pO1xuICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlU3VnZ2VzdGlvbnNbZmllbGQubmFtZV0gPT09ICdCTE9CJykge1xuICAgICAgLy8gV2hlbiBhcnJvdyB3a2IgY29sdW1uIHNhdmVkIHRvIER1Y2tEQiBhcyBCTE9CIHdpdGhvdXQgYW55IG1ldGFkYXRhLCB0aGVuIHF1ZXJpZWQgYmFja1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRhYmxlLmdldENoaWxkQXQoZmllbGRJbmRleCk/LmdldCgwKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBiaW5hcnlHZW8gPSBwYXJzZVN5bmMoZGF0YSwgV0tCTG9hZGVyKTtcbiAgICAgICAgICBpZiAoYmluYXJ5R2VvKSB7XG4gICAgICAgICAgICB0eXBlID0gQUxMX0ZJRUxEX1RZUEVTLmdlb2Fycm93O1xuICAgICAgICAgICAgYW5hbHl6ZXJUeXBlID0gQW5hbHl6ZXJEQVRBX1RZUEVTLkdFT01FVFJZO1xuICAgICAgICAgICAgZmllbGQubWV0YWRhdGE/LnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIEdFT0FSUk9XX0VYVEVOU0lPTlMuV0tCKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgbm90IFdLQlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHNob3VsZCB3ZSB1c2UgS2VwbGVyIGdldEZpZWxkc0Zyb21EYXRhIGluc3RlYWRcbiAgICAgIC8vIG9mIGFycm93RGF0YVR5cGVUb0ZpZWxkVHlwZSBmb3IgYWxsIGZpZWxkcz9cbiAgICAgIGNvbnN0IGtlcGxlckZpZWxkID0ga2VwbGVyRmllbGRzW2ZpZWxkSW5kZXhdO1xuICAgICAgaWYgKGtlcGxlckZpZWxkLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApIHtcbiAgICAgICAgdHlwZSA9IGtlcGxlckZpZWxkLnR5cGU7XG4gICAgICAgIGFuYWx5emVyVHlwZSA9IGtlcGxlckZpZWxkLmFuYWx5emVyVHlwZTtcbiAgICAgICAgZm9ybWF0ID0ga2VwbGVyRmllbGQuZm9ybWF0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5maWVsZCxcbiAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICBpZDogZmllbGQubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICBmaWVsZElkeDogZmllbGRJbmRleCxcbiAgICAgIHR5cGUsXG4gICAgICBhbmFseXplclR5cGUsXG4gICAgICB2YWx1ZUFjY2Vzc29yOiAoZGM6IGFueSkgPT4gZCA9PiB7XG4gICAgICAgIHJldHVybiBkYy52YWx1ZUF0KGQuaW5kZXgsIGZpZWxkSW5kZXgpO1xuICAgICAgfSxcbiAgICAgIG1ldGFkYXRhOiBmaWVsZC5tZXRhZGF0YVxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIGFycm93IGJhdGNoZXMgcmV0dXJuZWQgZnJvbSBwYXJzZUluQmF0Y2hlcygpXG4gKlxuICogQHBhcmFtIGFycm93VGFibGUgdGhlIGFycm93IHRhYmxlIHRvIHBhcnNlXG4gKiBAcmV0dXJucyBkYXRhc2V0IGNvbnRhaW5pbmcgYGZpZWxkc2AgYW5kIGByb3dzYCBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQXJyb3dCYXRjaGVzKGFycm93QmF0Y2hlczogYXJyb3cuUmVjb3JkQmF0Y2hbXSk6IFByb2Nlc3NvclJlc3VsdCB8IG51bGwge1xuICBpZiAoYXJyb3dCYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGFycm93VGFibGUgPSBuZXcgYXJyb3cuVGFibGUoYXJyb3dCYXRjaGVzKTtcbiAgY29uc3QgZmllbGRzID0gYXJyb3dTY2hlbWFUb0ZpZWxkcyhhcnJvd1RhYmxlKTtcblxuICBjb25zdCBjb2xzID0gWy4uLkFycmF5KGFycm93VGFibGUubnVtQ29scykua2V5cygpXS5tYXAoaSA9PiBhcnJvd1RhYmxlLmdldENoaWxkQXQoaSkpO1xuXG4gIC8vIHJldHVybiBlbXB0eSByb3dzIGFuZCB1c2UgcmF3IGFycm93IHRhYmxlIHRvIGNvbnN0cnVjdCBjb2x1bW4td2lzZSBkYXRhIGNvbnRhaW5lclxuICByZXR1cm4ge1xuICAgIGZpZWxkcyxcbiAgICByb3dzOiBbXSxcbiAgICBjb2xzLFxuICAgIG1ldGFkYXRhOiBhcnJvd1RhYmxlLnNjaGVtYS5tZXRhZGF0YSxcbiAgICAvLyBTYXZlIG9yaWdpbmFsIGFycm93IHNjaGVtYSwgZm9yIGJldHRlciBpbmdlc3Rpb24gaW50byBEdWNrREIuXG4gICAgLy8gVE9ETyBjb25zaWRlciByZXR1cm5pbmcgYXJyb3dUYWJsZSBpbiBjb2xzLCBub3QgYW4gYXJyYXkgb2YgVmVjdG9ycyBmcm9tIGFycm93VGFibGUuXG4gICAgYXJyb3dTY2hlbWE6IGFycm93VGFibGUuc2NoZW1hXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBEQVRBU0VUX0hBTkRMRVJTID0ge1xuICBbREFUQVNFVF9GT1JNQVRTLnJvd106IHByb2Nlc3NSb3dPYmplY3QsXG4gIFtEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbl06IHByb2Nlc3NHZW9qc29uLFxuICBbREFUQVNFVF9GT1JNQVRTLmNzdl06IHByb2Nlc3NDc3ZEYXRhLFxuICBbREFUQVNFVF9GT1JNQVRTLmFycm93XTogcHJvY2Vzc0Fycm93VGFibGUsXG4gIFtEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2xdOiBwcm9jZXNzS2VwbGVyZ2xEYXRhc2V0XG59O1xuXG5leHBvcnQgY29uc3QgUHJvY2Vzc29yczoge1xuICBwcm9jZXNzR2VvanNvbjogdHlwZW9mIHByb2Nlc3NHZW9qc29uO1xuICBwcm9jZXNzQ3N2RGF0YTogdHlwZW9mIHByb2Nlc3NDc3ZEYXRhO1xuICBwcm9jZXNzQXJyb3dUYWJsZTogdHlwZW9mIHByb2Nlc3NBcnJvd1RhYmxlO1xuICBwcm9jZXNzQXJyb3dCYXRjaGVzOiB0eXBlb2YgcHJvY2Vzc0Fycm93QmF0Y2hlcztcbiAgcHJvY2Vzc1Jvd09iamVjdDogdHlwZW9mIHByb2Nlc3NSb3dPYmplY3Q7XG4gIHByb2Nlc3NLZXBsZXJnbEpTT046IHR5cGVvZiBwcm9jZXNzS2VwbGVyZ2xKU09OO1xuICBwcm9jZXNzS2VwbGVyZ2xEYXRhc2V0OiB0eXBlb2YgcHJvY2Vzc0tlcGxlcmdsRGF0YXNldDtcbiAgYW5hbHl6ZXJUeXBlVG9GaWVsZFR5cGU6IHR5cGVvZiBhbmFseXplclR5cGVUb0ZpZWxkVHlwZTtcbiAgZ2V0RmllbGRzRnJvbURhdGE6IHR5cGVvZiBnZXRGaWVsZHNGcm9tRGF0YTtcbiAgcGFyc2VDc3ZSb3dzQnlGaWVsZFR5cGU6IHR5cGVvZiBwYXJzZUNzdlJvd3NCeUZpZWxkVHlwZTtcbn0gPSB7XG4gIHByb2Nlc3NHZW9qc29uLFxuICBwcm9jZXNzQ3N2RGF0YSxcbiAgcHJvY2Vzc0Fycm93VGFibGUsXG4gIHByb2Nlc3NBcnJvd0JhdGNoZXMsXG4gIHByb2Nlc3NSb3dPYmplY3QsXG4gIHByb2Nlc3NLZXBsZXJnbEpTT04sXG4gIHByb2Nlc3NLZXBsZXJnbERhdGFzZXQsXG4gIGFuYWx5emVyVHlwZVRvRmllbGRUeXBlLFxuICBnZXRGaWVsZHNGcm9tRGF0YSxc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QUNBLElBQU0yRixVQUFVLEdBQUcsSUFBSXRJLEtBQUssQ0FBQ3lMLEtBQUssQ0FBQ0QsWUFBWSxDQUFDO0VBQ2hELElBQU1sRyxNQUFNLEdBQUdtRSxtQkFBbUIsQ0FBQ25CLFVBQVUsQ0FBQztFQUU5QyxJQUFNb0QsSUFBSSxHQUFHLElBQUFDLG1CQUFBLGFBQUlySCxLQUFLLENBQUNnRSxVQUFVLENBQUNzRCxPQUFPLENBQUMsQ0FBQzFKLElBQUksQ0FBQyxDQUFDLEVBQUUwRSxHQUFHLENBQUMsVUFBQTdFLENBQUM7SUFBQSxPQUFJdUcsVUFBVSxDQUFDcUMsVUFBVSxDQUFDNUksQ0FBQyxDQUFDO0VBQUEsRUFBQzs7RUFFckY7RUFDQSxPQUFPO0lBQ0x1RCxNQUFNLEVBQU5BLE1BQU07SUFDTlQsSUFBSSxFQUFFLEVBQUU7SUFDUjZHLElBQUksRUFBSkEsSUFBSTtJQUNKM0MsUUFBUSxFQUFFVCxVQUFVLENBQUNYLE1BQU0sQ0FBQ29CLFFBQVE7SUFDcEM7SUFDQTtJQUNBOEMsV0FBVyxFQUFFdkQsVUFBVSxDQUFDWDtFQUMxQixDQUFDO0FBQ0g7QUFFTyxJQUFNbUUsZ0JBQWdCLEdBQUE3SSxPQUFBLENBQUE2SSxnQkFBQSxPQUFBakosZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFBQUEsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUMxQmtKLDBCQUFlLENBQUN0RixHQUFHLEVBQUdFLGdCQUFnQixHQUN0Q29GLDBCQUFlLENBQUM3QixPQUFPLEVBQUdwRCxjQUFjLEdBQ3hDaUYsMEJBQWUsQ0FBQ0MsR0FBRyxFQUFHdEgsY0FBYyxHQUNwQ3FILDBCQUFlLENBQUMvTCxLQUFLLEVBQUdxSSxpQkFBaUIsR0FDekMwRCwwQkFBZSxDQUFDRSxRQUFRLEVBQUdoRSxzQkFBc0IsQ0FDbkQ7QUFFTSxJQUFNaUUsVUFXWixHQUFBakosT0FBQSxDQUFBaUosVUFBQSxHQUFHO0VBQ0ZwRixjQUFjLEVBQWRBLGNBQWM7RUFDZHBDLGNBQWMsRUFBZEEsY0FBYztFQUNkMkQsaUJBQWlCLEVBQWpCQSxpQkFBaUI7RUFDakJFLG1CQUFtQixFQUFuQkEsbUJBQW1CO0VBQ25CNUIsZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7RUFDaEJlLG1CQUFtQixFQUFuQkEsbUJBQW1CO0VBQ25CTyxzQkFBc0IsRUFBdEJBLHNCQUFzQjtFQUN0QmtFLHVCQUF1QixFQUF2QkEsb0NBQXVCO0VBQ3ZCNUcsaUJBQWlCLEVBQWpCQSw4QkFBaUI7RUFDakJNLHVCQUF1QixFQUF2QkE7QUFDRixDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/processors",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.1.0",
4
+ "version": "3.1.1",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -31,12 +31,12 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "@danmarshall/deckgl-typings": "4.9.22",
34
- "@kepler.gl/common-utils": "3.1.0",
35
- "@kepler.gl/constants": "3.1.0",
36
- "@kepler.gl/schemas": "3.1.0",
37
- "@kepler.gl/table": "3.1.0",
38
- "@kepler.gl/types": "3.1.0",
39
- "@kepler.gl/utils": "3.1.0",
34
+ "@kepler.gl/common-utils": "3.1.1",
35
+ "@kepler.gl/constants": "3.1.1",
36
+ "@kepler.gl/schemas": "3.1.1",
37
+ "@kepler.gl/table": "3.1.1",
38
+ "@kepler.gl/types": "3.1.1",
39
+ "@kepler.gl/utils": "3.1.1",
40
40
  "@loaders.gl/arrow": "^4.3.2",
41
41
  "@loaders.gl/core": "^4.3.2",
42
42
  "@loaders.gl/csv": "^4.3.2",
@@ -45,6 +45,7 @@
45
45
  "@loaders.gl/loader-utils": "^4.3.2",
46
46
  "@loaders.gl/parquet": "^4.3.2",
47
47
  "@loaders.gl/schema": "^4.3.2",
48
+ "@loaders.gl/wkt": "^4.3.2",
48
49
  "@mapbox/geojson-normalize": "0.0.1",
49
50
  "@nebula.gl/edit-modes": "1.0.2-alpha.1",
50
51
  "@turf/helpers": "^6.1.4",
@@ -5,8 +5,17 @@ import * as arrow from 'apache-arrow';
5
5
  import {csvParseRows} from 'd3-dsv';
6
6
  import {DATA_TYPES as AnalyzerDATA_TYPES} from 'type-analyzer';
7
7
  import normalize from '@mapbox/geojson-normalize';
8
+ import {parseSync} from '@loaders.gl/core';
8
9
  import {ArrowTable} from '@loaders.gl/schema';
9
- import {ALL_FIELD_TYPES, DATASET_FORMATS, GUIDES_FILE_FORMAT_DOC} from '@kepler.gl/constants';
10
+ import {WKBLoader} from '@loaders.gl/wkt';
11
+
12
+ import {
13
+ ALL_FIELD_TYPES,
14
+ DATASET_FORMATS,
15
+ GEOARROW_EXTENSIONS,
16
+ GEOARROW_METADATA_KEY,
17
+ GUIDES_FILE_FORMAT_DOC
18
+ } from '@kepler.gl/constants';
10
19
  import {ProcessorResult, Field} from '@kepler.gl/types';
11
20
  import {
12
21
  arrowDataTypeToAnalyzerDataType,
@@ -17,6 +26,7 @@ import {
17
26
  import {
18
27
  analyzerTypeToFieldType,
19
28
  getSampleForTypeAnalyze,
29
+ getSampleForTypeAnalyzeArrow,
20
30
  getFieldsFromData,
21
31
  h3IsValid,
22
32
  notNullorUndefined,
@@ -393,27 +403,112 @@ export function processArrowTable(arrowTable: ArrowTable): ProcessorResult | nul
393
403
  return processArrowBatches(arrowTable.data.batches);
394
404
  }
395
405
 
396
- export function arrowSchemaToFields(schema: arrow.Schema): Field[] {
397
- return schema.fields.map((field: arrow.Field, index: number) => {
398
- const isGeoArrowColumn = field.metadata.get('ARROW:extension:name')?.startsWith('geoarrow');
406
+ /**
407
+ * Extracts GeoArrow metadata from an Apache Arrow table schema.
408
+ * For geoparquet files geoarrow metadata isn't present in fields, so extract extra info from schema.
409
+ * @param table The Apache Arrow table to extract metadata from.
410
+ * @returns An object mapping column names to their GeoArrow encoding type.
411
+ * @throws Logs an error message if parsing of metadata fails.
412
+ */
413
+ export function getGeoArrowMetadataFromSchema(table: arrow.Table): Record<string, string> {
414
+ const geoArrowMetadata: Record<string, string> = {};
415
+ try {
416
+ const geoString = table.schema.metadata?.get('geo');
417
+ if (geoString) {
418
+ const parsedGeoString = JSON.parse(geoString);
419
+ if (parsedGeoString.columns) {
420
+ Object.keys(parsedGeoString.columns).forEach(columnName => {
421
+ const columnData = parsedGeoString.columns[columnName];
422
+ if (columnData?.encoding === 'WKB') {
423
+ geoArrowMetadata[columnName] = GEOARROW_EXTENSIONS.WKB;
424
+ }
425
+ // TODO potentially there are other types but no datasets to test
426
+ });
427
+ }
428
+ }
429
+ } catch (error) {
430
+ console.error('An error during arrow table schema metadata parsing');
431
+ }
432
+ return geoArrowMetadata;
433
+ }
434
+
435
+ /**
436
+ * Converts an Apache Arrow table schema into an array of Kepler.gl field objects.
437
+ * @param table The Apache Arrow table whose schema needs to be converted.
438
+ * @param fieldTypeSuggestions Optional mapping of field names to suggested field types.
439
+ * @returns An array of field objects suitable for Kepler.gl.
440
+ */
441
+ export function arrowSchemaToFields(
442
+ table: arrow.Table,
443
+ fieldTypeSuggestions: Record<string, string> = {}
444
+ ): Field[] {
445
+ const headerRow = table.schema.fields.map(f => f.name);
446
+ const sample = getSampleForTypeAnalyzeArrow(table, headerRow);
447
+ const keplerFields = getFieldsFromData(sample, headerRow);
448
+ const geoArrowMetadata = getGeoArrowMetadataFromSchema(table);
449
+
450
+ return table.schema.fields.map((field: arrow.Field, fieldIndex: number) => {
451
+ let type = arrowDataTypeToFieldType(field.type);
452
+ let analyzerType = arrowDataTypeToAnalyzerDataType(field.type);
453
+ let format = '';
454
+
455
+ // geometry fields produced by DuckDB's st_asgeojson()
456
+ if (fieldTypeSuggestions[field.name] === 'JSON') {
457
+ type = ALL_FIELD_TYPES.geojson;
458
+ analyzerType = AnalyzerDATA_TYPES.GEOMETRY_FROM_STRING;
459
+ } else if (
460
+ fieldTypeSuggestions[field.name] === 'GEOMETRY' ||
461
+ field.metadata.get(GEOARROW_METADATA_KEY)?.startsWith('geoarrow')
462
+ ) {
463
+ type = ALL_FIELD_TYPES.geoarrow;
464
+ analyzerType = AnalyzerDATA_TYPES.GEOMETRY;
465
+ } else if (geoArrowMetadata[field.name]) {
466
+ type = ALL_FIELD_TYPES.geoarrow;
467
+ analyzerType = AnalyzerDATA_TYPES.GEOMETRY;
468
+ field.metadata?.set(GEOARROW_METADATA_KEY, geoArrowMetadata[field.name]);
469
+ } else if (fieldTypeSuggestions[field.name] === 'BLOB') {
470
+ // When arrow wkb column saved to DuckDB as BLOB without any metadata, then queried back
471
+ try {
472
+ const data = table.getChildAt(fieldIndex)?.get(0);
473
+ if (data) {
474
+ const binaryGeo = parseSync(data, WKBLoader);
475
+ if (binaryGeo) {
476
+ type = ALL_FIELD_TYPES.geoarrow;
477
+ analyzerType = AnalyzerDATA_TYPES.GEOMETRY;
478
+ field.metadata?.set(GEOARROW_METADATA_KEY, GEOARROW_EXTENSIONS.WKB);
479
+ }
480
+ }
481
+ } catch (error) {
482
+ // ignore, not WKB
483
+ }
484
+ } else {
485
+ // TODO should we use Kepler getFieldsFromData instead
486
+ // of arrowDataTypeToFieldType for all fields?
487
+ const keplerField = keplerFields[fieldIndex];
488
+ if (keplerField.type === ALL_FIELD_TYPES.timestamp) {
489
+ type = keplerField.type;
490
+ analyzerType = keplerField.analyzerType;
491
+ format = keplerField.format;
492
+ }
493
+ }
494
+
399
495
  return {
400
496
  ...field,
401
497
  name: field.name,
402
498
  id: field.name,
403
499
  displayName: field.name,
404
- format: '',
405
- fieldIdx: index,
406
- type: isGeoArrowColumn ? ALL_FIELD_TYPES.geoarrow : arrowDataTypeToFieldType(field.type),
407
- analyzerType: isGeoArrowColumn
408
- ? AnalyzerDATA_TYPES.GEOMETRY
409
- : arrowDataTypeToAnalyzerDataType(field.type),
500
+ format: format,
501
+ fieldIdx: fieldIndex,
502
+ type,
503
+ analyzerType,
410
504
  valueAccessor: (dc: any) => d => {
411
- return dc.valueAt(d.index, index);
505
+ return dc.valueAt(d.index, fieldIndex);
412
506
  },
413
507
  metadata: field.metadata
414
508
  };
415
509
  });
416
510
  }
511
+
417
512
  /**
418
513
  * Parse arrow batches returned from parseInBatches()
419
514
  *
@@ -425,12 +520,20 @@ export function processArrowBatches(arrowBatches: arrow.RecordBatch[]): Processo
425
520
  return null;
426
521
  }
427
522
  const arrowTable = new arrow.Table(arrowBatches);
428
- const fields = arrowSchemaToFields(arrowTable.schema);
523
+ const fields = arrowSchemaToFields(arrowTable);
429
524
 
430
525
  const cols = [...Array(arrowTable.numCols).keys()].map(i => arrowTable.getChildAt(i));
431
526
 
432
527
  // return empty rows and use raw arrow table to construct column-wise data container
433
- return {fields, rows: [], cols, metadata: arrowTable.schema.metadata};
528
+ return {
529
+ fields,
530
+ rows: [],
531
+ cols,
532
+ metadata: arrowTable.schema.metadata,
533
+ // Save original arrow schema, for better ingestion into DuckDB.
534
+ // TODO consider returning arrowTable in cols, not an array of Vectors from arrowTable.
535
+ arrowSchema: arrowTable.schema
536
+ };
434
537
  }
435
538
 
436
539
  export const DATASET_HANDLERS = {
@@ -74,7 +74,7 @@ function formatCsv(data, fields) {
74
74
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
75
75
  var row = _step.value;
76
76
  formattedData.push(row.map(function (d, i) {
77
- return (0, _utils.parseFieldValue)(d, fields[i].type);
77
+ return (0, _utils.parseFieldValue)(d, fields[i].type, fields[i]);
78
78
  }));
79
79
  }
80
80
  } catch (err) {
@@ -88,4 +88,4 @@ var exporters = {
88
88
  exportData: exportData
89
89
  };
90
90
  var _default = exports["default"] = exporters;
91
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9kM0RzdiIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsImV4cG9ydERhdGEiLCJzdGF0ZSIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImFwcE5hbWUiLCJkYXRhc2V0cyIsInNlbGVjdGVkRGF0YXNldCIsImRhdGFUeXBlIiwiZmlsdGVyZWQiLCJmaWxlbmFtZSIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZGVmYXVsdERhdGFOYW1lIiwic2VsZWN0ZWREYXRhc2V0cyIsIk9iamVjdCIsInZhbHVlcyIsImZvckVhY2giLCJzZWxlY3RlZERhdGEiLCJfcmVmIiwiZGF0YUNvbnRhaW5lciIsImZpZWxkcyIsImxhYmVsIiwiX3JlZiRmaWx0ZXJlZElkeENQVSIsImZpbHRlcmVkSWR4Q1BVIiwidG9FeHBvcnQiLCJjcmVhdGVJbmRleGVkRGF0YUNvbnRhaW5lciIsIkVYUE9SVF9EQVRBX1RZUEUiLCJDU1YiLCJjc3YiLCJmb3JtYXRDc3YiLCJmaWxlQmxvYiIsIkJsb2IiLCJ0eXBlIiwiZG93bmxvYWRGaWxlIiwiY29uY2F0IiwiZGF0YSIsImNvbHVtbnMiLCJtYXAiLCJkaXNwbGF5TmFtZSIsImZvcm1hdHRlZERhdGEiLCJfaXRlcmF0b3IiLCJyb3dzIiwiX3N0ZXAiLCJyb3ciLCJwdXNoIiwiZCIsImkiLCJwYXJzZUZpZWxkVmFsdWUiLCJlcnIiLCJjc3ZGb3JtYXRSb3dzIiwiZXhwb3J0ZXJzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2V4cG9ydC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0Jsb2J9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtjc3ZGb3JtYXRSb3dzfSBmcm9tICdkMy1kc3YnO1xuXG5pbXBvcnQge0VYUE9SVF9EQVRBX1RZUEV9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IEtlcGxlclRhYmxlLCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVJbmRleGVkRGF0YUNvbnRhaW5lcixcbiAgRGF0YUNvbnRhaW5lckludGVyZmFjZSxcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICBkb3dubG9hZEZpbGVcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dldEFwcGxpY2F0aW9uQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW50ZXJmYWNlIFN0YXRlVHlwZSB7XG4gIHZpc1N0YXRlOiB7ZGF0YXNldHM6IERhdGFzZXRzfTtcbiAgYXBwTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydERhdGEoc3RhdGU6IFN0YXRlVHlwZSwgb3B0aW9ucykge1xuICBjb25zdCB7dmlzU3RhdGUsIGFwcE5hbWV9ID0gc3RhdGU7XG4gIGNvbnN0IHtkYXRhc2V0c30gPSB2aXNTdGF0ZTtcbiAgY29uc3Qge3NlbGVjdGVkRGF0YXNldCwgZGF0YVR5cGUsIGZpbHRlcmVkfSA9IG9wdGlvbnM7XG4gIC8vIGdldCB0aGUgc2VsZWN0ZWQgZGF0YVxuICBjb25zdCBmaWxlbmFtZSA9IGFwcE5hbWUgPyBhcHBOYW1lIDogZ2V0QXBwbGljYXRpb25Db25maWcoKS5kZWZhdWx0RGF0YU5hbWU7XG4gIGNvbnN0IHNlbGVjdGVkRGF0YXNldHMgPSBkYXRhc2V0c1tzZWxlY3RlZERhdGFzZXRdXG4gICAgPyBbZGF0YXNldHNbc2VsZWN0ZWREYXRhc2V0XV1cbiAgICA6IE9iamVjdC52YWx1ZXMoZGF0YXNldHMpO1xuICBpZiAoIXNlbGVjdGVkRGF0YXNldHMubGVuZ3RoKSB7XG4gICAgLy8gZXJyb3I6IHNlbGVjdGVkIGRhdGFzZXQgbm90IGZvdW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGVjdGVkRGF0YXNldHMuZm9yRWFjaChzZWxlY3RlZERhdGEgPT4ge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHMsIGxhYmVsLCBmaWx0ZXJlZElkeENQVSA9IFtdfSA9IHNlbGVjdGVkRGF0YSBhcyBLZXBsZXJUYWJsZTtcbiAgICBjb25zdCB0b0V4cG9ydCA9IGZpbHRlcmVkXG4gICAgICA/IGNyZWF0ZUluZGV4ZWREYXRhQ29udGFpbmVyKGRhdGFDb250YWluZXIsIGZpbHRlcmVkSWR4Q1BVKVxuICAgICAgOiBkYXRhQ29udGFpbmVyO1xuXG4gICAgLy8gc3RhcnQgdG8gZXhwb3J0IGRhdGEgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGRhdGEgdHlwZVxuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgIGNhc2UgRVhQT1JUX0RBVEFfVFlQRS5DU1Y6IHtcbiAgICAgICAgY29uc3QgY3N2ID0gZm9ybWF0Q3N2KHRvRXhwb3J0LCBmaWVsZHMpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2Nzdl0sIHt0eXBlOiAndGV4dC9jc3YnfSk7XG4gICAgICAgIGRvd25sb2FkRmlsZShmaWxlQmxvYiwgYCR7ZmlsZW5hbWV9XyR7bGFiZWx9LmNzdmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmaWxlIHR5cGVzLlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBPbiBleHBvcnQgZGF0YSB0byBjc3ZcbiAqIEBwYXJhbSBkYXRhQ29udGFpbmVyXG4gKiBAcGFyYW0gZmllbGRzIGBkYXRhc2V0LmZpZWxkc2BcbiAqIEByZXR1cm5zIGNzdiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENzdihkYXRhOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBmaWVsZHM6IEZpZWxkW10pOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW5zID0gZmllbGRzLm1hcChmID0+IGYuZGlzcGxheU5hbWUgfHwgZi5uYW1lKTtcbiAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IFtjb2x1bW5zXTtcblxuICAvLyBwYXJzZSBnZW9qc29uIG9iamVjdCBhcyBzdHJpbmdcbiAgZm9yIChjb25zdCByb3cgb2YgZGF0YS5yb3dzKHRydWUpKSB7XG4gICAgZm9ybWF0dGVkRGF0YS5wdXNoKHJvdy5tYXAoKGQsIGkpID0+IHBhcnNlRmllbGRWYWx1ZShkLCBmaWVsZHNbaV0udHlwZSkpKTtcbiAgfVxuXG4gIHJldHVybiBjc3ZGb3JtYXRSb3dzKGZvcm1hdHRlZERhdGEpO1xufVxuXG5jb25zdCBleHBvcnRlcnMgPSB7XG4gIGV4cG9ydERhdGFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFJQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFLMEIsU0FBQUksMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJB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
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9kM0RzdiIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsImV4cG9ydERhdGEiLCJzdGF0ZSIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImFwcE5hbWUiLCJkYXRhc2V0cyIsInNlbGVjdGVkRGF0YXNldCIsImRhdGFUeXBlIiwiZmlsdGVyZWQiLCJmaWxlbmFtZSIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZGVmYXVsdERhdGFOYW1lIiwic2VsZWN0ZWREYXRhc2V0cyIsIk9iamVjdCIsInZhbHVlcyIsImZvckVhY2giLCJzZWxlY3RlZERhdGEiLCJfcmVmIiwiZGF0YUNvbnRhaW5lciIsImZpZWxkcyIsImxhYmVsIiwiX3JlZiRmaWx0ZXJlZElkeENQVSIsImZpbHRlcmVkSWR4Q1BVIiwidG9FeHBvcnQiLCJjcmVhdGVJbmRleGVkRGF0YUNvbnRhaW5lciIsIkVYUE9SVF9EQVRBX1RZUEUiLCJDU1YiLCJjc3YiLCJmb3JtYXRDc3YiLCJmaWxlQmxvYiIsIkJsb2IiLCJ0eXBlIiwiZG93bmxvYWRGaWxlIiwiY29uY2F0IiwiZGF0YSIsImNvbHVtbnMiLCJtYXAiLCJkaXNwbGF5TmFtZSIsImZvcm1hdHRlZERhdGEiLCJfaXRlcmF0b3IiLCJyb3dzIiwiX3N0ZXAiLCJyb3ciLCJwdXNoIiwiZCIsImkiLCJwYXJzZUZpZWxkVmFsdWUiLCJlcnIiLCJjc3ZGb3JtYXRSb3dzIiwiZXhwb3J0ZXJzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2V4cG9ydC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0Jsb2J9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtjc3ZGb3JtYXRSb3dzfSBmcm9tICdkMy1kc3YnO1xuXG5pbXBvcnQge0VYUE9SVF9EQVRBX1RZUEV9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IEtlcGxlclRhYmxlLCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVJbmRleGVkRGF0YUNvbnRhaW5lcixcbiAgRGF0YUNvbnRhaW5lckludGVyZmFjZSxcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICBkb3dubG9hZEZpbGVcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dldEFwcGxpY2F0aW9uQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW50ZXJmYWNlIFN0YXRlVHlwZSB7XG4gIHZpc1N0YXRlOiB7ZGF0YXNldHM6IERhdGFzZXRzfTtcbiAgYXBwTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydERhdGEoc3RhdGU6IFN0YXRlVHlwZSwgb3B0aW9ucykge1xuICBjb25zdCB7dmlzU3RhdGUsIGFwcE5hbWV9ID0gc3RhdGU7XG4gIGNvbnN0IHtkYXRhc2V0c30gPSB2aXNTdGF0ZTtcbiAgY29uc3Qge3NlbGVjdGVkRGF0YXNldCwgZGF0YVR5cGUsIGZpbHRlcmVkfSA9IG9wdGlvbnM7XG4gIC8vIGdldCB0aGUgc2VsZWN0ZWQgZGF0YVxuICBjb25zdCBmaWxlbmFtZSA9IGFwcE5hbWUgPyBhcHBOYW1lIDogZ2V0QXBwbGljYXRpb25Db25maWcoKS5kZWZhdWx0RGF0YU5hbWU7XG4gIGNvbnN0IHNlbGVjdGVkRGF0YXNldHMgPSBkYXRhc2V0c1tzZWxlY3RlZERhdGFzZXRdXG4gICAgPyBbZGF0YXNldHNbc2VsZWN0ZWREYXRhc2V0XV1cbiAgICA6IE9iamVjdC52YWx1ZXMoZGF0YXNldHMpO1xuICBpZiAoIXNlbGVjdGVkRGF0YXNldHMubGVuZ3RoKSB7XG4gICAgLy8gZXJyb3I6IHNlbGVjdGVkIGRhdGFzZXQgbm90IGZvdW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGVjdGVkRGF0YXNldHMuZm9yRWFjaChzZWxlY3RlZERhdGEgPT4ge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHMsIGxhYmVsLCBmaWx0ZXJlZElkeENQVSA9IFtdfSA9IHNlbGVjdGVkRGF0YSBhcyBLZXBsZXJUYWJsZTtcbiAgICBjb25zdCB0b0V4cG9ydCA9IGZpbHRlcmVkXG4gICAgICA/IGNyZWF0ZUluZGV4ZWREYXRhQ29udGFpbmVyKGRhdGFDb250YWluZXIsIGZpbHRlcmVkSWR4Q1BVKVxuICAgICAgOiBkYXRhQ29udGFpbmVyO1xuXG4gICAgLy8gc3RhcnQgdG8gZXhwb3J0IGRhdGEgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGRhdGEgdHlwZVxuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgIGNhc2UgRVhQT1JUX0RBVEFfVFlQRS5DU1Y6IHtcbiAgICAgICAgY29uc3QgY3N2ID0gZm9ybWF0Q3N2KHRvRXhwb3J0LCBmaWVsZHMpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2Nzdl0sIHt0eXBlOiAndGV4dC9jc3YnfSk7XG4gICAgICAgIGRvd25sb2FkRmlsZShmaWxlQmxvYiwgYCR7ZmlsZW5hbWV9XyR7bGFiZWx9LmNzdmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmaWxlIHR5cGVzLlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBPbiBleHBvcnQgZGF0YSB0byBjc3ZcbiAqIEBwYXJhbSBkYXRhQ29udGFpbmVyXG4gKiBAcGFyYW0gZmllbGRzIGBkYXRhc2V0LmZpZWxkc2BcbiAqIEByZXR1cm5zIGNzdiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENzdihkYXRhOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBmaWVsZHM6IEZpZWxkW10pOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW5zID0gZmllbGRzLm1hcChmID0+IGYuZGlzcGxheU5hbWUgfHwgZi5uYW1lKTtcbiAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IFtjb2x1bW5zXTtcblxuICAvLyBwYXJzZSBnZW9qc29uIG9iamVjdCBhcyBzdHJpbmdcbiAgZm9yIChjb25zdCByb3cgb2YgZGF0YS5yb3dzKHRydWUpKSB7XG4gICAgZm9ybWF0dGVkRGF0YS5wdXNoKHJvdy5tYXAoKGQsIGkpID0+IHBhcnNlRmllbGRWYWx1ZShkLCBmaWVsZHNbaV0udHlwZSwgZmllbGRzW2ldKSkpO1xuICB9XG5cbiAgcmV0dXJuIGNzdkZvcm1hdFJvd3MoZm9ybWF0dGVkRGF0YSk7XG59XG5cbmNvbnN0IGV4cG9ydGVycyA9IHtcbiAgZXhwb3J0RGF0YVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXhwb3J0ZXJzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUlBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUswQixTQUFBSSwyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEseUJBQUFDLE1BQUEsSUFBQUgsQ0FBQSxDQUFBRyxNQUFBLENBQUFDLFFBQUEsS0FB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