kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
147 lines (144 loc) • 20.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LisaToolComponent = LisaToolComponent;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react");
var _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib");
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/actions/src");
var _utils = require("./utils");
var _layerCreationTool = require("./kepler-tools/layer-creation-tool");
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; }
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Use LisaToolComponent adding a customized Lisa map layer to kepler.gl
*/
function LisaToolComponent(props) {
var datasets = (0, _lib.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.datasets;
});
var layers = (0, _lib.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.layers;
});
var dispatch = (0, _lib.useDispatch)();
var originalDatasetName = props.originalDatasetName,
datasetName = props.datasetName,
significanceThreshold = props.significanceThreshold,
clusters = props.clusters,
lagValues = props.lagValues,
pValues = props.pValues,
lisaValues = props.lisaValues,
sigCategories = props.sigCategories,
nn = props.nn,
labels = props.labels,
colors = props.colors;
// save the result from lisa tool to a new lisa dataset
(0, _react.useEffect)(function () {
if (!clusters || !lagValues || !pValues || !lisaValues || !sigCategories || !nn || !labels || !colors) {
return;
}
var lisaData = {
clusters: clusters,
lagValues: lagValues,
pValues: pValues,
lisaValues: lisaValues,
sigCategories: sigCategories,
nn: nn,
fillColor: clusters.map(function (cluster, index) {
return pValues[index] < significanceThreshold ? colors[cluster] : colors[0];
}),
label: clusters.map(function (cluster, index) {
return pValues[index] < significanceThreshold ? labels[cluster] : labels[0];
})
};
// create a new geojson layer using clusters with ordinal color scale and customColorScale and colors
var newDataset = (0, _utils.saveAsDataset)(datasets, layers, originalDatasetName, datasetName, lisaData);
if (newDataset) {
// add the new dataset to the map
dispatch((0, _src.addDataToMap)({
datasets: [newDataset],
options: {
autoCreateLayers: false,
centerMap: false
}
}));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
// create a LISA layer for the new lisa dataset
(0, _react.useEffect)(function () {
var datasetId = Object.keys(datasets).find(function (dataId) {
return datasets[dataId].label === datasetName;
});
if (!datasetId || !colors || !labels) return;
var newDataset = datasets[datasetId];
if (newDataset) {
var layerId = "".concat(datasetName, "_lisa");
// check if the layer already exists?
if (layers.find(function (l) {
return l.id === layerId;
})) {
return;
}
// add a new layer for the new dataset
var layer = (0, _layerCreationTool.guessDefaultLayer)(newDataset, 'geojson');
if (!layer) return;
var colorField = {
name: 'clusters',
type: 'integer'
};
var colorDomain = Array.from({
length: colors.length
}, function (_, i) {
return i;
});
var colorLegends = {};
for (var i = 0; i < colors.length; i++) {
colorLegends[colors[i]] = labels[i];
}
var colorMap = colors.map(function (color, index) {
return [index, color];
});
var newLayer = {
id: layerId,
type: layer.type,
config: _objectSpread(_objectSpread({}, layer.config), {}, {
dataId: datasetId,
columns: Object.keys(layer.config.columns).reduce(function (acc, key) {
acc[key] = layer.config.columns[key].value;
return acc;
}, {}),
colorScale: 'customOrdinal',
colorField: colorField,
strokeColorDomain: colorDomain,
strokeColorField: colorField,
strokeColorScale: 'customOrdinal',
visConfig: _objectSpread(_objectSpread({}, layer.config.visConfig), {}, {
colorRange: _objectSpread(_objectSpread({}, layer.config.visConfig.colorRange), {}, {
colorDomain: colorDomain,
colors: colors,
colorMap: colorMap,
colorLegends: colorLegends
}),
strokeColorRange: {
category: 'Custom',
name: 'custom',
colors: colors,
colorMap: colorMap
},
strokeOpacity: 1,
stroked: true,
strokedWidth: 0.5
})
})
};
dispatch((0, _src.addLayer)(newLayer, datasetId));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [datasets]);
return null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2xpYiIsIl9zcmMiLCJfdXRpbHMiLCJfbGF5ZXJDcmVhdGlvblRvb2wiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkxpc2FUb29sQ29tcG9uZW50IiwicHJvcHMiLCJkYXRhc2V0cyIsInVzZVNlbGVjdG9yIiwic3RhdGUiLCJkZW1vIiwia2VwbGVyR2wiLCJtYXAiLCJ2aXNTdGF0ZSIsImxheWVycyIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJvcmlnaW5hbERhdGFzZXROYW1lIiwiZGF0YXNldE5hbWUiLCJzaWduaWZpY2FuY2VUaHJlc2hvbGQiLCJjbHVzdGVycyIsImxhZ1ZhbHVlcyIsInBWYWx1ZXMiLCJsaXNhVmFsdWVzIiwic2lnQ2F0ZWdvcmllcyIsIm5uIiwibGFiZWxzIiwiY29sb3JzIiwidXNlRWZmZWN0IiwibGlzYURhdGEiLCJmaWxsQ29sb3IiLCJjbHVzdGVyIiwiaW5kZXgiLCJsYWJlbCIsIm5ld0RhdGFzZXQiLCJzYXZlQXNEYXRhc2V0IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJkYXRhc2V0SWQiLCJmaW5kIiwiZGF0YUlkIiwibGF5ZXJJZCIsImNvbmNhdCIsImwiLCJpZCIsImxheWVyIiwiZ3Vlc3NEZWZhdWx0TGF5ZXIiLCJjb2xvckZpZWxkIiwibmFtZSIsInR5cGUiLCJjb2xvckRvbWFpbiIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiY29sb3JMZWdlbmRzIiwiY29sb3JNYXAiLCJjb2xvciIsIm5ld0xheWVyIiwiY29uZmlnIiwiY29sdW1ucyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiY29sb3JTY2FsZSIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yU2NhbGUiLCJ2aXNDb25maWciLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsImNhdGVnb3J5Iiwic3Ryb2tlT3BhY2l0eSIsInN0cm9rZWQiLCJzdHJva2VkV2lkdGgiLCJhZGRMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9haS1hc3Npc3RhbnQvc3JjL3Rvb2xzL2xpc2EtdG9vbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHt1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2gsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2FkZERhdGFUb01hcCwgYWRkTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0xpc2FBZGRpdGlvbmFsRGF0YX0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZ2VvZGEnO1xuaW1wb3J0IHtzYXZlQXNEYXRhc2V0fSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7Z3Vlc3NEZWZhdWx0TGF5ZXJ9IGZyb20gJy4va2VwbGVyLXRvb2xzL2xheWVyLWNyZWF0aW9uLXRvb2wnO1xuaW1wb3J0IHtTdGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9haS1hc3Npc3RhbnQtbWFuYWdlcic7XG5cbi8qKlxuICogVXNlIExpc2FUb29sQ29tcG9uZW50IGFkZGluZyBhIGN1c3RvbWl6ZWQgTGlzYSBtYXAgbGF5ZXIgdG8ga2VwbGVyLmdsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMaXNhVG9vbENvbXBvbmVudChwcm9wczogTGlzYUFkZGl0aW9uYWxEYXRhKSB7XG4gIGNvbnN0IGRhdGFzZXRzID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5rZXBsZXJHbC5tYXAudmlzU3RhdGUuZGF0YXNldHMpO1xuICBjb25zdCBsYXllcnMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5sYXllcnMpO1xuICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG5cbiAgY29uc3Qge1xuICAgIG9yaWdpbmFsRGF0YXNldE5hbWUsXG4gICAgZGF0YXNldE5hbWUsXG4gICAgc2lnbmlmaWNhbmNlVGhyZXNob2xkLFxuICAgIGNsdXN0ZXJzLFxuICAgIGxhZ1ZhbHVlcyxcbiAgICBwVmFsdWVzLFxuICAgIGxpc2FWYWx1ZXMsXG4gICAgc2lnQ2F0ZWdvcmllcyxcbiAgICBubixcbiAgICBsYWJlbHMsXG4gICAgY29sb3JzXG4gIH0gPSBwcm9wcztcblxuICAvLyBzYXZlIHRoZSByZXN1bHQgZnJvbSBsaXNhIHRvb2wgdG8gYSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWNsdXN0ZXJzIHx8XG4gICAgICAhbGFnVmFsdWVzIHx8XG4gICAgICAhcFZhbHVlcyB8fFxuICAgICAgIWxpc2FWYWx1ZXMgfHxcbiAgICAgICFzaWdDYXRlZ29yaWVzIHx8XG4gICAgICAhbm4gfHxcbiAgICAgICFsYWJlbHMgfHxcbiAgICAgICFjb2xvcnNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaXNhRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHtcbiAgICAgIGNsdXN0ZXJzLFxuICAgICAgbGFnVmFsdWVzLFxuICAgICAgcFZhbHVlcyxcbiAgICAgIGxpc2FWYWx1ZXMsXG4gICAgICBzaWdDYXRlZ29yaWVzLFxuICAgICAgbm4sXG4gICAgICBmaWxsQ29sb3I6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gY29sb3JzW2NsdXN0ZXJdIDogY29sb3JzWzBdXG4gICAgICApLFxuICAgICAgbGFiZWw6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gbGFiZWxzW2NsdXN0ZXJdIDogbGFiZWxzWzBdXG4gICAgICApXG4gICAgfTtcbiAgICAvLyBjcmVhdGUgYSBuZXcgZ2VvanNvbiBsYXllciB1c2luZyBjbHVzdGVycyB3aXRoIG9yZGluYWwgY29sb3Igc2NhbGUgYW5kIGN1c3RvbUNvbG9yU2NhbGUgYW5kIGNvbG9yc1xuICAgIGNvbnN0IG5ld0RhdGFzZXQgPSBzYXZlQXNEYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIG9yaWdpbmFsRGF0YXNldE5hbWUsIGRhdGFzZXROYW1lLCBsaXNhRGF0YSk7XG4gICAgaWYgKG5ld0RhdGFzZXQpIHtcbiAgICAgIC8vIGFkZCB0aGUgbmV3IGRhdGFzZXQgdG8gdGhlIG1hcFxuICAgICAgZGlzcGF0Y2goXG4gICAgICAgIGFkZERhdGFUb01hcCh7ZGF0YXNldHM6IFtuZXdEYXRhc2V0XSwgb3B0aW9uczoge2F1dG9DcmVhdGVMYXllcnM6IGZhbHNlLCBjZW50ZXJNYXA6IGZhbHNlfX0pXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBjcmVhdGUgYSBMSVNBIGxheWVyIGZvciB0aGUgbmV3IGxpc2EgZGF0YXNldFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZSk7XG4gICAgaWYgKCFkYXRhc2V0SWQgfHwgIWNvbG9ycyB8fCAhbGFiZWxzKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdEYXRhc2V0ID0gZGF0YXNldHNbZGF0YXNldElkXTtcbiAgICBpZiAobmV3RGF0YXNldCkge1xuICAgICAgY29uc3QgbGF5ZXJJZCA9IGAke2RhdGFzZXROYW1lfV9saXNhYDtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBsYXllciBhbHJlYWR5IGV4aXN0cz9cbiAgICAgIGlmIChsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxheWVySWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGFkZCBhIG5ldyBsYXllciBmb3IgdGhlIG5ldyBkYXRhc2V0XG4gICAgICBjb25zdCBsYXllciA9IGd1ZXNzRGVmYXVsdExheWVyKG5ld0RhdGFzZXQsICdnZW9qc29uJyk7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBjb2xvckZpZWxkID0ge1xuICAgICAgICBuYW1lOiAnY2x1c3RlcnMnLFxuICAgICAgICB0eXBlOiAnaW50ZWdlcidcbiAgICAgIH07XG4gICAgICBjb25zdCBjb2xvckRvbWFpbiA9IEFycmF5LmZyb20oe2xlbmd0aDogY29sb3JzLmxlbmd0aH0sIChfLCBpKSA9PiBpKTtcbiAgICAgIGNvbnN0IGNvbG9yTGVnZW5kcyA9IHt9O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29sb3JMZWdlbmRzW2NvbG9yc1tpXV0gPSBsYWJlbHNbaV07XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xvck1hcCA9IGNvbG9ycy5tYXAoKGNvbG9yLCBpbmRleCkgPT4gW2luZGV4LCBjb2xvcl0pO1xuICAgICAgY29uc3QgbmV3TGF5ZXIgPSB7XG4gICAgICAgIGlkOiBsYXllcklkLFxuICAgICAgICB0eXBlOiBsYXllci50eXBlLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAuLi5sYXllci5jb25maWcsXG4gICAgICAgICAgZGF0YUlkOiBkYXRhc2V0SWQsXG4gICAgICAgICAgY29sdW1uczogT2JqZWN0LmtleXMobGF5ZXIuY29uZmlnLmNvbHVtbnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbGF5ZXIuY29uZmlnLmNvbHVtbnNba2V5XS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pLFxuICAgICAgICAgIGNvbG9yU2NhbGU6ICdjdXN0b21PcmRpbmFsJyxcbiAgICAgICAgICBjb2xvckZpZWxkLFxuICAgICAgICAgIHN0cm9rZUNvbG9yRG9tYWluOiBjb2xvckRvbWFpbixcbiAgICAgICAgICBzdHJva2VDb2xvckZpZWxkOiBjb2xvckZpZWxkLFxuICAgICAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdjdXN0b21PcmRpbmFsJyxcbiAgICAgICAgICB2aXNDb25maWc6IHtcbiAgICAgICAgICAgIC4uLmxheWVyLmNvbmZpZy52aXNDb25maWcsXG4gICAgICAgICAgICBjb2xvclJhbmdlOiB7XG4gICAgICAgICAgICAgIC4uLmxheWVyLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZSxcbiAgICAgICAgICAgICAgY29sb3JEb21haW4sXG4gICAgICAgICAgICAgIGNvbG9ycyxcbiAgICAgICAgICAgICAgY29sb3JNYXAsXG4gICAgICAgICAgICAgIGNvbG9yTGVnZW5kc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yUmFuZ2U6IHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdDdXN0b20nLFxuICAgICAgICAgICAgICBuYW1lOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgY29sb3JzLFxuICAgICAgICAgICAgICBjb2xvck1hcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6IDEsXG4gICAgICAgICAgICBzdHJva2VkOiB0cnVlLFxuICAgICAgICAgICAgc3Ryb2tlZFdpZHRoOiAwLjVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBkaXNwYXRjaChhZGRMYXllcihuZXdMYXllciwgZGF0YXNldElkKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2RhdGFzZXRzXSk7XG4gIHJldHVybiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLElBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGtCQUFBLEdBQUFKLE9BQUE7QUFBcUUsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFB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
;