@kepler.gl/deckgl-layers 3.3.0-alpha.0 → 3.3.0-alpha.10

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 (201) hide show
  1. package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
  2. package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
  3. package/dist/cjs/3d-building-layer/types.js +6 -0
  4. package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
  5. package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
  6. package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
  7. package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
  8. package/dist/cjs/globe/atmosphere-layer.js +341 -0
  9. package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
  10. package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
  11. package/dist/cjs/globe/globe-layers.js +574 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +99 -0
  13. package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
  14. package/dist/cjs/globe/globe-view.js +404 -0
  15. package/dist/cjs/globe/index.js +140 -0
  16. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  17. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  18. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  19. package/dist/cjs/index.js +163 -0
  20. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  21. package/dist/cjs/layer-utils/cluster-utils.js +95 -0
  22. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  23. package/dist/cjs/layer-utils/globe-cell-utils.js +203 -0
  24. package/dist/cjs/layer-utils/globe-cell-utils.spec.js +118 -0
  25. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  26. package/dist/cjs/line-layer/line-layer.js +95 -0
  27. package/dist/cjs/raster/images.js +271 -0
  28. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  33. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  34. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  40. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  41. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  42. package/dist/cjs/raster/types.js +6 -0
  43. package/dist/cjs/raster/util.js +139 -0
  44. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  45. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  46. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  47. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  48. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  49. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  50. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  51. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  55. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  56. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  57. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  58. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  59. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  60. package/dist/cjs/raster/webgl/types.js +6 -0
  61. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  62. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  63. package/dist/cjs/wms/wms-layer.js +624 -0
  64. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  65. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  66. package/dist/esm/3d-building-layer/types.js +3 -0
  67. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  68. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  69. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  70. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  71. package/dist/esm/globe/atmosphere-layer.js +335 -0
  72. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  73. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  74. package/dist/esm/globe/globe-layers.js +566 -0
  75. package/dist/esm/globe/globe-stars-layer.js +92 -0
  76. package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
  77. package/dist/esm/globe/globe-view.js +398 -0
  78. package/dist/esm/globe/index.js +26 -0
  79. package/dist/esm/globe/mvt-label-layer.js +187 -0
  80. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  81. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  82. package/dist/esm/index.js +22 -0
  83. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  84. package/dist/esm/layer-utils/cluster-utils.js +89 -0
  85. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  86. package/dist/esm/layer-utils/globe-cell-utils.js +197 -0
  87. package/dist/esm/layer-utils/globe-cell-utils.spec.js +115 -0
  88. package/dist/esm/layer-utils/shader-utils.js +32 -0
  89. package/dist/esm/line-layer/line-layer.js +91 -0
  90. package/dist/esm/raster/images.js +267 -0
  91. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  95. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  96. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  97. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  102. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  103. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  104. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  105. package/dist/esm/raster/types.js +3 -0
  106. package/dist/esm/raster/util.js +134 -0
  107. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  108. package/dist/esm/raster/webgl/color/filter.js +52 -0
  109. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  110. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  111. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  112. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  113. package/dist/esm/raster/webgl/index.js +26 -0
  114. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  115. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  116. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  117. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  118. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  119. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  120. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  121. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  122. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  123. package/dist/esm/raster/webgl/types.js +3 -0
  124. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  125. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  126. package/dist/esm/wms/wms-layer.js +619 -0
  127. package/dist/globe/atmosphere-layer.d.ts +58 -0
  128. package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
  129. package/dist/globe/globe-depth-disk-layer.d.ts +19 -0
  130. package/dist/globe/globe-layers.d.ts +108 -0
  131. package/dist/globe/globe-stars-layer.d.ts +10 -0
  132. package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
  133. package/dist/globe/globe-view.d.ts +23 -0
  134. package/dist/globe/index.d.ts +8 -0
  135. package/dist/globe/mvt-label-layer.d.ts +7928 -0
  136. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +145 -56
  137. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +145 -56
  138. package/dist/index.d.ts +2 -0
  139. package/dist/layer-utils/aggregation-utils.d.ts +44 -0
  140. package/dist/layer-utils/cluster-utils.d.ts +6 -1
  141. package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
  142. package/dist/layer-utils/globe-cell-utils.spec.d.ts +1 -0
  143. package/dist/layer-utils/shader-utils.d.ts +1 -0
  144. package/dist/raster/images.d.ts +10 -1
  145. package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
  146. package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
  147. package/dist/raster/raster-processing-uniforms.d.ts +38 -0
  148. package/dist/raster/util.d.ts +15 -0
  149. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
  150. package/dist/wms/wms-layer.d.ts +32 -2
  151. package/package.json +37 -25
  152. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  153. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  154. package/dist/3d-building-layer/types.js +0 -6
  155. package/dist/cluster-layer/cluster-layer.js +0 -296
  156. package/dist/column-layer/enhanced-column-layer.js +0 -135
  157. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  158. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -69
  159. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -87
  160. package/dist/index.js +0 -140
  161. package/dist/layer-utils/cluster-utils.js +0 -93
  162. package/dist/layer-utils/cpu-aggregator.js +0 -798
  163. package/dist/layer-utils/shader-utils.js +0 -29
  164. package/dist/line-layer/line-layer.js +0 -95
  165. package/dist/raster/images.js +0 -259
  166. package/dist/raster/pipeline-validation-patch.js +0 -60
  167. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -129
  168. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  169. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  170. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  171. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  172. package/dist/raster/raster-layer/raster-layer.js +0 -256
  173. package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
  174. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  175. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  176. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  177. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  178. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  179. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  180. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -282
  181. package/dist/raster/types.js +0 -6
  182. package/dist/raster/util.js +0 -29
  183. package/dist/raster/webgl/color/colormap.js +0 -45
  184. package/dist/raster/webgl/color/filter.js +0 -58
  185. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  186. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  187. package/dist/raster/webgl/color/saturation.js +0 -42
  188. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  189. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  190. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  191. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  192. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  193. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  194. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  195. package/dist/raster/webgl/texture/mask.js +0 -50
  196. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  197. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  198. package/dist/raster/webgl/types.js +0 -6
  199. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -51
  200. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  201. package/dist/wms/wms-layer.js +0 -351
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
+ var _core = require("@deck.gl/core");
15
+ var _geoLayers = require("@deck.gl/geo-layers");
16
+ var _layers = require("@deck.gl/layers");
17
+ var _constants = require("@kepler.gl/constants");
18
+ var _dBuildingUtils = require("./3d-building-utils");
19
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
22
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT
23
+ // Copyright contributors to the kepler.gl project
24
+ var ThreeDBuildingLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
25
+ function ThreeDBuildingLayer() {
26
+ (0, _classCallCheck2["default"])(this, ThreeDBuildingLayer);
27
+ return _callSuper(this, ThreeDBuildingLayer, arguments);
28
+ }
29
+ (0, _inherits2["default"])(ThreeDBuildingLayer, _CompositeLayer);
30
+ return (0, _createClass2["default"])(ThreeDBuildingLayer, [{
31
+ key: "renderSubLayers",
32
+ value:
33
+ // this layer add its subLayers to the redux store, and push sample data
34
+
35
+ function renderSubLayers(props) {
36
+ return new _layers.SolidPolygonLayer(_objectSpread(_objectSpread({}, props), {}, {
37
+ parameters: _constants.BLEND_PARAMS_ALPHA,
38
+ extruded: true,
39
+ opacity: 1,
40
+ filled: true,
41
+ getElevation: function getElevation(feature) {
42
+ return feature.properties.height || 0;
43
+ },
44
+ getPolygon: function getPolygon(feature) {
45
+ return feature.coordinates;
46
+ },
47
+ getFillColor: this.props.threeDBuildingColor
48
+ }));
49
+ }
50
+ }, {
51
+ key: "renderLayers",
52
+ value: function renderLayers() {
53
+ var _this = this;
54
+ return [new _geoLayers.TileLayer({
55
+ id: "".concat(this.id, "-deck-3d-building"),
56
+ getTileData: function getTileData(tile) {
57
+ return (0, _dBuildingUtils.getTileData)(_this.props.mapboxApiUrl, _this.props.mapboxApiAccessToken, tile);
58
+ },
59
+ minZoom: 13,
60
+ renderSubLayers: this.renderSubLayers.bind(this),
61
+ updateTriggers: this.props.updateTriggers
62
+ })];
63
+ }
64
+ }]);
65
+ }(_core.CompositeLayer);
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfZ2VvTGF5ZXJzIiwiX2xheWVycyIsIl9jb25zdGFudHMiLCJfZEJ1aWxkaW5nVXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIlRocmVlREJ1aWxkaW5nTGF5ZXIiLCJleHBvcnRzIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJyZW5kZXJTdWJMYXllcnMiLCJwcm9wcyIsIlNvbGlkUG9seWdvbkxheWVyIiwicGFyYW1ldGVycyIsIkJMRU5EX1BBUkFNU19BTFBIQSIsImV4dHJ1ZGVkIiwib3BhY2l0eSIsImZpbGxlZCIsImdldEVsZXZhdGlvbiIsImZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiaGVpZ2h0IiwiZ2V0UG9seWdvbiIsImNvb3JkaW5hdGVzIiwiZ2V0RmlsbENvbG9yIiwidGhyZWVEQnVpbGRpbmdDb2xvciIsInJlbmRlckxheWVycyIsIl90aGlzIiwiRGVja0dMVGlsZUxheWVyIiwiaWQiLCJjb25jYXQiLCJnZXRUaWxlRGF0YSIsInRpbGUiLCJtYXBib3hBcGlVcmwiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1pblpvb20iLCJiaW5kIiwidXBkYXRlVHJpZ2dlcnMiLCJDb21wb3NpdGVMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy8zZC1idWlsZGluZy1sYXllci8zZC1idWlsZGluZy1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0NvbXBvc2l0ZUxheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGlsZUxheWVyIGFzIERlY2tHTFRpbGVMYXllcn0gZnJvbSAnQGRlY2suZ2wvZ2VvLWxheWVycyc7XG5pbXBvcnQge1NvbGlkUG9seWdvbkxheWVyLCBTb2xpZFBvbHlnb25MYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtCTEVORF9QQVJBTVNfQUxQSEF9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtnZXRUaWxlRGF0YX0gZnJvbSAnLi8zZC1idWlsZGluZy11dGlscyc7XG5pbXBvcnQge1RocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcywgVGlsZURhdGFJdGVtLCBUaWxlTG9hZFByb3BzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVEQnVpbGRpbmdMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyPFRocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcz4ge1xuICAvLyB0aGlzIGxheWVyIGFkZCBpdHMgc3ViTGF5ZXJzIHRvIHRoZSByZWR1eCBzdG9yZSwgYW5kIHB1c2ggc2FtcGxlIGRhdGFcblxuICByZW5kZXJTdWJMYXllcnMocHJvcHM6IFNvbGlkUG9seWdvbkxheWVyUHJvcHM8YW55Pikge1xuICAgIHJldHVybiBuZXcgU29saWRQb2x5Z29uTGF5ZXI8VGlsZURhdGFJdGVtPih7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHBhcmFtZXRlcnM6IEJMRU5EX1BBUkFNU19BTFBIQSxcbiAgICAgIGV4dHJ1ZGVkOiB0cnVlLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIGZpbGxlZDogdHJ1ZSxcbiAgICAgIGdldEVsZXZhdGlvbjogKGZlYXR1cmU6IFRpbGVEYXRhSXRlbSkgPT4gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCAwLFxuICAgICAgZ2V0UG9seWdvbjogKGZlYXR1cmU6IFRpbGVEYXRhSXRlbSkgPT4gZmVhdHVyZS5jb29yZGluYXRlcyxcbiAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5wcm9wcy50aHJlZURCdWlsZGluZ0NvbG9yXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXJMYXllcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBEZWNrR0xUaWxlTGF5ZXIoe1xuICAgICAgICBpZDogYCR7dGhpcy5pZH0tZGVjay0zZC1idWlsZGluZ2AgYXMgc3RyaW5nLFxuICAgICAgICBnZXRUaWxlRGF0YTogKHRpbGU6IFRpbGVMb2FkUHJvcHMpID0+XG4gICAgICAgICAgZ2V0VGlsZURhdGEodGhpcy5wcm9wcy5tYXBib3hBcGlVcmwsIHRoaXMucHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW4sIHRpbGUpLFxuICAgICAgICBtaW5ab29tOiAxMyxcbiAgICAgICAgcmVuZGVyU3ViTGF5ZXJzOiB0aGlzLnJlbmRlclN1YkxheWVycy5iaW5kKHRoaXMpLFxuICAgICAgICB1cGRhdGVUcmlnZ2VyczogdGhpcy5wcm9wcy51cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxlQUFBLEdBQUFKLE9BQUE7QUFBZ0QsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUE7QUFBQSxTQUFBb0IsV0FBQWxCLENBQUEsRUFBQUksQ0FBQSxFQUFBTixDQUFBLFdBQUFNLENBQUEsT0FBQWUsZ0JBQUEsYUFBQWYsQ0FBQSxPQUFBZ0IsMkJBQUEsYUFBQXBCLENBQUEsRUFBQXFCLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBbkIsQ0FBQSxFQUFBTixDQUFBLFlBQUFxQixnQkFBQSxhQUFBbkIsQ0FBQSxFQUFBd0IsV0FBQSxJQUFBcEIsQ0FBQSxDQUFBSyxLQUFBLENBQUFULENBQUEsRUFBQUYsQ0FBQTtBQUFBLFNBQUF1QiwwQkFBQSxjQUFBckIsQ0FBQSxJQUFBeUIsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQUMsSUFBQSxDQUFBTixPQUFBLENBQUFDLFNBQUEsQ0FBQUUsT0FBQSxpQ0FBQXpCLENBQUEsYUFBQXFCLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFyQixDQUFBLFVBUmhEO0FBQ0E7QUFBQSxJQVVxQjZCLG1CQUFtQixHQUFBQyxPQUFBLHFDQUFBQyxlQUFBO0VBQUEsU0FBQUYsb0JBQUE7SUFBQSxJQUFBRyxnQkFBQSxtQkFBQUgsbUJBQUE7SUFBQSxPQUFBWCxVQUFBLE9BQUFXLG1CQUFBLEVBQUFsQixTQUFBO0VBQUE7RUFBQSxJQUFBc0IsVUFBQSxhQUFBSixtQkFBQSxFQUFBRSxlQUFBO0VBQUEsV0FBQUcsYUFBQSxhQUFBTCxtQkFBQTtJQUFBTSxHQUFBO0lBQUFDLEtBQUE7SUFDdEM7O0lBRUEsU0FBQUMsZUFBZUEsQ0FBQ0MsS0FBa0MsRUFBRTtNQUNsRCxPQUFPLElBQUlDLHlCQUFpQixDQUFBN0IsYUFBQSxDQUFBQSxhQUFBLEtBQ3ZCNEIsS0FBSztRQUNSRSxVQUFVLEVBQUVDLDZCQUFrQjtRQUM5QkMsUUFBUSxFQUFFLElBQUk7UUFDZEMsT0FBTyxFQUFFLENBQUM7UUFDVkMsTUFBTSxFQUFFLElBQUk7UUFDWkMsWUFBWSxFQUFFLFNBQWRBLFlBQVlBLENBQUdDLE9BQXFCO1VBQUEsT0FBS0EsT0FBTyxDQUFDQyxVQUFVLENBQUNDLE1BQU0sSUFBSSxDQUFDO1FBQUE7UUFDdkVDLFVBQVUsRUFBRSxTQUFaQSxVQUFVQSxDQUFHSCxPQUFxQjtVQUFBLE9BQUtBLE9BQU8sQ0FBQ0ksV0FBVztRQUFBO1FBQzFEQyxZQUFZLEVBQUUsSUFBSSxDQUFDYixLQUFLLENBQUNjO01BQW1CLEVBQzdDLENBQUM7SUFDSjtFQUFDO0lBQUFqQixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBaUIsWUFBWUEsQ0FBQSxFQUFHO01BQUEsSUFBQUMsS0FBQTtNQUNiLE9BQU8sQ0FDTCxJQUFJQyxvQkFBZSxDQUFDO1FBQ2xCQyxFQUFFLEtBQUFDLE1BQUEsQ0FBSyxJQUFJLENBQUNELEVBQUUsc0JBQTZCO1FBQzNDRSxXQUFXLEVBQUUsU0FBYkEsV0FBV0EsQ0FBR0MsSUFBbUI7VUFBQSxPQUMvQixJQUFBRCwyQkFBVyxFQUFDSixLQUFJLENBQUNoQixLQUFLLENBQUNzQixZQUFZLEVBQUVOLEtBQUksQ0FBQ2hCLEtBQUssQ0FBQ3VCLG9CQUFvQixFQUFFRixJQUFJLENBQUM7UUFBQTtRQUM3RUcsT0FBTyxFQUFFLEVBQUU7UUFDWHpCLGVBQWUsRUFBRSxJQUFJLENBQUNBLGVBQWUsQ0FBQzBCLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaERDLGNBQWMsRUFBRSxJQUFJLENBQUMxQixLQUFLLENBQUMwQjtNQUM3QixDQUFDLENBQUMsQ0FDSDtJQUNIO0VBQUM7QUFBQSxFQTNCOENDLG9CQUFjIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.decodeTile = decodeTile;
8
+ exports.getTileData = getTileData;
9
+ exports.vectorTileFeatureToProp = vectorTileFeatureToProp;
10
+ var _pbf = _interopRequireDefault(require("pbf"));
11
+ var _vectorTile = require("@mapbox/vector-tile");
12
+ var _viewportMercatorProject = require("viewport-mercator-project");
13
+ // SPDX-License-Identifier: MIT
14
+ // Copyright contributors to the kepler.gl project
15
+
16
+ /* global fetch */
17
+ var TILE_SIZE = 512;
18
+ var MAPBOX_HOST = 'https://a.tiles.mapbox.com';
19
+ var MAP_SOURCE = '/v4/mapbox.mapbox-streets-v7';
20
+ function getTileData(host, token, _ref) {
21
+ var _ref$index = _ref.index,
22
+ x = _ref$index.x,
23
+ y = _ref$index.y,
24
+ z = _ref$index.z;
25
+ var mapSource = "".concat(host || MAPBOX_HOST).concat(MAP_SOURCE, "/").concat(z, "/").concat(x, "/").concat(y, ".vector.pbf?access_token=").concat(token);
26
+ return fetch(mapSource).then(function (response) {
27
+ return response.arrayBuffer();
28
+ }).then(function (buffer) {
29
+ return decodeTile(x, y, z, buffer);
30
+ });
31
+ }
32
+ function decodeTile(x, y, z, arrayBuffer) {
33
+ var tile = new _vectorTile.VectorTile(new _pbf["default"](arrayBuffer));
34
+ var result = [];
35
+ var xProj = x * TILE_SIZE;
36
+ var yProj = y * TILE_SIZE;
37
+ var scale = Math.pow(2, z);
38
+ var projectFunc = project.bind(null, xProj, yProj, scale);
39
+
40
+ /* eslint-disable guard-for-in */
41
+ var layerName = 'building';
42
+ var vectorTileLayer = tile.layers[layerName];
43
+ if (!vectorTileLayer) {
44
+ return [];
45
+ }
46
+ for (var i = 0; i < vectorTileLayer.length; i++) {
47
+ var vectorTileFeature = vectorTileLayer.feature(i);
48
+ // @ts-ignore
49
+ var features = vectorTileFeatureToProp(vectorTileFeature, projectFunc);
50
+ features.forEach(function (f) {
51
+ f.properties.layer = layerName;
52
+ if (f.properties.height) {
53
+ result.push(f);
54
+ }
55
+ });
56
+ }
57
+ return result;
58
+ }
59
+ function project(x, y, scale, line, extent) {
60
+ var sizeToPixel = extent / TILE_SIZE;
61
+ for (var ii = 0; ii < line.length; ii++) {
62
+ var p = line[ii];
63
+ // LNGLAT
64
+ line[ii] = (0, _viewportMercatorProject.worldToLngLat)([x + p[0] / sizeToPixel, y + p[1] / sizeToPixel], scale);
65
+ }
66
+ }
67
+
68
+ /* adapted from @mapbox/vector-tile/lib/vectortilefeature.js for better perf */
69
+ /* eslint-disable */
70
+ function vectorTileFeatureToProp(vectorTileFeature, project) {
71
+ var coords = getCoordinates(vectorTileFeature);
72
+ var extent = vectorTileFeature.extent;
73
+ var i;
74
+ var j;
75
+ coords = classifyRings(coords);
76
+ for (i = 0; i < coords.length; i++) {
77
+ for (j = 0; j < coords[i].length; j++) {
78
+ project(coords[i][j], extent);
79
+ }
80
+ }
81
+ return coords.map(function (coordinates) {
82
+ return {
83
+ coordinates: coordinates,
84
+ properties: vectorTileFeature.properties
85
+ };
86
+ });
87
+ }
88
+ function getCoordinates(vectorTileFeature) {
89
+ var pbf = vectorTileFeature._pbf;
90
+ pbf.pos = vectorTileFeature._geometry;
91
+ var end = pbf.readVarint() + pbf.pos;
92
+ var cmd = 1;
93
+ var length = 0;
94
+ var x = 0;
95
+ var y = 0;
96
+ var lines = [];
97
+ var line;
98
+ while (pbf.pos < end) {
99
+ if (length <= 0) {
100
+ var cmdLen = pbf.readVarint();
101
+ cmd = cmdLen & 0x7;
102
+ length = cmdLen >> 3;
103
+ }
104
+ length--;
105
+ if (cmd === 1 || cmd === 2) {
106
+ x += pbf.readSVarint();
107
+ y += pbf.readSVarint();
108
+ if (cmd === 1) {
109
+ // moveTo
110
+ if (line) lines.push(line);
111
+ line = [];
112
+ }
113
+ if (line) line.push([x, y]);
114
+ } else if (cmd === 7) {
115
+ // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
116
+ if (line) {
117
+ line.push(line[0].slice()); // closePolygon
118
+ }
119
+ } else {
120
+ throw new Error("unknown command ".concat(cmd));
121
+ }
122
+ }
123
+ if (line) lines.push(line);
124
+ return lines;
125
+ }
126
+
127
+ // classifies an array of rings into polygons with outer rings and holes
128
+
129
+ function classifyRings(rings) {
130
+ var len = rings.length;
131
+ if (len <= 1) return [rings];
132
+ var polygons = [];
133
+ var polygon;
134
+ var ccw;
135
+ for (var i = 0; i < len; i++) {
136
+ var area = signedArea(rings[i]);
137
+ if (area === 0) {
138
+ continue;
139
+ }
140
+ if (ccw === undefined) {
141
+ ccw = area < 0;
142
+ }
143
+ if (ccw === area < 0) {
144
+ if (polygon) {
145
+ polygons.push(polygon);
146
+ }
147
+ polygon = [rings[i]];
148
+ } else if (polygon) {
149
+ polygon.push(rings[i]);
150
+ }
151
+ }
152
+ if (polygon) {
153
+ polygons.push(polygon);
154
+ }
155
+ return polygons;
156
+ }
157
+ function signedArea(ring) {
158
+ var sum = 0;
159
+ for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
160
+ p1 = ring[i];
161
+ p2 = ring[j];
162
+ sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);
163
+ }
164
+ return sum;
165
+ }
166
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGJmIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdmVjdG9yVGlsZSIsIl92aWV3cG9ydE1lcmNhdG9yUHJvamVjdCIsIlRJTEVfU0laRSIsIk1BUEJPWF9IT1NUIiwiTUFQX1NPVVJDRSIsImdldFRpbGVEYXRhIiwiaG9zdCIsInRva2VuIiwiX3JlZiIsIl9yZWYkaW5kZXgiLCJpbmRleCIsIngiLCJ5IiwieiIsIm1hcFNvdXJjZSIsImNvbmNhdCIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwiYXJyYXlCdWZmZXIiLCJidWZmZXIiLCJkZWNvZGVUaWxlIiwidGlsZSIsIlZlY3RvclRpbGUiLCJQcm90b2J1ZiIsInJlc3VsdCIsInhQcm9qIiwieVByb2oiLCJzY2FsZSIsIk1hdGgiLCJwb3ciLCJwcm9qZWN0RnVuYyIsInByb2plY3QiLCJiaW5kIiwibGF5ZXJOYW1lIiwidmVjdG9yVGlsZUxheWVyIiwibGF5ZXJzIiwiaSIsImxlbmd0aCIsInZlY3RvclRpbGVGZWF0dXJlIiwiZmVhdHVyZSIsImZlYXR1cmVzIiwidmVjdG9yVGlsZUZlYXR1cmVUb1Byb3AiLCJmb3JFYWNoIiwiZiIsInByb3BlcnRpZXMiLCJsYXllciIsImhlaWdodCIsInB1c2giLCJsaW5lIiwiZXh0ZW50Iiwic2l6ZVRvUGl4ZWwiLCJpaSIsInAiLCJ3b3JsZFRvTG5nTGF0IiwiY29vcmRzIiwiZ2V0Q29vcmRpbmF0ZXMiLCJqIiwiY2xhc3NpZnlSaW5ncyIsIm1hcCIsImNvb3JkaW5hdGVzIiwicGJmIiwicG9zIiwiX2dlb21ldHJ5IiwiZW5kIiwicmVhZFZhcmludCIsImNtZCIsImxpbmVzIiwiY21kTGVuIiwicmVhZFNWYXJpbnQiLCJzbGljZSIsIkVycm9yIiwicmluZ3MiLCJsZW4iLCJwb2x5Z29ucyIsInBvbHlnb24iLCJjY3ciLCJhcmVhIiwic2lnbmVkQXJlYSIsInVuZGVmaW5lZCIsInJpbmciLCJzdW0iLCJwMSIsInAyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjLzNkLWJ1aWxkaW5nLWxheWVyLzNkLWJ1aWxkaW5nLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBQcm90b2J1ZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlfSBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmltcG9ydCB7d29ybGRUb0xuZ0xhdH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge1xuICBDb29yZGluYXRlcyxcbiAgRmxhdEZpZ3VyZSxcbiAgVGlsZURhdGFJdGVtLFxuICBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiBnbG9iYWwgZmV0Y2ggKi9cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjtcbmNvbnN0IE1BUEJPWF9IT1NUID0gJ2h0dHBzOi8vYS50aWxlcy5tYXBib3guY29tJztcbmNvbnN0IE1BUF9TT1VSQ0UgPSAnL3Y0L21hcGJveC5tYXBib3gtc3RyZWV0cy12Nyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWxlRGF0YShcbiAgaG9zdDogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICB7aW5kZXg6IHt4LCB5LCB6fX06IHtpbmRleDogQ29vcmRpbmF0ZXN9XG4pOiBQcm9taXNlPFRpbGVEYXRhSXRlbVtdPiB7XG4gIGNvbnN0IG1hcFNvdXJjZSA9IGAke1xuICAgIGhvc3QgfHwgTUFQQk9YX0hPU1RcbiAgfSR7TUFQX1NPVVJDRX0vJHt6fS8ke3h9LyR7eX0udmVjdG9yLnBiZj9hY2Nlc3NfdG9rZW49JHt0b2tlbn1gO1xuXG4gIHJldHVybiBmZXRjaChtYXBTb3VyY2UpXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAudGhlbihidWZmZXIgPT4gZGVjb2RlVGlsZSh4LCB5LCB6LCBidWZmZXIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRpbGUoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB6OiBudW1iZXIsXG4gIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxuKTogVGlsZURhdGFJdGVtW10ge1xuICBjb25zdCB0aWxlID0gbmV3IFZlY3RvclRpbGUobmV3IFByb3RvYnVmKGFycmF5QnVmZmVyKSk7XG5cbiAgY29uc3QgcmVzdWx0OiBUaWxlRGF0YUl0ZW1bXSA9IFtdO1xuICBjb25zdCB4UHJvaiA9IHggKiBUSUxFX1NJWkU7XG4gIGNvbnN0IHlQcm9qID0geSAqIFRJTEVfU0laRTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6KTtcblxuICBjb25zdCBwcm9qZWN0RnVuYyA9IHByb2plY3QuYmluZChudWxsLCB4UHJvaiwgeVByb2osIHNjYWxlKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbiAgY29uc3QgbGF5ZXJOYW1lID0gJ2J1aWxkaW5nJztcbiAgY29uc3QgdmVjdG9yVGlsZUxheWVyID0gdGlsZS5sYXllcnNbbGF5ZXJOYW1lXTtcbiAgaWYgKCF2ZWN0b3JUaWxlTGF5ZXIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZWN0b3JUaWxlTGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVMYXllci5mZWF0dXJlKGkpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBmZWF0dXJlcyA9IHZlY3RvclRpbGVGZWF0dXJlVG9Qcm9wKHZlY3RvclRpbGVGZWF0dXJlLCBwcm9qZWN0RnVuYyk7XG4gICAgZmVhdHVyZXMuZm9yRWFjaChmID0+IHtcbiAgICAgIGYucHJvcGVydGllcy5sYXllciA9IGxheWVyTmFtZTtcbiAgICAgIGlmIChmLnByb3BlcnRpZXMuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGxpbmU6IEZsYXRGaWd1cmUsIGV4dGVudDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHNpemVUb1BpeGVsID0gZXh0ZW50IC8gVElMRV9TSVpFO1xuXG4gIGZvciAobGV0IGlpID0gMDsgaWkgPCBsaW5lLmxlbmd0aDsgaWkrKykge1xuICAgIGNvbnN0IHAgPSBsaW5lW2lpXTtcbiAgICAvLyBMTkdMQVRcbiAgICBsaW5lW2lpXSA9IHdvcmxkVG9MbmdMYXQoW3ggKyBwWzBdIC8gc2l6ZVRvUGl4ZWwsIHkgKyBwWzFdIC8gc2l6ZVRvUGl4ZWxdLCBzY2FsZSk7XG4gIH1cbn1cblxuLyogYWRhcHRlZCBmcm9tIEBtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIGZvciBiZXR0ZXIgcGVyZiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JUaWxlRmVhdHVyZVRvUHJvcChcbiAgdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICBwcm9qZWN0OiAocjogRmxhdEZpZ3VyZSwgbjogbnVtYmVyKSA9PiB2b2lkXG4pOiB7Y29vcmRpbmF0ZXM6IEZsYXRGaWd1cmVbXTsgcHJvcGVydGllczogVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzfVtdIHtcbiAgbGV0IGNvb3JkczogRmxhdEZpZ3VyZVtdW10gfCBGbGF0RmlndXJlW10gPSBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZSk7XG4gIGNvbnN0IGV4dGVudCA9IHZlY3RvclRpbGVGZWF0dXJlLmV4dGVudDtcbiAgbGV0IGk6IG51bWJlcjtcbiAgbGV0IGo6IG51bWJlcjtcblxuICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgZXh0ZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29vcmRzLm1hcChjb29yZGluYXRlcyA9PiAoe1xuICAgIGNvb3JkaW5hdGVzLFxuICAgIHByb3BlcnRpZXM6IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXNcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUpOiBGbGF0RmlndXJlW10ge1xuICBjb25zdCBwYmYgPSB2ZWN0b3JUaWxlRmVhdHVyZS5fcGJmO1xuICBwYmYucG9zID0gdmVjdG9yVGlsZUZlYXR1cmUuX2dlb21ldHJ5O1xuXG4gIGNvbnN0IGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuICBsZXQgY21kID0gMTtcbiAgbGV0IGxlbmd0aCA9IDA7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuXG4gIGNvbnN0IGxpbmVzOiBGbGF0RmlndXJlW10gPSBbXTtcbiAgbGV0IGxpbmU6IEZsYXRGaWd1cmUgfCB1bmRlZmluZWQ7XG5cbiAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICB9XG5cbiAgICBsZW5ndGgtLTtcblxuICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgaWYgKGNtZCA9PT0gMSkge1xuICAgICAgICAvLyBtb3ZlVG9cbiAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIGxpbmUgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmUpIGxpbmUucHVzaChbeCwgeV0pO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxpbmUucHVzaChsaW5lWzBdLnNsaWNlKCkgYXMgW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gY29tbWFuZCAke2NtZH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICByZXR1cm4gbGluZXM7XG59XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzOiBGbGF0RmlndXJlW10pOiBGbGF0RmlndXJlW11bXSB7XG4gIGNvbnN0IGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gIGNvbnN0IHBvbHlnb25zOiBGbGF0RmlndXJlW11bXSA9IFtdO1xuICBsZXQgcG9seWdvbjogRmxhdEZpZ3VyZVtdIHwgdW5kZWZpbmVkO1xuICBsZXQgY2N3OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgaWYgKGFyZWEgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2N3ID0gYXJlYSA8IDA7XG4gICAgfVxuXG4gICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgIGlmIChwb2x5Z29uKSB7XG4gICAgICAgIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICB9XG4gICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcbiAgICB9IGVsc2UgaWYgKHBvbHlnb24pIHtcbiAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChwb2x5Z29uKSB7XG4gICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgfVxuXG4gIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nOiBGbGF0RmlndXJlKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxOiBudW1iZXJbXSwgcDI6IG51bWJlcltdOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgcDEgPSByaW5nW2ldO1xuICAgIHAyID0gcmluZ1tqXTtcbiAgICBzdW0gKz0gKHAyWzBdIC0gcDFbMF0pICogKHAxWzFdICsgcDJbMV0pO1xuICB9XG4gIHJldHVybiBzdW07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUdBLElBQUFBLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHdCQUFBLEdBQUFGLE9BQUE7QUFMQTtBQUNBOztBQWFBO0FBQ0EsSUFBTUcsU0FBUyxHQUFHLEdBQUc7QUFDckIsSUFBTUMsV0FBVyxHQUFHLDRCQUE0QjtBQUNoRCxJQUFNQyxVQUFVLEdBQUcsOEJBQThCO0FBRTFD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
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjLzNkLWJ1aWxkaW5nLWxheWVyL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7UkdCQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBUaWxlSW5kZXggPSB7eDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIFRpbGVMb2FkUHJvcHMgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIGluZGV4OiBUaWxlSW5kZXg7XG4gIGJib3g6IGFueTtcbiAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHVzZXJEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgem9vbT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcyA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHN0cmluZztcbiAgbWFwYm94QXBpVXJsOiBzdHJpbmc7XG4gIHRocmVlREJ1aWxkaW5nQ29sb3I6IFJHQkNvbG9yO1xuICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgIGdldEZpbGxDb2xvcjogUkdCQ29sb3I7XG4gIH07XG59O1xuZXhwb3J0IHR5cGUgQ29vcmRpbmF0ZXMgPSB7eDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcn07XG4vLyBUT0RPIHJlbmFtZVxuZXhwb3J0IHR5cGUgRmxhdEZpZ3VyZSA9IChbbnVtYmVyLCBudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdO1xuZXhwb3J0IHR5cGUgVGlsZURhdGFJdGVtID0ge2Nvb3JkaW5hdGVzOiBGbGF0RmlndXJlW107IHByb3BlcnRpZXM6IFZlY3RvclRpbGVGZWF0dXJlUHJvcGVydGllc307XG5leHBvcnQgdHlwZSBWZWN0b3JUaWxlRmVhdHVyZVByb3BlcnRpZXMgPSB7bGF5ZXI6IHN0cmluZzsgaGVpZ2h0PzogbnVtYmVyfTtcbmV4cG9ydCB0eXBlIFZlY3RvclRpbGVGZWF0dXJlID0ge1xuICBleHRlbnQ6IG51bWJlcjtcbiAgcHJvcGVydGllczogVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzO1xuICBfcGJmOiB7XG4gICAgYnVmOiBBcnJheUJ1ZmZlcjtcbiAgICBwb3M6IG51bWJlcjtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgcmVhZFZhcmludDogKGI/OiBib29sZWFuKSA9PiBudW1iZXI7XG4gICAgcmVhZFNWYXJpbnQ6ICgpID0+IG51bWJlcjtcbiAgfTtcbiAgX2dlb21ldHJ5OiBudW1iZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = exports.clusterAggregation = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+ var _core = require("@deck.gl/core");
16
+ var _layers = require("@deck.gl/layers");
17
+ var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
18
+ var _cpuAggregator = _interopRequireWildcard(require("../layer-utils/cpu-aggregator"));
19
+ var _viewportMercatorProject = require("viewport-mercator-project");
20
+ var _d3Array = require("d3-array");
21
+ var _constants = require("@kepler.gl/constants");
22
+ var _clusterUtils = _interopRequireWildcard(require("../layer-utils/cluster-utils"));
23
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
27
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT
28
+ // Copyright contributors to the kepler.gl project
29
+ var defaultRadius = _constants.LAYER_VIS_CONFIGS.clusterRadius.defaultValue;
30
+ var defaultRadiusRange = _constants.LAYER_VIS_CONFIGS.clusterRadiusRange.defaultValue;
31
+ var defaultGetColorValue = function defaultGetColorValue(points) {
32
+ return points.length;
33
+ };
34
+ var defaultGetRadiusValue = function defaultGetRadiusValue(cell) {
35
+ return cell.filteredPoints ? cell.filteredPoints.length : cell.points.length;
36
+ };
37
+
38
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
+ function processGeoJSON(step, props, aggregation, _ref) {
40
+ var viewport = _ref.viewport;
41
+ var data = props.data,
42
+ getPosition = props.getPosition,
43
+ filterData = props.filterData;
44
+ var geoJSON = (0, _clusterUtils.getGeoJSON)(data, getPosition, filterData);
45
+ var clusterBuilder = new _clusterUtils["default"]();
46
+ this.setState({
47
+ geoJSON: geoJSON,
48
+ clusterBuilder: clusterBuilder
49
+ });
50
+ }
51
+
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ function getClusters(step, props, aggregation, _ref2) {
54
+ var _clusterBuilder$clust;
55
+ var viewport = _ref2.viewport;
56
+ var _this$state = this.state,
57
+ geoJSON = _this$state.geoJSON,
58
+ clusterBuilder = _this$state.clusterBuilder;
59
+ var clusterRadius = props.clusterRadius,
60
+ zoom = props.zoom,
61
+ width = props.width,
62
+ height = props.height;
63
+ var longitude = viewport.longitude,
64
+ latitude = viewport.latitude;
65
+
66
+ // zoom needs to be an integer for the different map utils. Also helps with cache key.
67
+ var bbox = _geoViewport["default"].bounds([longitude, latitude], zoom, [width, height]);
68
+ var clusters = (_clusterBuilder$clust = clusterBuilder === null || clusterBuilder === void 0 ? void 0 : clusterBuilder.clustersAtZoom({
69
+ bbox: bbox,
70
+ clusterRadius: clusterRadius,
71
+ geoJSON: geoJSON,
72
+ zoom: zoom
73
+ })) !== null && _clusterBuilder$clust !== void 0 ? _clusterBuilder$clust : [];
74
+ this.setState({
75
+ layerData: {
76
+ data: clusters
77
+ }
78
+ });
79
+ }
80
+ function getSubLayerRadius(dimensionState, dimension, layerProps) {
81
+ return function (cell) {
82
+ var getRadiusValue = layerProps.getRadiusValue;
83
+ var scaleFunc = dimensionState.scaleFunc;
84
+ return scaleFunc(getRadiusValue(cell));
85
+ };
86
+ }
87
+ var clusterAggregation = exports.clusterAggregation = {
88
+ key: 'position',
89
+ updateSteps: [{
90
+ key: 'geojson',
91
+ triggers: {
92
+ position: {
93
+ prop: 'getPosition',
94
+ updateTrigger: 'getPosition'
95
+ },
96
+ filterData: {
97
+ prop: 'filterData',
98
+ updateTrigger: 'filterData'
99
+ }
100
+ },
101
+ updater: processGeoJSON
102
+ }, {
103
+ key: 'clustering',
104
+ triggers: {
105
+ clusterRadius: {
106
+ prop: 'clusterRadius'
107
+ },
108
+ zoom: {
109
+ prop: 'zoom'
110
+ },
111
+ width: {
112
+ prop: 'width'
113
+ },
114
+ height: {
115
+ prop: 'height'
116
+ }
117
+ },
118
+ updater: getClusters
119
+ }]
120
+ };
121
+ function getRadiusValueDomain(step, props, dimensionUpdater) {
122
+ var key = dimensionUpdater.key;
123
+ var getRadiusValue = props.getRadiusValue;
124
+ var layerData = this.state.layerData;
125
+ var valueDomain = [0, (0, _d3Array.max)(layerData.data, getRadiusValue)];
126
+ this._setDimensionState(key, {
127
+ valueDomain: valueDomain
128
+ });
129
+ }
130
+ var clusterLayerDimensions = [_cpuAggregator.defaultColorDimension, {
131
+ key: 'radius',
132
+ accessor: 'getRadius',
133
+ nullValue: 0,
134
+ updateSteps: [{
135
+ key: 'getDomain',
136
+ triggers: {
137
+ value: {
138
+ prop: 'getRadiusValue',
139
+ updateTrigger: 'getRadiusValue'
140
+ }
141
+ },
142
+ updater: getRadiusValueDomain
143
+ }, {
144
+ key: 'getScaleFunc',
145
+ triggers: {
146
+ domain: {
147
+ prop: 'radiusDomain'
148
+ },
149
+ range: {
150
+ prop: 'radiusRange'
151
+ },
152
+ scaleType: {
153
+ prop: 'radiusScaleType'
154
+ }
155
+ },
156
+ updater: _cpuAggregator.getDimensionScale
157
+ }],
158
+ getSubLayerAccessor: getSubLayerRadius,
159
+ getPickingInfo: function getPickingInfo(dimensionState, cell, layerProps) {
160
+ var radiusValue = layerProps.getRadiusValue(cell);
161
+ var scaleFunc = dimensionState.scaleFunc;
162
+ var scaledRadiusValue = scaleFunc ? scaleFunc(radiusValue) : radiusValue;
163
+ return {
164
+ radiusValue: radiusValue,
165
+ scaledRadiusValue: scaledRadiusValue
166
+ };
167
+ }
168
+ }];
169
+ var defaultProps = {
170
+ clusterRadius: defaultRadius,
171
+ colorDomain: null,
172
+ colorRange: _constants.DEFAULT_COLOR_RANGE,
173
+ colorScaleType: _constants.SCALE_TYPES.quantize,
174
+ radiusScaleType: _constants.SCALE_TYPES.sqrt,
175
+ radiusRange: defaultRadiusRange,
176
+ getPosition: {
177
+ type: 'accessor',
178
+ value: function value(x) {
179
+ return x.position;
180
+ }
181
+ },
182
+ getColorValue: {
183
+ type: 'accessor',
184
+ value: defaultGetColorValue
185
+ },
186
+ getRadiusValue: {
187
+ type: 'accessor',
188
+ value: defaultGetRadiusValue
189
+ }
190
+ };
191
+ var ClusterLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
192
+ function ClusterLayer() {
193
+ (0, _classCallCheck2["default"])(this, ClusterLayer);
194
+ return _callSuper(this, ClusterLayer, arguments);
195
+ }
196
+ (0, _inherits2["default"])(ClusterLayer, _CompositeLayer);
197
+ return (0, _createClass2["default"])(ClusterLayer, [{
198
+ key: "initializeState",
199
+ value: function initializeState() {
200
+ var cpuAggregator = new _cpuAggregator["default"]({
201
+ aggregation: clusterAggregation,
202
+ dimensions: clusterLayerDimensions
203
+ });
204
+ this.state = {
205
+ cpuAggregator: cpuAggregator,
206
+ aggregatorState: cpuAggregator.state
207
+ };
208
+ }
209
+ }, {
210
+ key: "updateState",
211
+ value: function updateState(_ref3) {
212
+ var oldProps = _ref3.oldProps,
213
+ props = _ref3.props,
214
+ changeFlags = _ref3.changeFlags;
215
+ this.setState({
216
+ aggregatorState: this.state.cpuAggregator.updateState({
217
+ oldProps: oldProps,
218
+ props: props,
219
+ changeFlags: changeFlags
220
+ }, {
221
+ viewport: this.context.viewport,
222
+ // @ts-expect-error props passed for internal calculation
223
+ numInstances: this.getNumInstances(props)
224
+ })
225
+ });
226
+ }
227
+ }, {
228
+ key: "getPickingInfo",
229
+ value: function getPickingInfo(_ref4) {
230
+ var info = _ref4.info;
231
+ var obj = this.state.cpuAggregator.getPickingInfo({
232
+ info: info
233
+ }, this.props);
234
+ if (obj !== null && obj !== void 0 && obj.object) {
235
+ var distanceScale = (0, _viewportMercatorProject.getDistanceScales)(this.context.viewport);
236
+ var metersPerPixel = distanceScale.metersPerPixel[0];
237
+ obj.object.scaledRadiusValue = obj.object.scaledRadiusValue * metersPerPixel;
238
+ }
239
+ return obj;
240
+ }
241
+ }, {
242
+ key: "_getSublayerUpdateTriggers",
243
+ value: function _getSublayerUpdateTriggers() {
244
+ return this.state.cpuAggregator.getUpdateTriggers(this.props);
245
+ }
246
+ }, {
247
+ key: "_getSubLayerAccessors",
248
+ value: function _getSubLayerAccessors() {
249
+ return {
250
+ getRadius: this.state.cpuAggregator.getAccessor('radius', this.props),
251
+ getFillColor: this.state.cpuAggregator.getAccessor('fillColor', this.props)
252
+ };
253
+ }
254
+ }, {
255
+ key: "renderLayers",
256
+ value: function renderLayers() {
257
+ var _ref5 = this.props,
258
+ id = _ref5.id,
259
+ radiusScale = _ref5.radiusScale,
260
+ visible = _ref5.visible,
261
+ opacity = _ref5.opacity,
262
+ pickable = _ref5.pickable,
263
+ autoHighlight = _ref5.autoHighlight,
264
+ highlightColor = _ref5.highlightColor;
265
+ var _ref6 = this.state,
266
+ cpuAggregator = _ref6.cpuAggregator;
267
+ var updateTriggers = this._getSublayerUpdateTriggers();
268
+ var accessors = this._getSubLayerAccessors();
269
+ var distanceScale = (0, _viewportMercatorProject.getDistanceScales)(this.context.viewport);
270
+ var metersPerPixel = distanceScale.metersPerPixel[0];
271
+
272
+ // return props to the sublayer constructor
273
+ return new _layers.ScatterplotLayer(_objectSpread({
274
+ id: "".concat(id, "-cluster"),
275
+ data: cpuAggregator.state.layerData.data,
276
+ radiusScale: metersPerPixel * radiusScale,
277
+ visible: visible,
278
+ opacity: opacity,
279
+ pickable: pickable,
280
+ autoHighlight: autoHighlight,
281
+ highlightColor: highlightColor,
282
+ updateTriggers: updateTriggers,
283
+ parameters: {
284
+ depthMask: false
285
+ }
286
+ }, accessors));
287
+ }
288
+ }]);
289
+ }(_core.CompositeLayer);
290
+ ClusterLayer.layerName = 'ClusterLayer';
291
+ ClusterLayer.defaultProps = defaultProps;
292
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiX2dlb1ZpZXdwb3J0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jcHVBZ2dyZWdhdG9yIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfdmlld3BvcnRNZXJjYXRvclByb2plY3QiLCJfZDNBcnJheSIsIl9jb25zdGFudHMiLCJfY2x1c3RlclV0aWxzIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiZGVmYXVsdFJhZGl1cyIsIkxBWUVSX1ZJU19DT05GSUdTIiwiY2x1c3RlclJhZGl1cyIsImRlZmF1bHRWYWx1ZSIsImRlZmF1bHRSYWRpdXNSYW5nZSIsImNsdXN0ZXJSYWRpdXNSYW5nZSIsImRlZmF1bHRHZXRDb2xvclZhbHVlIiwicG9pbnRzIiwiZGVmYXVsdEdldFJhZGl1c1ZhbHVlIiwiY2VsbCIsImZpbHRlcmVkUG9pbnRzIiwicHJvY2Vzc0dlb0pTT04iLCJzdGVwIiwicHJvcHMiLCJhZ2dyZWdhdGlvbiIsIl9yZWYiLCJ2aWV3cG9ydCIsImRhdGEiLCJnZXRQb3NpdGlvbiIsImZpbHRlckRhdGEiLCJnZW9KU09OIiwiZ2V0R2VvSlNPTiIsImNsdXN0ZXJCdWlsZGVyIiwiQ2x1c3RlckJ1aWxkZXIiLCJzZXRTdGF0ZSIsImdldENsdXN0ZXJzIiwiX3JlZjIiLCJfY2x1c3RlckJ1aWxkZXIkY2x1c3QiLCJfdGhpcyRzdGF0ZSIsInN0YXRlIiwiem9vbSIsIndpZHRoIiwiaGVpZ2h0IiwibG9uZ2l0dWRlIiwibGF0aXR1ZGUiLCJiYm94IiwiZ2VvVmlld3BvcnQiLCJib3VuZHMiLCJjbHVzdGVycyIsImNsdXN0ZXJzQXRab29tIiwibGF5ZXJEYXRhIiwiZ2V0U3ViTGF5ZXJSYWRpdXMiLCJkaW1lbnNpb25TdGF0ZSIsImRpbWVuc2lvbiIsImxheWVyUHJvcHMiLCJnZXRSYWRpdXNWYWx1ZSIsInNjYWxlRnVuYyIsImNsdXN0ZXJBZ2dyZWdhdGlvbiIsImV4cG9ydHMiLCJrZXkiLCJ1cGRhdGVTdGVwcyIsInRyaWdnZXJzIiwicG9zaXRpb24iLCJwcm9wIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRSYWRpdXNWYWx1ZURvbWFpbiIsImRpbWVuc2lvblVwZGF0ZXIiLCJ2YWx1ZURvbWFpbiIsIm1heCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImNsdXN0ZXJMYXllckRpbWVuc2lvbnMiLCJkZWZhdWx0Q29sb3JEaW1lbnNpb24iLCJhY2Nlc3NvciIsIm51bGxWYWx1ZSIsInZhbHVlIiwiZG9tYWluIiwicmFuZ2UiLCJzY2FsZVR5cGUiLCJnZXREaW1lbnNpb25TY2FsZSIsImdldFN1YkxheWVyQWNjZXNzb3IiLCJnZXRQaWNraW5nSW5mbyIsInJhZGl1c1ZhbHVlIiwic2NhbGVkUmFkaXVzVmFsdWUiLCJkZWZhdWx0UHJvcHMiLCJjb2xvckRvbWFpbiIsImNvbG9yUmFuZ2UiLCJERUZBVUxUX0NPTE9SX1JBTkdFIiwiY29sb3JTY2FsZVR5cGUiLCJTQ0FMRV9UWVBFUyIsInF1YW50aXplIiwicmFkaXVzU2NhbGVUeXBlIiwic3FydCIsInJhZGl1c1JhbmdlIiwidHlwZSIsIngiLCJnZXRDb2xvclZhbHVlIiwiQ2x1c3RlckxheWVyIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwiaW5pdGlhbGl6ZVN0YXRlIiwiY3B1QWdncmVnYXRvciIsIkNQVUFnZ3JlZ2F0b3IiLCJkaW1lbnNpb25zIiwiYWdncmVnYXRvclN0YXRlIiwidXBkYXRlU3RhdGUiLCJfcmVmMyIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJjb250ZXh0IiwibnVtSW5zdGFuY2VzIiwiZ2V0TnVtSW5zdGFuY2VzIiwiX3JlZjQiLCJpbmZvIiwib2JqIiwib2JqZWN0IiwiZGlzdGFuY2VTY2FsZSIsImdldERpc3RhbmNlU2NhbGVzIiwibWV0ZXJzUGVyUGl4ZWwiLCJfZ2V0U3VibGF5ZXJVcGRhdGVUcmlnZ2VycyIsImdldFVwZGF0ZVRyaWdnZXJzIiwiX2dldFN1YkxheWVyQWNjZXNzb3JzIiwiZ2V0UmFkaXVzIiwiZ2V0QWNjZXNzb3IiLCJnZXRGaWxsQ29sb3IiLCJyZW5kZXJMYXllcnMiLCJfcmVmNSIsImlkIiwicmFkaXVzU2NhbGUiLCJ2aXNpYmxlIiwib3BhY2l0eSIsInBpY2thYmxlIiwiYXV0b0hpZ2hsaWdodCIsImhpZ2hsaWdodENvbG9yIiwiX3JlZjYiLCJ1cGRhdGVUcmlnZ2VycyIsImFjY2Vzc29ycyIsIlNjYXR0ZXJwbG90TGF5ZXIiLCJjb25jYXQiLCJwYXJhbWV0ZXJzIiwiZGVwdGhNYXNrIiwiQ29tcG9zaXRlTGF5ZXIiLCJsYXllck5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2x1c3Rlci1sYXllci9jbHVzdGVyLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7Q29tcG9zaXRlTGF5ZXIsIEdldFBpY2tpbmdJbmZvUGFyYW1zLCBQaWNraW5nSW5mb30gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NjYXR0ZXJwbG90TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5cbmltcG9ydCBnZW9WaWV3cG9ydCBmcm9tICdAbWFwYm94L2dlby12aWV3cG9ydCc7XG5pbXBvcnQgQ1BVQWdncmVnYXRvciwge1xuICBBZ2dyZWdhdGlvblR5cGUsXG4gIGRlZmF1bHRDb2xvckRpbWVuc2lvbixcbiAgRGltZW5zaW9uVHlwZSxcbiAgZ2V0RGltZW5zaW9uU2NhbGVcbn0gZnJvbSAnLi4vbGF5ZXItdXRpbHMvY3B1LWFnZ3JlZ2F0b3InO1xuaW1wb3J0IHtnZXREaXN0YW5jZVNjYWxlc30gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge21heH0gZnJvbSAnZDMtYXJyYXknO1xuXG5pbXBvcnQge1NDQUxFX1RZUEVTLCBERUZBVUxUX0NPTE9SX1JBTkdFLCBMQVlFUl9WSVNfQ09ORklHU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IENsdXN0ZXJCdWlsZGVyLCB7Z2V0R2VvSlNPTn0gZnJvbSAnLi4vbGF5ZXItdXRpbHMvY2x1c3Rlci11dGlscyc7XG5pbXBvcnQge1JHQkFDb2xvcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmNvbnN0IGRlZmF1bHRSYWRpdXMgPSBMQVlFUl9WSVNfQ09ORklHUy5jbHVzdGVyUmFkaXVzLmRlZmF1bHRWYWx1ZTtcbmNvbnN0IGRlZmF1bHRSYWRpdXNSYW5nZSA9IExBWUVSX1ZJU19DT05GSUdTLmNsdXN0ZXJSYWRpdXNSYW5nZS5kZWZhdWx0VmFsdWU7XG5cbmNvbnN0IGRlZmF1bHRHZXRDb2xvclZhbHVlID0gKHBvaW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4gcG9pbnRzLmxlbmd0aDtcbmNvbnN0IGRlZmF1bHRHZXRSYWRpdXNWYWx1ZSA9IChjZWxsOiB7ZmlsdGVyZWRQb2ludHM/OiB1bmtub3duW107IHBvaW50czogdW5rbm93bltdfSkgPT5cbiAgY2VsbC5maWx0ZXJlZFBvaW50cyA/IGNlbGwuZmlsdGVyZWRQb2ludHMubGVuZ3RoIDogY2VsbC5wb2ludHMubGVuZ3RoO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBwcm9jZXNzR2VvSlNPTih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgYWdncmVnYXRpb24sIHt2aWV3cG9ydH0pIHtcbiAgY29uc3Qge2RhdGEsIGdldFBvc2l0aW9uLCBmaWx0ZXJEYXRhfSA9IHByb3BzO1xuICBjb25zdCBnZW9KU09OID0gZ2V0R2VvSlNPTihkYXRhLCBnZXRQb3NpdGlvbiwgZmlsdGVyRGF0YSk7XG4gIGNvbnN0IGNsdXN0ZXJCdWlsZGVyID0gbmV3IENsdXN0ZXJCdWlsZGVyKCk7XG5cbiAgdGhpcy5zZXRTdGF0ZSh7Z2VvSlNPTiwgY2x1c3RlckJ1aWxkZXJ9KTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZ2V0Q2x1c3RlcnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGFnZ3JlZ2F0aW9uLCB7dmlld3BvcnR9KSB7XG4gIGNvbnN0IHtnZW9KU09OLCBjbHVzdGVyQnVpbGRlcn0gPSB0aGlzLnN0YXRlO1xuICBjb25zdCB7Y2x1c3RlclJhZGl1cywgem9vbSwgd2lkdGgsIGhlaWdodH0gPSBwcm9wcztcbiAgY29uc3Qge2xvbmdpdHVkZSwgbGF0aXR1ZGV9ID0gdmlld3BvcnQ7XG5cbiAgLy8gem9vbSBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGZvciB0aGUgZGlmZmVyZW50IG1hcCB1dGlscy4gQWxzbyBoZWxwcyB3aXRoIGNhY2hlIGtleS5cbiAgY29uc3QgYmJveCA9IGdlb1ZpZXdwb3J0LmJvdW5kcyhbbG9uZ2l0dWRlLCBsYXRpdHVkZV0sIHpvb20sIFt3aWR0aCwgaGVpZ2h0XSk7XG4gIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3RlckJ1aWxkZXI/LmNsdXN0ZXJzQXRab29tKHtiYm94LCBjbHVzdGVyUmFkaXVzLCBnZW9KU09OLCB6b29tfSkgPz8gW107XG5cbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiB7ZGF0YTogY2x1c3RlcnN9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTdWJMYXllclJhZGl1cyhcbiAgZGltZW5zaW9uU3RhdGU6IHtzY2FsZUZ1bmM6ICh2OiBudW1iZXIpID0+IG51bWJlcn0sXG4gIGRpbWVuc2lvbjogRGltZW5zaW9uVHlwZSxcbiAgbGF5ZXJQcm9wczogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIHJldHVybiAoY2VsbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHtnZXRSYWRpdXNWYWx1ZX0gPSBsYXllclByb3BzO1xuICAgIGNvbnN0IHtzY2FsZUZ1bmN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhnZXRSYWRpdXNWYWx1ZShjZWxsKSk7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBjbHVzdGVyQWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiAncG9zaXRpb24nLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dlb2pzb24nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0UG9zaXRpb24nLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRQb3NpdGlvbidcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdmaWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IHByb2Nlc3NHZW9KU09OXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdjbHVzdGVyaW5nJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNsdXN0ZXJSYWRpdXM6IHtcbiAgICAgICAgICBwcm9wOiAnY2x1c3RlclJhZGl1cydcbiAgICAgICAgfSxcbiAgICAgICAgem9vbToge1xuICAgICAgICAgIHByb3A6ICd6b29tJ1xuICAgICAgICB9LFxuICAgICAgICB3aWR0aDoge1xuICAgICAgICAgIHByb3A6ICd3aWR0aCdcbiAgICAgICAgfSxcbiAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2hlaWdodCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldENsdXN0ZXJzXG4gICAgfVxuICBdXG59O1xuXG5mdW5jdGlvbiBnZXRSYWRpdXNWYWx1ZURvbWFpbih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtnZXRSYWRpdXNWYWx1ZX0gPSBwcm9wcztcbiAgY29uc3Qge2xheWVyRGF0YX0gPSB0aGlzLnN0YXRlO1xuXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gWzAsIG1heChsYXllckRhdGEuZGF0YSBhcyB1bmtub3duIGFzIG51bWJlcltdLCBnZXRSYWRpdXNWYWx1ZSldO1xuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHt2YWx1ZURvbWFpbn0pO1xufVxuXG5jb25zdCBjbHVzdGVyTGF5ZXJEaW1lbnNpb25zOiBbRGltZW5zaW9uVHlwZTxSR0JBQ29sb3I+LCBEaW1lbnNpb25UeXBlPG51bWJlcj5dID0gW1xuICBkZWZhdWx0Q29sb3JEaW1lbnNpb24sXG4gIHtcbiAgICBrZXk6ICdyYWRpdXMnLFxuICAgIGFjY2Vzc29yOiAnZ2V0UmFkaXVzJyxcbiAgICBudWxsVmFsdWU6IDAsXG4gICAgdXBkYXRlU3RlcHM6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgcHJvcDogJ2dldFJhZGl1c1ZhbHVlJyxcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRSYWRpdXNWYWx1ZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZXI6IGdldFJhZGl1c1ZhbHVlRG9tYWluXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgICB0cmlnZ2Vyczoge1xuICAgICAgICAgIGRvbWFpbjoge3Byb3A6ICdyYWRpdXNEb21haW4nfSxcbiAgICAgICAgICByYW5nZToge3Byb3A6ICdyYWRpdXNSYW5nZSd9LFxuICAgICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdyYWRpdXNTY2FsZVR5cGUnfVxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0U3ViTGF5ZXJBY2Nlc3NvcjogZ2V0U3ViTGF5ZXJSYWRpdXMsXG4gICAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcykgPT4ge1xuICAgICAgY29uc3QgcmFkaXVzVmFsdWUgPSBsYXllclByb3BzLmdldFJhZGl1c1ZhbHVlKGNlbGwpO1xuICAgICAgY29uc3Qge3NjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICAgIGNvbnN0IHNjYWxlZFJhZGl1c1ZhbHVlID0gc2NhbGVGdW5jID8gc2NhbGVGdW5jKHJhZGl1c1ZhbHVlKSA6IHJhZGl1c1ZhbHVlO1xuXG4gICAgICByZXR1cm4ge3JhZGl1c1ZhbHVlLCBzY2FsZWRSYWRpdXNWYWx1ZX07XG4gICAgfVxuICB9XG5dO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsdXN0ZXJSYWRpdXM6IGRlZmF1bHRSYWRpdXMsXG4gIGNvbG9yRG9tYWluOiBudWxsLFxuICBjb2xvclJhbmdlOiBERUZBVUxUX0NPTE9SX1JBTkdFLFxuICBjb2xvclNjYWxlVHlwZTogU0NBTEVfVFlQRVMucXVhbnRpemUsXG4gIHJhZGl1c1NjYWxlVHlwZTogU0NBTEVfVFlQRVMuc3FydCxcbiAgcmFkaXVzUmFuZ2U6IGRlZmF1bHRSYWRpdXNSYW5nZSxcbiAgZ2V0UG9zaXRpb246IHt0eXBlOiAnYWNjZXNzb3InLCB2YWx1ZTogeCA9PiB4LnBvc2l0aW9ufSxcbiAgZ2V0Q29sb3JWYWx1ZToge3R5cGU6ICdhY2Nlc3NvcicsIHZhbHVlOiBkZWZhdWx0R2V0Q29sb3JWYWx1ZX0sXG4gIGdldFJhZGl1c1ZhbHVlOiB7dHlwZTogJ2FjY2Vzc29yJywgdmFsdWU6IGRlZmF1bHRHZXRSYWRpdXNWYWx1ZX1cbn07XG5cbmludGVyZmFjZSBDbHVzdGVyTGF5ZXJTdGF0ZSB7XG4gIGNwdUFnZ3JlZ2F0b3I6IENQVUFnZ3JlZ2F0b3I7XG4gIGFnZ3JlZ2F0b3JTdGF0ZTogQ1BVQWdncmVnYXRvclsnc3RhdGUnXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2x1c3RlckxheWVyIGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXIge1xuICBpbml0aWFsaXplU3RhdGUoKSB7XG4gICAgY29uc3QgY3B1QWdncmVnYXRvciA9IG5ldyBDUFVBZ2dyZWdhdG9yKHtcbiAgICAgIGFnZ3JlZ2F0aW9uOiBjbHVzdGVyQWdncmVnYXRpb24sXG4gICAgICBkaW1lbnNpb25zOiBjbHVzdGVyTGF5ZXJEaW1lbnNpb25zXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY3B1QWdncmVnYXRvcixcbiAgICAgIGFnZ3JlZ2F0b3JTdGF0ZTogY3B1QWdncmVnYXRvci5zdGF0ZVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVTdGF0ZSh7XG4gICAgb2xkUHJvcHMsXG4gICAgcHJvcHMsXG4gICAgY2hhbmdlRmxhZ3NcbiAgfToge1xuICAgIG9sZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNoYW5nZUZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9KSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBhZ2dyZWdhdG9yU3RhdGU6ICh0aGlzLnN0YXRlIGFzIHVua25vd24gYXMgQ2x1c3RlckxheWVyU3RhdGUpLmNwdUFnZ3JlZ2F0b3IudXBkYXRlU3RhdGUoXG4gICAgICAgIHtvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzfSxcbiAgICAgICAge1xuICAgICAgICAgIHZpZXdwb3J0OiB0aGlzLmNvbnRleHQudmlld3BvcnQsXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwcm9wcyBwYXNzZWQgZm9yIGludGVybmFsIGNhbGN1bGF0aW9uXG4gICAgICAgICAgbnVtSW5zdGFuY2VzOiB0aGlzLmdldE51bUluc3RhbmNlcyhwcm9wcylcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGlja2luZ0luZm8oe2luZm99OiBHZXRQaWNraW5nSW5mb1BhcmFtcyk6IFBpY2tpbmdJbmZvIHtcbiAgICBjb25zdCBvYmogPSAodGhpcy5zdGF0ZSBhcyB1bmtub3duIGFzIENsdXN0ZXJMYXllclN0YXRlKS5jcHVBZ2dyZWdhdG9yLmdldFBpY2tpbmdJbmZvKFxuICAgICAge2luZm99LFxuICAgICAgdGhpcy5wcm9wc1xuICAgICk7XG4gICAgaWYgKG9iaj8ub2JqZWN0KSB7XG4gICAgICBjb25zdCBkaXN0YW5jZVNjYWxlID0gZ2V0RGlzdGFuY2VTY2FsZXModGhpcy5jb250ZXh0LnZpZXdwb3J0KTtcbiAgICAgIGNvbnN0IG1ldGVyc1BlclBpeGVsID0gZGlzdGFuY2VTY2FsZS5tZXRlcnNQZXJQaXhlbFswXTtcbiAgICAgIG9iai5vYmplY3Quc2NhbGVkUmFkaXVzVmFsdWUgPSBvYmoub2JqZWN0LnNjYWxlZFJhZGl1c1ZhbHVlICogbWV0ZXJzUGVyUGl4ZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iaiBhcyBQaWNraW5nSW5mbztcbiAgfVxuXG4gIF9nZXRTdWJsYXllclVwZGF0ZVRyaWdnZXJzKCkge1xuICAgIHJldHVybiAodGhpcy5zdGF0ZSBhcyB1bmtub3duIGFzIENsdXN0ZXJMYXllclN0YXRlKS5jcHVBZ2dyZWdhdG9yLmdldFVwZGF0ZVRyaWdnZXJzKHRoaXMucHJvcHMpO1xuICB9XG5cbiAgX2dldFN1YkxheWVyQWNjZXNzb3JzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRSYWRpdXM6ICh0aGlzLnN0YXRlIGFzIHVua25vd24gYXMgQ2x1c3RlckxheWVyU3RhdGUpLmNwdUFnZ3JlZ2F0b3IuZ2V0QWNjZXNzb3IoXG4gICAgICAgICdyYWRpdXMnLFxuICAgICAgICB0aGlzLnByb3BzXG4gICAgICApLFxuICAgICAgZ2V0RmlsbENvbG9yOiAodGhpcy5zdGF0ZSBhcyB1bmtub3duIGFzIENsdXN0ZXJMYXllclN0YXRlKS5jcHVBZ2dyZWdhdG9yLmdldEFjY2Vzc29yKFxuICAgICAgICAnZmlsbENvbG9yJyxcbiAgICAgICAgdGhpcy5wcm9wc1xuICAgICAgKVxuICAgIH07XG4gIH1cblxuICByZW5kZXJMYXllcnMoKSB7XG4gICAgY29uc3Qge2lkLCByYWRpdXNTY2FsZSwgdmlzaWJsZSwgb3BhY2l0eSwgcGlja2FibGUsIGF1dG9IaWdobGlnaHQsIGhpZ2hsaWdodENvbG9yfSA9IHRoaXNcbiAgICAgIC5wcm9wcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHtjcHVBZ2dyZWdhdG9yfSA9IHRoaXMuc3RhdGUgYXMgdW5rbm93biBhcyBDbHVzdGVyTGF5ZXJTdGF0ZTtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHRoaXMuX2dldFN1YmxheWVyVXBkYXRlVHJpZ2dlcnMoKTtcbiAgICBjb25zdCBhY2Nlc3NvcnMgPSB0aGlzLl9nZXRTdWJMYXllckFjY2Vzc29ycygpO1xuXG4gICAgY29uc3QgZGlzdGFuY2VTY2FsZSA9IGdldERpc3RhbmNlU2NhbGVzKHRoaXMuY29udGV4dC52aWV3cG9ydCk7XG4gICAgY29uc3QgbWV0ZXJzUGVyUGl4ZWwgPSBkaXN0YW5jZVNjYWxlLm1ldGVyc1BlclBpeGVsWzBdO1xuXG4gICAgLy8gcmV0dXJuIHByb3BzIHRvIHRoZSBzdWJsYXllciBjb25zdHJ1Y3RvclxuICAgIHJldHVybiBuZXcgU2NhdHRlcnBsb3RMYXllcih7XG4gICAgICBpZDogYCR7aWR9LWNsdXN0ZXJgLFxuICAgICAgZGF0YTogY3B1QWdncmVnYXRvci5zdGF0ZS5sYXllckRhdGEuZGF0YSxcbiAgICAgIHJhZGl1c1NjYWxlOiBtZXRlcnNQZXJQaXhlbCAqIHJhZGl1c1NjYWxlLFxuICAgICAgdmlzaWJsZSxcbiAgICAgIG9wYWNpdHksXG4gICAgICBwaWNrYWJsZSxcbiAgICAgIGF1dG9IaWdobGlnaHQsXG4gICAgICBoaWdobGlnaHRDb2xvcixcbiAgICAgIHVwZGF0ZVRyaWdnZXJzLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBkZXB0aE1hc2s6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfSk7XG4gIH1cbn1cblxuQ2x1c3RlckxheWVyLmxheWVyTmFtZSA9ICdDbHVzdGVyTGF5ZXInO1xuQ2x1c3RlckxheWVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxZQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFDLHVCQUFBLENBQUFMLE9B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