@carto/kepler.gl 0.0.69 → 0.0.70-alpha.hackathon-3dtiles.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.
@@ -86,7 +86,8 @@ exports.editTopMapStyle = editTopMapStyle;
86
86
  var editBottomMapStyle = (0, _lodash["default"])(function (_ref4) {
87
87
  var id = _ref4.id,
88
88
  mapStyle = _ref4.mapStyle,
89
- visibleLayerGroups = _ref4.visibleLayerGroups;
89
+ visibleLayerGroups = _ref4.visibleLayerGroups,
90
+ sketchValue = _ref4.sketchValue;
90
91
  var invisibleFilters = (mapStyle.layerGroups || []).filter(function (lg) {
91
92
  return !visibleLayerGroups[lg.slug];
92
93
  }).map(function (lg) {
@@ -100,7 +101,8 @@ var editBottomMapStyle = (0, _lodash["default"])(function (_ref4) {
100
101
  });
101
102
  });
102
103
  return _objectSpread(_objectSpread({}, mapStyle.style), {}, {
103
- layers: filteredLayers
104
+ layers: filteredLayers,
105
+ sketchValue: sketchValue
104
106
  });
105
107
  }, resolver); // valid style url
106
108
  // mapbox://styles/uberdata/cjfyl03kp1tul2smf5v2tbdd4
@@ -209,4 +211,4 @@ function mergeLayerGroupVisibility(defaultLayerGroup, currentLayerGroup) {
209
211
  return _objectSpread(_objectSpread({}, accu), currentLayerGroup.hasOwnProperty(key) ? (0, _defineProperty2["default"])({}, key, currentLayerGroup[key]) : {});
210
212
  }, defaultLayerGroup);
211
213
  }
212
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvci5qcyJdLCJuYW1lcyI6WyJtYXBVcmxSZyIsImh0dHBSZyIsImdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSIsImxheWVyR3JvdXBzIiwicmVkdWNlIiwiYWNjdSIsImxheWVyIiwic2x1ZyIsImRlZmF1bHRWaXNpYmlsaXR5IiwicmVzb2x2ZXIiLCJpZCIsIm1hcFN0eWxlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImQiLCJzb3J0Iiwiam9pbiIsImVkaXRUb3BNYXBTdHlsZSIsInZpc2libGVGaWx0ZXJzIiwibGciLCJtYXAiLCJmaWx0ZXJlZExheWVycyIsInN0eWxlIiwibGF5ZXJzIiwic29tZSIsIm1hdGNoIiwiZWRpdEJvdHRvbU1hcFN0eWxlIiwiaW52aXNpYmxlRmlsdGVycyIsImV2ZXJ5IiwiaXNWYWxpZFN0eWxlVXJsIiwidXJsIiwiQm9vbGVhbiIsImdldFN0eWxlRG93bmxvYWRVcmwiLCJzdHlsZVVybCIsImFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwic3RhcnRzV2l0aCIsInN0eWxlSWQiLCJyZXBsYWNlIiwiREVGQVVMVF9NQVBCT1hfQVBJX1VSTCIsImdldFN0eWxlSW1hZ2VJY29uIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBTdGF0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiem9vbSIsIm1hcFciLCJtYXBIIiwic2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbiIsIm1hcGJveFN0eWxlIiwic2NhbGUiLCJsYWJlbExheWVyR3JvdXAiLCJERUZBVUxUX0xBWUVSX0dST1VQUyIsImZpbmQiLCJsYWJlbExheWVyRmlsdGVyIiwiem9vbU9mZnNldCIsIk1hdGgiLCJsb2cyIiwiY29weVN0eWxlIiwiZm9yRWFjaCIsIm1heHpvb20iLCJtYXgiLCJtaW56b29tIiwibGF5b3V0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RvcHMiLCJzdG9wIiwibWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eSIsImRlZmF1bHRMYXllckdyb3VwIiwiY3VycmVudExheWVyR3JvdXAiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLFFBQVEsR0FBRyx3REFBakI7QUFDQSxJQUFNQyxNQUFNLEdBQUcscUJBQWY7O0FBRU8sU0FBU0MsOEJBQVQsT0FBNEQ7QUFBQSw4QkFBbkJDLFdBQW1CO0FBQUEsTUFBbkJBLFdBQW1CLGlDQUFMLEVBQUs7QUFDakUsU0FBT0EsV0FBVyxDQUFDQyxNQUFaLENBQ0wsVUFBQ0MsSUFBRCxFQUFPQyxLQUFQO0FBQUEsMkNBQ0tELElBREwsNENBRUdDLEtBQUssQ0FBQ0MsSUFGVCxFQUVnQkQsS0FBSyxDQUFDRSxpQkFGdEI7QUFBQSxHQURLLEVBS0wsRUFMSyxDQUFQO0FBT0Q7O0FBRUQsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVc7QUFBQSxNQUFFQyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxNQUFNQyxRQUFOLFNBQU1BLFFBQU47QUFBQSxvQ0FBZ0JDLGtCQUFoQjtBQUFBLE1BQWdCQSxrQkFBaEIsc0NBQXFDLEVBQXJDO0FBQUEsbUJBQ1pGLEVBRFksY0FDTkcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLGtCQUFaLEVBQ05HLE1BRE0sQ0FDQyxVQUFBQyxDQUFDO0FBQUEsV0FBSUosa0JBQWtCLENBQUNJLENBQUQsQ0FBdEI7QUFBQSxHQURGLEVBRU5DLElBRk0sR0FHTkMsSUFITSxDQUdELEdBSEMsQ0FETTtBQUFBLENBQWpCO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU1DLGVBQWUsR0FBRyx3QkFBUSxpQkFBd0M7QUFBQSxNQUF0Q1QsRUFBc0MsU0FBdENBLEVBQXNDO0FBQUEsTUFBbENDLFFBQWtDLFNBQWxDQSxRQUFrQztB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QUMsQ0FBRCxDQUFKLElBQVdqQixLQUFYO0FBQ0QsV0FMRDtBQU1EO0FBQ0Y7QUFDRixLQXJCRDtBQXVCQSxXQUFPUSxTQUFQO0FBQ0Q7O0FBRUQsU0FBT1QsV0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNtQix5QkFBVCxDQUFtQ0MsaUJBQW5DLEVBQXNEQyxpQkFBdEQsRUFBeUU7QUFDOUUsU0FBTzNELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZeUQsaUJBQVosRUFBK0JuRSxNQUEvQixDQUNMLFVBQUNDLElBQUQsRUFBT29FLEdBQVA7QUFBQSwyQ0FDS3BFLElBREwsR0FFTW1FLGlCQUFpQixDQUFDRSxjQUFsQixDQUFpQ0QsR0FBakMseUNBQTBDQSxHQUExQyxFQUFnREQsaUJBQWlCLENBQUNDLEdBQUQsQ0FBakUsSUFBMEUsRUFGaEY7QUFBQSxHQURLLEVBS0xGLGlCQUxLLENBQVA7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCBjbG9uZERlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQge0RFRkFVTFRfTEFZRVJfR1JPVVBTLCBERUZBVUxUX01BUEJPWF9BUElfVVJMfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmNvbnN0IG1hcFVybFJnID0gL15tYXBib3g6XFwvXFwvc3R5bGVzXFwvWy1hLXowLTldezIsMjU2fVxcL1stYS16MC05XXsyLDI1Nn0vO1xuY29uc3QgaHR0cFJnID0gL14oPz0oaHR0cDp8aHR0cHM6KSkvO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdExheWVyR3JvdXBWaXNpYmlsaXR5KHtsYXllckdyb3VwcyA9IFtdfSkge1xuICByZXR1cm4gbGF5ZXJHcm91cHMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllcikgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuc2x1Z106IGxheWVyLmRlZmF1bHRWaXNpYmlsaXR5XG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cblxuY29uc3QgcmVzb2x2ZXIgPSAoe2lkLCBtYXBTdHlsZSwgdmlzaWJsZUxheWVyR3JvdXBzID0ge319KSA9PlxuICBgJHtpZH06JHtPYmplY3Qua2V5cyh2aXNpYmxlTGF5ZXJHcm91cHMpXG4gICAgLmZpbHRlcihkID0+IHZpc2libGVMYXllckdyb3Vwc1tkXSlcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJy0nKX1gO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBrZWVwIG9ubHkgdmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0ge09iamVjdH0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgdG9wIG1hcFxuICogQHJldHVybnMge09iamVjdH0gdG9wIG1hcCBzdHlsZVxuICovXG5leHBvcnQgY29uc3QgZWRpdFRvcE1hcFN0eWxlID0gbWVtb2l6ZSgoe2lkLCBtYXBTdHlsZSwgdmlzaWJsZUxheWVyR3JvdXBzfSkgPT4ge1xuICBjb25zdCB2aXNpYmxlRmlsdGVycyA9IChtYXBTdHlsZS5sYXllckdyb3VwcyB8fCBbXSlcbiAgICAuZmlsdGVyKGxnID0+IHZpc2libGVMYXllckdyb3Vwc1tsZy5zbHVnXSlcbiAgICAubWFwKGxnID0+IGxnLmZpbHRlcik7XG5cbiAgLy8gaWYgdG9wIG1hcFxuICAvLyBrZWVwIG9ubHkgdmlzaWJsZSBsYXllcnNcbiAgY29uc3QgZmlsdGVyZWRMYXllcnMgPSBtYXBTdHlsZS5zdHlsZS5sYXllcnMuZmlsdGVyKGxheWVyID0+XG4gICAgdmlzaWJsZUZpbHRlcnMuc29tZShtYXRjaCA9PiBtYXRjaChsYXllcikpXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tYXBTdHlsZS5zdHlsZSxcbiAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gIH07XG59LCByZXNvbHZlcik7XG5cbi8qKlxuICogRWRpdCBwcmVzZXQgbWFwIHN0eWxlIHRvIGZpbHRlciBvdXQgaW52aXNpYmxlIGxheWVyc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBTdHlsZSAtIHByZXNldCBtYXAgc3R5bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpYmxlTGF5ZXJHcm91cHMgLSB2aXNpYmxlIGxheWVycyBvZiBib3R0b20gbWFwXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBib3R0b20gbWFwIHN0eWxlXG4gKi9cbmV4cG9ydCBjb25zdCBlZGl0Qm90dG9tTWFwU3R5bGUgPSBtZW1vaXplKCh7aWQsIG1hcFN0eWxlLCB2aXNpYmxlTGF5ZXJHcm91cHN9KSA9PiB7XG4gIGNvbnN0IGludmlzaWJsZUZpbHRlcnMgPSAobWFwU3R5bGUubGF5ZXJHcm91cHMgfHwgW10pXG4gICAgLmZpbHRlcihsZyA9PiAhdmlzaWJsZUxheWVyR3JvdXBzW2xnLnNsdWddKVxuICAgIC5tYXAobGcgPT4gbGcuZmlsdGVyKTtcblxuICAvLyBpZiBib3R0b20gbWFwXG4gIC8vIGZpbHRlciBvdXQgaW52aXNpYmxlIGxheWVyc1xuICBjb25zdCBmaWx0ZXJlZExheWVycyA9IG1hcFN0eWxlLnN0eWxlLmxheWVycy5maWx0ZXIobGF5ZXIgPT5cbiAgICBpbnZpc2libGVGaWx0ZXJzLmV2ZXJ5KG1hdGNoID0+ICFtYXRjaChsYXllcikpXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tYXBTdHlsZS5zdHlsZSxcbiAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gIH07XG59LCByZXNvbHZlcik7XG5cbi8vIHZhbGlkIHN0eWxlIHVybFxuLy8gbWFwYm94Oi8vc3R5bGVzL3ViZXJkYXRhL2NqZnlsMDNrcDF0dWwyc21mNXYydGJkZDRcbi8vIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMgb25seS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3R5bGVVcmwodXJsKSB7XG4gIHJldHVybiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBCb29sZWFuKHVybC5tYXRjaChtYXBVcmxSZykgfHwgdXJsLm1hdGNoKGh0dHBSZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVEb3dubG9hZFVybChzdHlsZVVybCwgYWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCkge1xuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgcmV0dXJuIHN0eWxlVXJsO1xuICB9XG5cbiAgLy8gbWFwYm94Oi8vc3R5bGVzL2pja3IvY2poY2wwbHh2MTNkaTJycGZveXRkYmR5alxuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnbWFwYm94Oi8vc3R5bGVzJykpIHtcbiAgICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICAgIC8vIGh0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxL2hlc2hhbjAxMzEvY2pnMWJmdW1vMWN3bTJybHJqeGtpbmZndz9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj08dG9rZW4+XG4gICAgcmV0dXJuIGAke21hcGJveEFwaVVybCB8fFxuICAgICAgREVGQVVMVF9NQVBCT1hfQVBJX1VSTH0vc3R5bGVzL3YxLyR7c3R5bGVJZH0/cGx1Z2luTmFtZT1LZXBsZXJnbCZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gO1xuICB9XG5cbiAgLy8gc3R5bGUgdXJsIG5vdCByZWNvZ25pemVkXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHN0YXRpYyBtYXAgaW1hZ2UgZnJvbSBzdHlsZSBVcmwgdG8gYmUgdXNlZCBhcyBpY29uXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbS5zdHlsZVVybFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtLm1hcGJveEFwaUFjY2Vzc1Rva2VuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW0ubWFwYm94QXBpVXJsXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW0ubWFwU3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbS5tYXBXXG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW0ubWFwSFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVJbWFnZUljb24oe1xuICBzdHlsZVVybCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gIG1hcGJveEFwaVVybCA9IERFRkFVTFRfTUFQQk9YX0FQSV9VUkwsXG4gIG1hcFN0YXRlID0ge1xuICAgIGxvbmdpdHVkZTogLTEyMi4zMzkxLFxuICAgIGxhdGl0dWRlOiAzNy43OTIyLFxuICAgIHpvb206IDlcbiAgfSxcbiAgbWFwVyA9IDQwMCxcbiAgbWFwSCA9IDMwMFxufSkge1xuICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICByZXR1cm4gKFxuICAgIGAke21hcGJveEFwaVVybH0vc3R5bGVzL3YxLyR7c3R5bGVJZH0vc3RhdGljL2AgK1xuICAgIGAke21hcFN0YXRlLmxvbmdpdHVkZX0sJHttYXBTdGF0ZS5sYXRpdHVkZX0sJHttYXBTdGF0ZS56b29tfSwwLDAvYCArXG4gICAgYCR7bWFwV314JHttYXBIfWAgK1xuICAgIGA/YWNjZXNzX3Rva2VuPSR7bWFwYm94QXBpQWNjZXNzVG9rZW59JmxvZ289ZmFsc2UmYXR0cmlidXRpb249ZmFsc2VgXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcGJveFN0eWxlLCBzY2FsZSkge1xuICBpZiAoc2NhbGUgIT09IDEgJiYgbWFwYm94U3R5bGUpIHtcbiAgICBjb25zdCBsYWJlbExheWVyR3JvdXAgPSBERUZBVUxUX0xBWUVSX0dST1VQUy5maW5kKGxnID0+IGxnLnNsdWcgPT09ICdsYWJlbCcpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7ZmlsdGVyOiBsYWJlbExheWVyRmlsdGVyfSA9IGxhYmVsTGF5ZXJHcm91cDtcbiAgICBjb25zdCB6b29tT2Zmc2V0ID0gTWF0aC5sb2cyKHNjYWxlKTtcblxuICAgIGNvbnN0IGNvcHlTdHlsZSA9IGNsb25kRGVlcChtYXBib3hTdHlsZSk7XG4gICAgKGNvcHlTdHlsZS5sYXllcnMgfHwgW10pLmZvckVhY2goZCA9PiB7XG4gICAgICAvLyBlZGl0IG1pbnpvb20gYW5kIG1heHpvb21cbiAgICAgIGlmIChkLm1heHpvb20pIHtcbiAgICAgICAgZC5tYXh6b29tID0gTWF0aC5tYXgoZC5tYXh6b29tICsgem9vbU9mZnNldCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkLm1pbnpvb20pIHtcbiAgICAgICAgZC5taW56b29tID0gTWF0aC5tYXgoZC5taW56b29tICsgem9vbU9mZnNldCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVkaXQgdGV4dCBzaXplXG4gICAgICBpZiAobGFiZWxMYXllckZpbHRlcihkKSkge1xuICAgICAgICBpZiAoZC5sYXlvdXQgJiYgZC5sYXlvdXRbJ3RleHQtc2l6ZSddICYmIEFycmF5LmlzQXJyYXkoZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzKSkge1xuICAgICAgICAgIGQubGF5b3V0Wyd0ZXh0LXNpemUnXS5zdG9wcy5mb3JFYWNoKHN0b3AgPT4ge1xuICAgICAgICAgICAgLy8gem9vbVxuICAgICAgICAgICAgc3RvcFswXSA9IE1hdGgubWF4KHN0b3BbMF0gKyB6b29tT2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIHN0b3BbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3B5U3R5bGU7XG4gIH1cblxuICByZXR1cm4gbWFwYm94U3R5bGU7XG59XG5cbi8qKlxuICogV2hlbiBzd2l0Y2ggdG8gYSBuZXcgc3R5bGUsIHRyeSB0byBrZWVwIGN1cnJlbnQgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogYnkgbWVyZ2luZyBkZWZhdWx0IGFuZCBjdXJyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdExheWVyR3JvdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50TGF5ZXJHcm91cFxuICogQHJldHVybiB7T2JqZWN0fSBtZXJnZWRMYXllckdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShkZWZhdWx0TGF5ZXJHcm91cCwgY3VycmVudExheWVyR3JvdXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlZmF1bHRMYXllckdyb3VwKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oY3VycmVudExheWVyR3JvdXAuaGFzT3duUHJvcGVydHkoa2V5KSA/IHtba2V5XTogY3VycmVudExheWVyR3JvdXBba2V5XX0gOiB7fSlcbiAgICB9KSxcbiAgICBkZWZhdWx0TGF5ZXJHcm91cFxuICApO1xufVxuIl19
214
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvci5qcyJdLCJuYW1lcyI6WyJtYXBVcmxSZyIsImh0dHBSZyIsImdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSIsImxheWVyR3JvdXBzIiwicmVkdWNlIiwiYWNjdSIsImxheWVyIiwic2x1ZyIsImRlZmF1bHRWaXNpYmlsaXR5IiwicmVzb2x2ZXIiLCJpZCIsIm1hcFN0eWxlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImQiLCJzb3J0Iiwiam9pbiIsImVkaXRUb3BNYXBTdHlsZSIsInZpc2libGVGaWx0ZXJzIiwibGciLCJtYXAiLCJmaWx0ZXJlZExheWVycyIsInN0eWxlIiwibGF5ZXJzIiwic29tZSIsIm1hdGNoIiwiZWRpdEJvdHRvbU1hcFN0eWxlIiwic2tldGNoVmFsdWUiLCJpbnZpc2libGVGaWx0ZXJzIiwiZXZlcnkiLCJpc1ZhbGlkU3R5bGVVcmwiLCJ1cmwiLCJCb29sZWFuIiwiZ2V0U3R5bGVEb3dubG9hZFVybCIsInN0eWxlVXJsIiwiYWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJzdGFydHNXaXRoIiwic3R5bGVJZCIsInJlcGxhY2UiLCJERUZBVUxUX01BUEJPWF9BUElfVVJMIiwiZ2V0U3R5bGVJbWFnZUljb24iLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcFN0YXRlIiwibG9uZ2l0dWRlIiwibGF0aXR1ZGUiLCJ6b29tIiwibWFwVyIsIm1hcEgiLCJzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uIiwibWFwYm94U3R5bGUiLCJzY2FsZSIsImxhYmVsTGF5ZXJHcm91cCIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmluZCIsImxhYmVsTGF5ZXJGaWx0ZXIiLCJ6b29tT2Zmc2V0IiwiTWF0aCIsImxvZzIiLCJjb3B5U3R5bGUiLCJmb3JFYWNoIiwibWF4em9vbSIsIm1heCIsIm1pbnpvb20iLCJsYXlvdXQiLCJBcnJheSIsImlzQXJyYXkiLCJzdG9wcyIsInN0b3AiLCJtZXJnZUxheWVyR3JvdXBWaXNpYmlsaXR5IiwiZGVmYXVsdExheWVyR3JvdXAiLCJjdXJyZW50TGF5ZXJHcm91cCIsImtleSIsImhhc093blByb3BlcnR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsUUFBUSxHQUFHLHdEQUFqQjtBQUNBLElBQU1DLE1BQU0sR0FBRyxxQkFBZjs7QUFFTyxTQUFTQyw4QkFBVCxPQUE0RDtBQUFBLDhCQUFuQkMsV0FBbUI7QUFBQSxNQUFuQkEsV0FBbUIsaUNBQUwsRUFBSztBQUNqRSxTQUFPQSxXQUFXLENBQUNDLE1BQVosQ0FDTCxVQUFDQyxJQUFELEVBQU9DLEtBQVA7QUFBQSwyQ0FDS0QsSUFETCw0Q0FFR0MsS0FBSyxDQUFDQyxJQUZULEVBRWdCRCxLQUFLLENBQUNFLGlCQUZ0QjtBQUFBLEdBREssRUFLTCxFQUxLLENBQVA7QUFPRDs7QUFFRCxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBVztBQUFBLE1BQUVDLEVBQUYsU0FBRUEsRUFBRjtBQUFBLE1BQU1DLFFBQU4sU0FBTUEsUUFBTjtBQUFBLG9DQUFnQkMsa0JBQWhCO0FBQUEsTUFBZ0JBLGtCQUFoQixzQ0FBcUMsRUFBckM7QUFBQSxtQkFDWkYsRUFEWSxjQUNORyxNQUFNLENBQUNDLElBQVAsQ0FBWUYsa0JBQVosRUFDTkcsTUFETSxDQUNDLFVBQUFDLENBQUM7QUFBQSxXQUFJSixrQkFBa0IsQ0FBQ0ksQ0FBRCxDQUF0QjtBQUFBLEdBREYsRUFFTkMsSUFGTSxHQUdOQyxJQUhNLENBR0QsR0FIQyxDQURNO0FBQUEsQ0FBakI7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTUMsZUFBZSxHQUFHLHdCQUFRLGlCQUF3QztBQUFBLE1BQXRDVCxFQUFzQyxTQUF0Q0EsRUFBc0M7QUFBQSxNQUFsQ0MsUUFBa0Ms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LENBQUMsQ0FBRCxDQUFKLEdBQVVaLFVBQW5CLEVBQStCLENBQS9CLENBQVYsQ0FGMEMsQ0FHMUM7O0FBQ0FZLFlBQUFBLElBQUksQ0FBQyxDQUFELENBQUosSUFBV2pCLEtBQVg7QUFDRCxXQUxEO0FBTUQ7QUFDRjtBQUNGLEtBckJEO0FBdUJBLFdBQU9RLFNBQVA7QUFDRDs7QUFFRCxTQUFPVCxXQUFQO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU21CLHlCQUFULENBQW1DQyxpQkFBbkMsRUFBc0RDLGlCQUF0RCxFQUF5RTtBQUM5RSxTQUFPNUQsTUFBTSxDQUFDQyxJQUFQLENBQVkwRCxpQkFBWixFQUErQnBFLE1BQS9CLENBQ0wsVUFBQ0MsSUFBRCxFQUFPcUUsR0FBUDtBQUFBLDJDQUNLckUsSUFETCxHQUVNb0UsaUJBQWlCLENBQUNFLGNBQWxCLENBQWlDRCxHQUFqQyx5Q0FBMENBLEdBQTFDLEVBQWdERCxpQkFBaUIsQ0FBQ0MsR0FBRCxDQUFqRSxJQUEwRSxFQUZoRjtBQUFBLEdBREssRUFLTEYsaUJBTEssQ0FBUDtBQU9EIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoLm1lbW9pemUnO1xuaW1wb3J0IGNsb25kRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9HUk9VUFMsIERFRkFVTFRfTUFQQk9YX0FQSV9VUkx9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgbWFwVXJsUmcgPSAvXm1hcGJveDpcXC9cXC9zdHlsZXNcXC9bLWEtejAtOV17MiwyNTZ9XFwvWy1hLXowLTldezIsMjU2fS87XG5jb25zdCBodHRwUmcgPSAvXig/PShodHRwOnxodHRwczopKS87XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0TGF5ZXJHcm91cFZpc2liaWxpdHkoe2xheWVyR3JvdXBzID0gW119KSB7XG4gIHJldHVybiBsYXllckdyb3Vwcy5yZWR1Y2UoXG4gICAgKGFjY3UsIGxheWVyKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5zbHVnXTogbGF5ZXIuZGVmYXVsdFZpc2liaWxpdHlcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG5jb25zdCByZXNvbHZlciA9ICh7aWQsIG1hcFN0eWxlLCB2aXNpYmxlTGF5ZXJHcm91cHMgPSB7fX0pID0+XG4gIGAke2lkfToke09iamVjdC5rZXlzKHZpc2libGVMYXllckdyb3VwcylcbiAgICAuZmlsdGVyKGQgPT4gdmlzaWJsZUxheWVyR3JvdXBzW2RdKVxuICAgIC5zb3J0KClcbiAgICAuam9pbignLScpfWA7XG5cbi8qKlxuICogRWRpdCBwcmVzZXQgbWFwIHN0eWxlIHRvIGtlZXAgb25seSB2aXNpYmxlIGxheWVyc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBTdHlsZSAtIHByZXNldCBtYXAgc3R5bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpYmxlTGF5ZXJHcm91cHMgLSB2aXNpYmxlIGxheWVycyBvZiB0b3AgbWFwXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0b3AgbWFwIHN0eWxlXG4gKi9cbmV4cG9ydCBjb25zdCBlZGl0VG9wTWFwU3R5bGUgPSBtZW1vaXplKCh7aWQsIG1hcFN0eWxlLCB2aXNpYmxlTGF5ZXJHcm91cHN9KSA9PiB7XG4gIGNvbnN0IHZpc2libGVGaWx0ZXJzID0gKG1hcFN0eWxlLmxheWVyR3JvdXBzIHx8IFtdKVxuICAgIC5maWx0ZXIobGcgPT4gdmlzaWJsZUxheWVyR3JvdXBzW2xnLnNsdWddKVxuICAgIC5tYXAobGcgPT4gbGcuZmlsdGVyKTtcblxuICAvLyBpZiB0b3AgbWFwXG4gIC8vIGtlZXAgb25seSB2aXNpYmxlIGxheWVyc1xuICBjb25zdCBmaWx0ZXJlZExheWVycyA9IG1hcFN0eWxlLnN0eWxlLmxheWVycy5maWx0ZXIobGF5ZXIgPT5cbiAgICB2aXNpYmxlRmlsdGVycy5zb21lKG1hdGNoID0+IG1hdGNoKGxheWVyKSlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm1hcFN0eWxlLnN0eWxlLFxuICAgIGxheWVyczogZmlsdGVyZWRMYXllcnNcbiAgfTtcbn0sIHJlc29sdmVyKTtcblxuLyoqXG4gKiBFZGl0IHByZXNldCBtYXAgc3R5bGUgdG8gZmlsdGVyIG91dCBpbnZpc2libGUgbGF5ZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hcFN0eWxlIC0gcHJlc2V0IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIGJvdHRvbSBtYXBcbiAqIEByZXR1cm5zIHtPYmplY3R9IGJvdHRvbSBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRCb3R0b21NYXBTdHlsZSA9IG1lbW9pemUoKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwcywgc2tldGNoVmFsdWV9KSA9PiB7XG4gIGNvbnN0IGludmlzaWJsZUZpbHRlcnMgPSAobWFwU3R5bGUubGF5ZXJHcm91cHMgfHwgW10pXG4gICAgLmZpbHRlcihsZyA9PiAhdmlzaWJsZUxheWVyR3JvdXBzW2xnLnNsdWddKVxuICAgIC5tYXAobGcgPT4gbGcuZmlsdGVyKTtcblxuICAvLyBpZiBib3R0b20gbWFwXG4gIC8vIGZpbHRlciBvdXQgaW52aXNpYmxlIGxheWVyc1xuICBjb25zdCBmaWx0ZXJlZExheWVycyA9IG1hcFN0eWxlLnN0eWxlLmxheWVycy5maWx0ZXIobGF5ZXIgPT5cbiAgICBpbnZpc2libGVGaWx0ZXJzLmV2ZXJ5KG1hdGNoID0+ICFtYXRjaChsYXllcikpXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tYXBTdHlsZS5zdHlsZSxcbiAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzLFxuICAgIHNrZXRjaFZhbHVlXG4gIH07XG59LCByZXNvbHZlcik7XG5cbi8vIHZhbGlkIHN0eWxlIHVybFxuLy8gbWFwYm94Oi8vc3R5bGVzL3ViZXJkYXRhL2NqZnlsMDNrcDF0dWwyc21mNXYydGJkZDRcbi8vIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMgb25seS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3R5bGVVcmwodXJsKSB7XG4gIHJldHVybiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBCb29sZWFuKHVybC5tYXRjaChtYXBVcmxSZykgfHwgdXJsLm1hdGNoKGh0dHBSZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVEb3dubG9hZFVybChzdHlsZVVybCwgYWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCkge1xuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgcmV0dXJuIHN0eWxlVXJsO1xuICB9XG5cbiAgLy8gbWFwYm94Oi8vc3R5bGVzL2pja3IvY2poY2wwbHh2MTNkaTJycGZveXRkYmR5alxuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnbWFwYm94Oi8vc3R5bGVzJykpIHtcbiAgICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICAgIC8vIGh0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxL2hlc2hhbjAxMzEvY2pnMWJmdW1vMWN3bTJybHJqeGtpbmZndz9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj08dG9rZW4+XG4gICAgcmV0dXJuIGAke21hcGJveEFwaVVybCB8fFxuICAgICAgREVGQVVMVF9NQVBCT1hfQVBJX1VSTH0vc3R5bGVzL3YxLyR7c3R5bGVJZH0/cGx1Z2luTmFtZT1LZXBsZXJnbCZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gO1xuICB9XG5cbiAgLy8gc3R5bGUgdXJsIG5vdCByZWNvZ25pemVkXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHN0YXRpYyBtYXAgaW1hZ2UgZnJvbSBzdHlsZSBVcmwgdG8gYmUgdXNlZCBhcyBpY29uXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbS5zdHlsZVVybFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtLm1hcGJveEFwaUFjY2Vzc1Rva2VuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW0ubWFwYm94QXBpVXJsXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW0ubWFwU3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbS5tYXBXXG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW0ubWFwSFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVJbWFnZUljb24oe1xuICBzdHlsZVVybCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gIG1hcGJveEFwaVVybCA9IERFRkFVTFRfTUFQQk9YX0FQSV9VUkwsXG4gIG1hcFN0YXRlID0ge1xuICAgIGxvbmdpdHVkZTogLTEyMi4zMzkxLFxuICAgIGxhdGl0dWRlOiAzNy43OTIyLFxuICAgIHpvb206IDlcbiAgfSxcbiAgbWFwVyA9IDQwMCxcbiAgbWFwSCA9IDMwMFxufSkge1xuICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICByZXR1cm4gKFxuICAgIGAke21hcGJveEFwaVVybH0vc3R5bGVzL3YxLyR7c3R5bGVJZH0vc3RhdGljL2AgK1xuICAgIGAke21hcFN0YXRlLmxvbmdpdHVkZX0sJHttYXBTdGF0ZS5sYXRpdHVkZX0sJHttYXBTdGF0ZS56b29tfSwwLDAvYCArXG4gICAgYCR7bWFwV314JHttYXBIfWAgK1xuICAgIGA/YWNjZXNzX3Rva2VuPSR7bWFwYm94QXBpQWNjZXNzVG9rZW59JmxvZ289ZmFsc2UmYXR0cmlidXRpb249ZmFsc2VgXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcGJveFN0eWxlLCBzY2FsZSkge1xuICBpZiAoc2NhbGUgIT09IDEgJiYgbWFwYm94U3R5bGUpIHtcbiAgICBjb25zdCBsYWJlbExheWVyR3JvdXAgPSBERUZBVUxUX0xBWUVSX0dST1VQUy5maW5kKGxnID0+IGxnLnNsdWcgPT09ICdsYWJlbCcpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7ZmlsdGVyOiBsYWJlbExheWVyRmlsdGVyfSA9IGxhYmVsTGF5ZXJHcm91cDtcbiAgICBjb25zdCB6b29tT2Zmc2V0ID0gTWF0aC5sb2cyKHNjYWxlKTtcblxuICAgIGNvbnN0IGNvcHlTdHlsZSA9IGNsb25kRGVlcChtYXBib3hTdHlsZSk7XG4gICAgKGNvcHlTdHlsZS5sYXllcnMgfHwgW10pLmZvckVhY2goZCA9PiB7XG4gICAgICAvLyBlZGl0IG1pbnpvb20gYW5kIG1heHpvb21cbiAgICAgIGlmIChkLm1heHpvb20pIHtcbiAgICAgICAgZC5tYXh6b29tID0gTWF0aC5tYXgoZC5tYXh6b29tICsgem9vbU9mZnNldCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkLm1pbnpvb20pIHtcbiAgICAgICAgZC5taW56b29tID0gTWF0aC5tYXgoZC5taW56b29tICsgem9vbU9mZnNldCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVkaXQgdGV4dCBzaXplXG4gICAgICBpZiAobGFiZWxMYXllckZpbHRlcihkKSkge1xuICAgICAgICBpZiAoZC5sYXlvdXQgJiYgZC5sYXlvdXRbJ3RleHQtc2l6ZSddICYmIEFycmF5LmlzQXJyYXkoZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzKSkge1xuICAgICAgICAgIGQubGF5b3V0Wyd0ZXh0LXNpemUnXS5zdG9wcy5mb3JFYWNoKHN0b3AgPT4ge1xuICAgICAgICAgICAgLy8gem9vbVxuICAgICAgICAgICAgc3RvcFswXSA9IE1hdGgubWF4KHN0b3BbMF0gKyB6b29tT2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIHN0b3BbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3B5U3R5bGU7XG4gIH1cblxuICByZXR1cm4gbWFwYm94U3R5bGU7XG59XG5cbi8qKlxuICogV2hlbiBzd2l0Y2ggdG8gYSBuZXcgc3R5bGUsIHRyeSB0byBrZWVwIGN1cnJlbnQgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogYnkgbWVyZ2luZyBkZWZhdWx0IGFuZCBjdXJyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdExheWVyR3JvdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50TGF5ZXJHcm91cFxuICogQHJldHVybiB7T2JqZWN0fSBtZXJnZWRMYXllckdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShkZWZhdWx0TGF5ZXJHcm91cCwgY3VycmVudExheWVyR3JvdXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlZmF1bHRMYXllckdyb3VwKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oY3VycmVudExheWVyR3JvdXAuaGFzT3duUHJvcGVydHkoa2V5KSA/IHtba2V5XTogY3VycmVudExheWVyR3JvdXBba2V5XX0gOiB7fSlcbiAgICB9KSxcbiAgICBkZWZhdWx0TGF5ZXJHcm91cFxuICApO1xufVxuIl19
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@carto/kepler.gl",
3
3
  "author": "CARTO",
4
4
  "homepage": "https://github.com/CartoDB/carto-kepler#readme",
5
- "version": "0.0.69",
5
+ "version": "0.0.70-alpha.hackathon-3dtiles.10",
6
6
  "description": "kepler.gl is a webgl based application to visualize large scale location data in the browser",
7
7
  "license": "MIT",
8
8
  "main": "dist/index.js",
@@ -59,7 +59,7 @@
59
59
  "web": "(yarn && yarn install:web && yarn start:web)",
60
60
  "deploy": "yarn install:web && (cd website && yarn build)",
61
61
  "clean": "rm -rf node_modules examples/**/node_modules website/node_modules",
62
- "release:patch": "git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags"
62
+ "release:patch": "git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags"
63
63
  },
64
64
  "files": [
65
65
  "dist",
@@ -251,7 +251,6 @@
251
251
  "@loaders.gl/gltf": "^3.1.5",
252
252
  "@loaders.gl/json": "^3.1.5",
253
253
  "@loaders.gl/loader-utils": "^3.1.5",
254
- "@loaders.gl/polyfills": "^3.1.5",
255
254
  "@luma.gl/constants": "^8.5.10",
256
255
  "@luma.gl/core": "^8.5.10",
257
256
  "react": ">=16.3",
@@ -278,4 +277,4 @@
278
277
  "volta": {
279
278
  "node": "12.19.0"
280
279
  }
281
- }
280
+ }
@@ -95,6 +95,14 @@ export function mapStyleChange(
95
95
  styleType: MapStyleChangeUpdaterAction['payload']
96
96
  ): Merge<MapStyleChangeUpdaterAction, {type: ActionTypes.MAP_STYLE_CHANGE}>;
97
97
 
98
+ /** SET_TILES_3D_SKETCH_VALUE */
99
+ export type SetTiles3dSketchValueActionUpdaterAction = {
100
+ payload: {inkStrength: number; hue: number; hueSaturation: number; dotScreen: boolean};
101
+ };
102
+ export function setTiles3dSketchValue(
103
+ sketchValue: SetTiles3dSketchValueActionUpdaterAction['payload']
104
+ ): Merge<SetTiles3dSketchValueActionUpdaterAction, {type: ActionTypes.SET_TILES_3D_SKETCH_VALUE}>;
105
+
98
106
  /** LOAD_CUSTOM_MAP_STYLE */
99
107
  export type LoadCustomMapStyleUpdaterAction = {
100
108
  payload: {
@@ -97,6 +97,22 @@ export const loadMapStyleErr = createAction(ActionTypes.LOAD_MAP_STYLE_ERR, erro
97
97
  */
98
98
  export const mapStyleChange = createAction(ActionTypes.MAP_STYLE_CHANGE, styleType => styleType);
99
99
 
100
+ /**
101
+ * Set Tiles3D sketch value
102
+ * @memberof mapStyleActions
103
+ * @param sketchValue
104
+ * @param sketchValue.inkStrength - 0.01 - 1.0
105
+ * @param sketchValue.hue - 0.01 - 1.0
106
+ * @param sketchValue.hueSaturation - 0.01 - 1.0
107
+ * @param sketchValue.dotScreen - true | false
108
+ * @type {typeof import('./map-style-actions').setTiles3dSketchValue}
109
+ * @public
110
+ */
111
+ export const setTiles3dSketchValue = createAction(
112
+ ActionTypes.SET_TILES_3D_SKETCH_VALUE,
113
+ sketchValue => sketchValue
114
+ );
115
+
100
116
  /**
101
117
  * Callback when a custom map style object is received
102
118
  * @memberof mapStyleActions
@@ -24,7 +24,15 @@ import PropTypes from 'prop-types';
24
24
  import MapboxGLMap from 'react-map-gl';
25
25
  import DeckGL from '@deck.gl/react';
26
26
  import {createSelector} from 'reselect';
27
- import {OPERATION, Layer} from '@deck.gl/core';
27
+ import {
28
+ OPERATION,
29
+ Layer,
30
+ AmbientLight,
31
+ LightingEffect,
32
+ PostProcessEffect,
33
+ _SunLight
34
+ } from '@deck.gl/core';
35
+ import {brightnessContrast, hueSaturation, ink, dotScreen, vibrance} from '@luma.gl/shadertools';
28
36
  import {SolidPolygonLayer} from '@deck.gl/layers';
29
37
  import {TileLayer} from '@deck.gl/geo-layers';
30
38
  import {errorNotification} from 'utils/notifications-utils';
@@ -54,6 +62,68 @@ import {
54
62
  import {observeDimensions, unobserveDimensions} from '../utils/observe-dimensions';
55
63
  import {LOCALE_CODES} from 'localization/locales';
56
64
 
65
+ // 3D tiles
66
+ import {_TerrainExtension as TerrainExtension} from '@deck.gl/extensions';
67
+ import {Tile3DLayer} from '@deck.gl/geo-layers';
68
+
69
+ const GOOGLE_MAPS_API_KEY = 'AIzaSyCpvQymc5wjSYIsxy3RV1widM3p3h78CAk';
70
+
71
+ class CustomTile3DLayer extends Tile3DLayer {
72
+ static layerName = 'CustomTile3DLayer';
73
+
74
+ filterSubLayer({layer, viewport}) {
75
+ // Do not show tiles which are many layers too low in resolution (avoids artifacts)
76
+ const lodZoom = 22 - Math.log2(layer.props.tile.lodMetricValue);
77
+ return lodZoom > viewport?.zoom;
78
+ }
79
+ }
80
+
81
+ let h = 0;
82
+ const tiles3d = new CustomTile3DLayer({
83
+ id: 'google-3d-tiles',
84
+ data: 'https://tile.googleapis.com/v1/3dtiles/root.json',
85
+ onTilesetLoad: tileset3d => {
86
+ tileset3d.options.maximumScreenSpaceError = 5;
87
+ tileset3d._onTileLoadError = () => {};
88
+ tileset3d.options.onTraversalComplete = selectedTiles => {
89
+ let minLod = Infinity;
90
+ for (const {lodMetricValue} of selectedTiles) {
91
+ if (lodMetricValue < minLod) minLod = lodMetricValue;
92
+ }
93
+ const filtered = selectedTiles.filter(t => t.lodMetricValue < 4 * minLod);
94
+
95
+ // Hacky way to obtain height above sea level to improve controls
96
+ if (filtered.length) {
97
+ h = filtered.map(t => t.boundingBox[0][2]).reduce((a, n) => a + n) / filtered.length;
98
+ }
99
+
100
+ return selectedTiles;
101
+ };
102
+ },
103
+ loadOptions: {
104
+ fetch: {headers: {'X-GOOG-API-KEY': GOOGLE_MAPS_API_KEY}}
105
+ },
106
+ // @ts-ignore
107
+ operation: 'terrain+draw' // Required to enable draping of other layers
108
+ });
109
+ const terrainExtension = new TerrainExtension();
110
+
111
+ // Effects
112
+ const ambientLight = new AmbientLight({color: [255, 255, 255], intensity: 1});
113
+ const sunLight = new _SunLight({
114
+ timestamp: 1683869915777,
115
+ color: [255, 255, 255],
116
+ intensity: 1,
117
+ _shadow: true
118
+ });
119
+ const lightingEffect = new LightingEffect({
120
+ ambientLight,
121
+ sunLight
122
+ });
123
+ lightingEffect.shadowColor = [0, 0, 0, 0];
124
+
125
+ const vibranceEffect = new PostProcessEffect(vibrance, {amount: 1});
126
+
57
127
  // Performance debugging
58
128
  import {createTracker, createLayerUpdateTracker, renderPerformanceStats} from './performance';
59
129
  const trackers = {};
@@ -130,6 +200,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
130
200
  mapState: PropTypes.object.isRequired,
131
201
  mapControls: PropTypes.object.isRequired,
132
202
  mapStyle: PropTypes.object.isRequired,
203
+ sketchValue: PropTypes.object,
133
204
  mapboxApiAccessToken: PropTypes.string.isRequired,
134
205
  mapboxApiUrl: PropTypes.string,
135
206
  visStateActions: PropTypes.object.isRequired,
@@ -339,6 +410,42 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
339
410
  return screenCoord && {x: screenCoord[0], y: screenCoord[1]};
340
411
  }
341
412
 
413
+ _getEffectsValues(mapStyle) {
414
+ const inkStrength = mapStyle.sketchValue?.inkStrength || 0.2;
415
+ const hue = mapStyle.sketchValue?.hue || 0;
416
+ const hueValueSaturation = mapStyle.sketchValue?.hueSaturation || 0.3;
417
+ const inkEffect = new PostProcessEffect(ink, {strength: inkStrength});
418
+ const hueSaturationEffect = new PostProcessEffect(hueSaturation, {
419
+ hue,
420
+ saturation: hueValueSaturation
421
+ });
422
+ const allEffects = [lightingEffect, hueSaturationEffect, vibranceEffect, inkEffect];
423
+
424
+ const dotScreenValue = mapStyle.sketchValue?.dotScreen || false;
425
+ if (dotScreenValue) {
426
+ const dotScreenEffect = new PostProcessEffect(dotScreen, {
427
+ centerX: 0,
428
+ centerY: 0,
429
+ angle: 0,
430
+ size: 1
431
+ });
432
+ const brightnessContrastEffect = new PostProcessEffect(brightnessContrast, {
433
+ contrast: 0.4,
434
+ brightness: 0.1
435
+ });
436
+ allEffects.push(dotScreenEffect);
437
+ allEffects.push(brightnessContrastEffect);
438
+ } else {
439
+ const brightnessContrastEffect = new PostProcessEffect(brightnessContrast, {
440
+ contrast: 0,
441
+ brightness: 0.2
442
+ });
443
+ allEffects.push(brightnessContrastEffect);
444
+ }
445
+
446
+ return allEffects;
447
+ }
448
+
342
449
  _renderDeckOverlay(layersForDeck) {
343
450
  const {
344
451
  mapState,
@@ -404,6 +511,19 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
404
511
  );
405
512
  }
406
513
 
514
+ let effects = [];
515
+ if (mapStyle.bottomMapStyle?.type === 'gmaps_3d') {
516
+ // Inject 3D tiles when map style is Voyager without layers
517
+ deckGlLayers = deckGlLayers
518
+ .filter(l => Boolean(l && l.clone))
519
+ .map(l => l.clone({extensions: [...l.props.extensions, terrainExtension]}));
520
+ deckGlLayers.push(tiles3d.clone());
521
+
522
+ if (mapStyle.styleType === 'google-3d-sketch') {
523
+ effects = this._getEffectsValues(mapStyle);
524
+ }
525
+ }
526
+
407
527
  // Limit renders
408
528
  const hasRendered = this._hasRendered;
409
529
  const resetHasRendered = () => (hasRendered.current = false);
@@ -412,22 +532,26 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
412
532
  controller={true}
413
533
  {...this.props.deckGlProps}
414
534
  viewState={mapState}
415
- onViewStateChange={({viewState}) => {
535
+ onViewStateChange={({viewState, interactionState}) => {
416
536
  // Limit updates (prevents freezes when dev tools open)
417
537
  if (!hasRendered.current && viewState.width > 1 && viewState.height > 1) {
418
538
  hasRendered.current = true;
419
- this._onViewportChange(viewState);
539
+ this._onViewportChange(viewState, interactionState);
420
540
  }
421
541
  }}
422
542
  id="default-deckgl-overlay"
423
543
  layers={deckGlLayers}
544
+ effects={effects}
424
545
  onBeforeRender={opts => {
425
546
  resetHasRendered();
426
547
  this._onBeforeRender(opts);
427
548
  }}
428
549
  onHover={visStateActions.onLayerHover}
429
550
  onClick={visStateActions.onLayerClick}
430
- onError={this._onDeckError}
551
+ onError={e => {
552
+ debugger;
553
+ this._onDeckError(e);
554
+ }}
431
555
  ref={comp => {
432
556
  if (comp && comp.deck && comp.deck !== this._deck) {
433
557
  this._deck = comp.deck;
@@ -469,16 +593,20 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
469
593
  }
470
594
  }
471
595
 
472
- _onViewportChange = viewState => {
596
+ _onViewportChange = (viewState, interactionState) => {
473
597
  trackers.viewportChangeCount?.increment();
598
+
474
599
  const {width, height, ...restViewState} = viewState;
475
600
  const {primary, isExport} = this.props;
476
601
  // react-map-gl sends 0,0 dimensions during initialization
477
602
  // after we have received proper dimensions from observeDimensions
478
603
  const next = {
479
604
  ...(width > 0 && height > 0 ? viewState : restViewState),
605
+
606
+ // Auto-update the camera height according to 3D tiles, except when transitioning
607
+ ...(interactionState && !interactionState.inTransition && {position: [0, 0, h]})
480
608
  // enabling transition in two maps may lead to endless update loops
481
- transitionDuration: primary ? TRANSITION_DURATION : 0
609
+ // transitionDuration: primary ? TRANSITION_DURATION : 0 // Disable for 3D tiles transitions
482
610
  };
483
611
  if (typeof this.props.onViewStateChange === 'function') {
484
612
  this.props.onViewStateChange(next);
@@ -501,6 +629,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
501
629
  mapState,
502
630
  mapStyle,
503
631
  mapStateActions,
632
+ sketchValue,
504
633
  layers,
505
634
  MapComponent,
506
635
  datasets,
@@ -536,6 +665,8 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
536
665
  const isSplit = Boolean(mapState.isSplit);
537
666
  const mousePosition = this._mousePosition;
538
667
 
668
+ const needsBasemap = mapStyle.bottomMapStyle.type !== 'gmaps_3d';
669
+
539
670
  return (
540
671
  <>
541
672
  <MapControl
@@ -562,41 +693,49 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
562
693
  onSetLocale={uiStateActions.setLocale}
563
694
  onToggleEditorVisibility={visStateActions.toggleEditorVisibility}
564
695
  />
565
- <MapComponent
566
- {...mapProps}
567
- key="bottom"
568
- ref={this._setMapboxMap}
569
- mapStyle={mapStyle.bottomMapStyle}
570
- getCursor={this.props.hoverInfo ? () => 'pointer' : undefined}
571
- onMouseMove={evt => {
572
- // Sending mouse move updates via Redux is expensive. Store
573
- // locally and rely on deck.gl to drive render updates
574
- // See Builder: features/builder/ui/KeplerGl/MapContainer/MapContainer.tsx
575
- mousePosition.current = {mousePosition: evt.point};
576
- }}
577
- >
578
- {PERF_DEBUG && renderPerformanceStats()}
579
- {this._renderDeckOverlay(layersForDeck)}
580
- {this._renderMapboxOverlays()}
581
- <Editor
582
- index={index}
583
- datasets={datasets}
584
- editor={editor}
585
- filters={this.polygonFilters(this.props)}
586
- isEnabled={isEdit}
587
- layers={layers}
588
- layersToRender={layersToRender}
589
- onDeleteFeature={visStateActions.deleteFeature}
590
- onSelect={visStateActions.setSelectedFeature}
591
- onUpdate={visStateActions.setFeatures}
592
- onTogglePolygonFilter={visStateActions.setPolygonFilterLayer}
593
- style={{
594
- pointerEvents: isEdit ? 'all' : 'none',
595
- position: 'absolute',
596
- display: editor.visible ? 'block' : 'none'
696
+ {needsBasemap ? (
697
+ <MapComponent
698
+ {...mapProps}
699
+ key="bottom"
700
+ ref={this._setMapboxMap}
701
+ mapStyle={mapStyle.bottomMapStyle}
702
+ sketchValue={sketchValue}
703
+ getCursor={this.props.hoverInfo ? () => 'pointer' : undefined}
704
+ onMouseMove={evt => {
705
+ // Sending mouse move updates via Redux is expensive. Store
706
+ // locally and rely on deck.gl to drive render updates
707
+ // See Builder: features/builder/ui/KeplerGl/MapContainer/MapContainer.tsx
708
+ mousePosition.current = {mousePosition: evt.point};
597
709
  }}
598
- />
599
- </MapComponent>
710
+ >
711
+ {PERF_DEBUG && renderPerformanceStats()}
712
+ {this._renderDeckOverlay(layersForDeck)}
713
+ {this._renderMapboxOverlays()}
714
+ <Editor
715
+ index={index}
716
+ datasets={datasets}
717
+ editor={editor}
718
+ filters={this.polygonFilters(this.props)}
719
+ isEnabled={isEdit}
720
+ layers={layers}
721
+ layersToRender={layersToRender}
722
+ onDeleteFeature={visStateActions.deleteFeature}
723
+ onSelect={visStateActions.setSelectedFeature}
724
+ onUpdate={visStateActions.setFeatures}
725
+ onTogglePolygonFilter={visStateActions.setPolygonFilterLayer}
726
+ style={{
727
+ pointerEvents: isEdit ? 'all' : 'none',
728
+ position: 'absolute',
729
+ display: editor.visible ? 'block' : 'none'
730
+ }}
731
+ />
732
+ </MapComponent>
733
+ ) : (
734
+ <>
735
+ {PERF_DEBUG && renderPerformanceStats()}
736
+ {this._renderDeckOverlay(layersForDeck)}
737
+ </>
738
+ )}
600
739
  {mapStyle.topMapStyle || hasGeocoderLayer ? (
601
740
  <div style={MAP_STYLE.top}>
602
741
  <MapComponent {...mapProps} key="top" mapStyle={mapStyle.topMapStyle}>
@@ -47,6 +47,7 @@ function MapManagerFactory(MapStyleSelector, LayerGroupSelector, ColorSelector)
47
47
 
48
48
  buildingColorSelector = props => props.mapStyle.threeDBuildingColor;
49
49
  setColorSelector = props => props.mapStyleActions.set3dBuildingColor;
50
+ setTiles3dSketchValue = props => props.mapStyleActions.setTiles3dSketchValue;
50
51
 
51
52
  _toggleSelecting = () => {
52
53
  this.setState({isSelecting: !this.state.isSelecting});
@@ -72,6 +72,7 @@ export type ActionType = {
72
72
  MAP_CONFIG_CHANGE: string;
73
73
  SET_DEFAULT_MAP_STYLE: string;
74
74
  MAP_STYLE_CHANGE: string;
75
+ SET_TILES_3D_SKETCH_VALUE: string;
75
76
  LOAD_MAP_STYLES: string;
76
77
  LOAD_MAP_STYLE_ERR: string;
77
78
  INPUT_MAP_STYLE: string;
@@ -123,6 +123,7 @@ const ActionTypes = {
123
123
  MAP_CONFIG_CHANGE: `${ACTION_PREFIX}MAP_CONFIG_CHANGE`,
124
124
  SET_DEFAULT_MAP_STYLE: `${ACTION_PREFIX}SET_DEFAULT_MAP_STYLE`,
125
125
  MAP_STYLE_CHANGE: `${ACTION_PREFIX}MAP_STYLE_CHANGE`,
126
+ SET_TILES_3D_SKETCH_VALUE: `${ACTION_PREFIX}SET_TILES_3D_SKETCH_VALUE`,
126
127
  LOAD_MAP_STYLES: `${ACTION_PREFIX}LOAD_MAP_STYLES`,
127
128
  LOAD_MAP_STYLE_ERR: `${ACTION_PREFIX}LOAD_MAP_STYLE_ERR`,
128
129
  INPUT_MAP_STYLE: `${ACTION_PREFIX}INPUT_MAP_STYLE`,
@@ -18,7 +18,6 @@
18
18
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  // THE SOFTWARE.
20
20
 
21
- import '@loaders.gl/polyfills';
22
21
  import {parseInBatches} from '@loaders.gl/core';
23
22
  import {JSONLoader, _JSONPath} from '@loaders.gl/json';
24
23
  import {CSVLoader} from '@loaders.gl/csv';
@@ -51,6 +51,7 @@ export type MapStyle = {
51
51
  inputStyle: InputStyle;
52
52
  threeDBuildingColor: RGBColor;
53
53
  custom3DBuildingColor: boolean;
54
+ sketchValue: {inkStrength: number; hue: number; hueSaturation: number; dotScreen: boolean};
54
55
  };
55
56
 
56
57
  export const INITIAL_MAP_STYLE: MapStyle;
@@ -64,6 +65,7 @@ export function loadMapStyleErrUpdater(state: MapStyle, action: MapStyleActions.
64
65
  export function mapStyleChangeUpdater(state: MapStyle, action: MapStyleActions.MapStyleChangeUpdaterAction): MapStyle;
65
66
  export function loadCustomMapStyleUpdater(state: MapStyle, action: MapStyleActions.LoadCustomMapStyleUpdaterAction): MapStyle;
66
67
  export function set3dBuildingColorUpdater(state: MapStyle, action: MapStyleActions.Set3dBuildingColorUpdaterAction): MapStyle;
68
+ export function setTiles3dSketchValueUpdater(state: MapStyle, action: MapStyleActions.SetTiles3dSketchValueActionUpdaterAction): MapStyle;
67
69
 
68
70
  export function receiveMapConfigUpdater(state: MapStyle, action: {
69
71
  type?: ActionTypes.RECEIVE_MAP_CONFIG;
@@ -118,6 +118,7 @@ const mapStyleUpdaters = null;
118
118
  * @memberof mapStyleUpdaters
119
119
  * @constant
120
120
  * @property styleType - Default: `'dark'`
121
+ * @property sketchValue - Default: {inkStrength: 0.2; hue: 0; hueSaturation: 0.3; dotScreen: false};
121
122
  * @property visibleLayerGroups - Default: `{}`
122
123
  * @property topLayerGroups - Default: `{}`
123
124
  * @property mapStyles - mapping from style key to style object
@@ -138,9 +139,16 @@ export const INITIAL_MAP_STYLE = getDefaultState();
138
139
  * @param {Object} visibleLayerGroups - visible layers of bottom map
139
140
  * @param {Object} topLayerGroups - visible layers of top map
140
141
  * @param {Object} mapStyles - a dictionary of all map styles
142
+ * @param {Object} sketchValue - current sketch value
141
143
  * @returns {Object} bottomMapStyle | topMapStyle | isRaster
142
144
  */
143
- export function getMapStyles({styleType, visibleLayerGroups, topLayerGroups, mapStyles}) {
145
+ export function getMapStyles({
146
+ styleType,
147
+ visibleLayerGroups,
148
+ topLayerGroups,
149
+ mapStyles,
150
+ sketchValue
151
+ }) {
144
152
  const mapStyle = mapStyles[styleType];
145
153
 
146
154
  // style might not be loaded yet
@@ -155,7 +163,8 @@ export function getMapStyles({styleType, visibleLayerGroups, topLayerGroups, map
155
163
  : editBottomMapStyle({
156
164
  id: styleType,
157
165
  mapStyle,
158
- visibleLayerGroups
166
+ visibleLayerGroups,
167
+ sketchValue
159
168
  });
160
169
 
161
170
  const hasTopLayer = editable && Object.values(topLayerGroups).some(v => v);
@@ -248,13 +257,32 @@ export const mapConfigChangeUpdater = (state, action) => ({
248
257
  })
249
258
  });
250
259
 
260
+ /**
261
+ * Updates Tiles 3D Sketch value
262
+ * @memberof mapStyleUpdaters
263
+ * @type {typeof import('./map-style-updaters').setTiles3dSketchValueUpdater}
264
+ */
265
+ export const setTiles3dSketchValueUpdater = (state, {payload: sketchValue}) => {
266
+ const newState = {
267
+ ...state,
268
+ sketchValue
269
+ };
270
+ return {
271
+ ...newState,
272
+ ...getMapStyles({
273
+ ...state,
274
+ sketchValue
275
+ })
276
+ };
277
+ };
278
+
251
279
  /**
252
280
  * Change to another map style. The selected style should already been loaded into `mapStyle.mapStyles`
253
281
  * @memberof mapStyleUpdaters
254
282
  * @type {typeof import('./map-style-updaters').mapStyleChangeUpdater}
255
283
  * @public
256
284
  */
257
- export const mapStyleChangeUpdater = (state, {payload: styleType}) => {
285
+ export const mapStyleChangeUpdater = (state, {payload: styleType, sketchValue}) => {
258
286
  if (!state.mapStyles[styleType]) {
259
287
  // we might not have received the style yet
260
288
  return state;
@@ -273,12 +301,14 @@ export const mapStyleChangeUpdater = (state, {payload: styleType}) => {
273
301
  return {
274
302
  ...state,
275
303
  styleType,
304
+ sketchValue,
276
305
  visibleLayerGroups,
277
306
  threeDBuildingColor,
278
307
  ...getMapStyles({
279
308
  ...state,
280
309
  visibleLayerGroups,
281
- styleType
310
+ styleType,
311
+ sketchValue
282
312
  })
283
313
  };
284
314
  };
@@ -310,7 +340,6 @@ export const loadMapStylesUpdater = (state, action) => {
310
340
  ...addLayerGroups
311
341
  }
312
342
  };
313
-
314
343
  return newStyles[state.styleType]
315
344
  ? mapStyleChangeUpdater(newState, {payload: state.styleType})
316
345
  : newState;
@@ -31,6 +31,7 @@ const actionHandler = {
31
31
  [ActionTypes.INPUT_MAP_STYLE]: mapStyleUpdaters.inputMapStyleUpdater,
32
32
  [ActionTypes.MAP_CONFIG_CHANGE]: mapStyleUpdaters.mapConfigChangeUpdater,
33
33
  [ActionTypes.MAP_STYLE_CHANGE]: mapStyleUpdaters.mapStyleChangeUpdater,
34
+ [ActionTypes.SET_TILES_3D_SKETCH_VALUE]: mapStyleUpdaters.setTiles3dSketchValueUpdater,
34
35
  [ActionTypes.REQUEST_MAP_STYLES]: mapStyleUpdaters.requestMapStylesUpdater,
35
36
  [ActionTypes.LOAD_MAP_STYLES]: mapStyleUpdaters.loadMapStylesUpdater,
36
37
  [ActionTypes.LOAD_MAP_STYLE_ERR]: mapStyleUpdaters.loadMapStyleErrUpdater,
@@ -72,7 +72,7 @@ export const editTopMapStyle = memoize(({id, mapStyle, visibleLayerGroups}) => {
72
72
  * @param {Object} visibleLayerGroups - visible layers of bottom map
73
73
  * @returns {Object} bottom map style
74
74
  */
75
- export const editBottomMapStyle = memoize(({id, mapStyle, visibleLayerGroups}) => {
75
+ export const editBottomMapStyle = memoize(({id, mapStyle, visibleLayerGroups, sketchValue}) => {
76
76
  const invisibleFilters = (mapStyle.layerGroups || [])
77
77
  .filter(lg => !visibleLayerGroups[lg.slug])
78
78
  .map(lg => lg.filter);
@@ -85,7 +85,8 @@ export const editBottomMapStyle = memoize(({id, mapStyle, visibleLayerGroups}) =
85
85
 
86
86
  return {
87
87
  ...mapStyle.style,
88
- layers: filteredLayers
88
+ layers: filteredLayers,
89
+ sketchValue
89
90
  };
90
91
  }, resolver);
91
92