@kepler.gl/reducers 3.1.0-alpha.0 → 3.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/combined-updaters.d.ts +79 -0
  2. package/dist/combined-updaters.js +358 -0
  3. package/dist/composer-helpers.d.ts +24 -0
  4. package/dist/composer-helpers.js +101 -0
  5. package/dist/composers.d.ts +18 -0
  6. package/dist/composers.js +23 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +105 -0
  9. package/dist/data-utils.d.ts +12 -0
  10. package/dist/data-utils.js +57 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +91 -0
  13. package/dist/index.d.ts +35 -0
  14. package/dist/index.js +342 -0
  15. package/dist/interaction-utils.d.ts +29 -0
  16. package/dist/interaction-utils.js +105 -0
  17. package/dist/layer-utils.d.ts +96 -0
  18. package/dist/layer-utils.js +310 -0
  19. package/dist/map-state-updaters.d.ts +93 -0
  20. package/dist/map-state-updaters.js +432 -0
  21. package/dist/map-state.d.ts +75 -0
  22. package/dist/map-state.js +35 -0
  23. package/dist/map-style-updaters.d.ts +179 -0
  24. package/dist/map-style-updaters.js +656 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +34 -0
  27. package/dist/merger-handler.d.ts +10 -0
  28. package/dist/merger-handler.js +105 -0
  29. package/dist/middleware.d.ts +8 -0
  30. package/dist/middleware.js +27 -0
  31. package/dist/provider-state-updaters.d.ts +35 -0
  32. package/dist/provider-state-updaters.js +348 -0
  33. package/dist/provider-state.d.ts +4 -0
  34. package/dist/provider-state.js +35 -0
  35. package/dist/root.d.ts +24 -0
  36. package/dist/root.js +206 -0
  37. package/dist/ui-state-updaters.d.ts +362 -0
  38. package/dist/ui-state-updaters.js +762 -0
  39. package/dist/ui-state.d.ts +3 -0
  40. package/dist/ui-state.js +37 -0
  41. package/dist/vis-state-merger.d.ts +143 -0
  42. package/dist/vis-state-merger.js +812 -0
  43. package/dist/vis-state-selectors.d.ts +10 -0
  44. package/dist/vis-state-selectors.js +30 -0
  45. package/dist/vis-state-updaters.d.ts +546 -0
  46. package/dist/vis-state-updaters.js +3338 -0
  47. package/dist/vis-state.d.ts +155 -0
  48. package/dist/vis-state.js +36 -0
  49. package/package.json +17 -17
@@ -0,0 +1,79 @@
1
+ import { MapState, UiState, AddDataToMapPayload } from '@kepler.gl/types';
2
+ import { MapStyle } from './map-style-updaters';
3
+ import { ProviderState } from './provider-state-updaters';
4
+ import { loadFilesSuccessUpdaterAction, MapStyleChangeUpdaterAction, LayerTypeChangeUpdaterAction, ToggleSplitMapUpdaterAction, ReplaceDataInMapPayload } from '@kepler.gl/actions';
5
+ import { VisState } from '@kepler.gl/schemas';
6
+ export declare type KeplerGlState = {
7
+ visState: VisState;
8
+ mapState: MapState;
9
+ mapStyle: MapStyle;
10
+ uiState: UiState;
11
+ providerState: ProviderState;
12
+ };
13
+ export declare const isValidConfig: (config: any) => unknown;
14
+ export declare const defaultAddDataToMapOptions: {
15
+ centerMap: boolean;
16
+ keepExistingConfig: boolean;
17
+ autoCreateLayers: boolean;
18
+ autoCreateTooltips: boolean;
19
+ };
20
+ /**
21
+ * Combine data and full configuration update in a single action
22
+ *
23
+ * @memberof combinedUpdaters
24
+ * @param {Object} state kepler.gl instance state, containing all subreducer state
25
+ * @param {Object} action
26
+ * @param {Object} action.payload `{datasets, options, config}`
27
+ * @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
28
+ * Each dataset object needs to have `info` and `data` property.
29
+ * @param [action.payload.options] option object `{centerMap: true}`
30
+ * @param [action.payload.config] map config
31
+ * @param [action.payload.info] map info contains title and description
32
+ * @returns nextState
33
+ *
34
+ * @typedef {Object} Dataset
35
+ * @property info -info of a dataset
36
+ * @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
37
+ * @property info.label - A display name of this dataset
38
+ * @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
39
+ * @property data.fields - ***required** Array of fields,
40
+ * @property data.fields.name - ***required** Name of the field,
41
+ * @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
42
+ *
43
+ * @public
44
+ */
45
+ export declare const addDataToMapUpdater: (state: KeplerGlState, { payload }: {
46
+ payload: AddDataToMapPayload;
47
+ }) => KeplerGlState;
48
+ export declare const loadFilesSuccessUpdater: (state: KeplerGlState, action: loadFilesSuccessUpdaterAction) => KeplerGlState;
49
+ export declare const addDataToMapComposed: (state: KeplerGlState, { payload }: {
50
+ payload: AddDataToMapPayload;
51
+ }) => KeplerGlState;
52
+ /**
53
+ * Updater that changes the map style by calling mapStyleChangeUpdater on visState.
54
+ * In addition to that, it does the following:
55
+ *
56
+ * 1. Update map overlay blending mode in accordance with the colorMode of the
57
+ * base map, but only if it's not in the `normal` mode.
58
+ *
59
+ * 2. Update all the layers which have the `darkBaseMapEnabled` config setting
60
+ * adjusting it in accordance with the colorMode of the base map.
61
+ *
62
+ */
63
+ export declare const combinedMapStyleChangeUpdater: (state: KeplerGlState, action: MapStyleChangeUpdaterAction) => KeplerGlState;
64
+ /**
65
+ * Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
66
+ * In addition to that, if the new layer type has the `darkBaseMapEnabled` config
67
+ * setting, we adjust it in accordance with the colorMode of the base map.s
68
+ */
69
+ export declare const combinedLayerTypeChangeUpdater: (state: KeplerGlState, action: LayerTypeChangeUpdaterAction) => KeplerGlState;
70
+ /**
71
+ * Make mapLegend active when toggleSplitMap action is called
72
+ */
73
+ export declare const toggleSplitMapUpdater: (state: KeplerGlState, action: ToggleSplitMapUpdaterAction) => KeplerGlState;
74
+ /**
75
+ * Updater replace a dataset in state
76
+ */
77
+ export declare const replaceDataInMapUpdater: (state: KeplerGlState, { payload }: {
78
+ payload: ReplaceDataInMapPayload;
79
+ }) => KeplerGlState;
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.toggleSplitMapUpdater = exports.replaceDataInMapUpdater = exports.loadFilesSuccessUpdater = exports.isValidConfig = exports.defaultAddDataToMapOptions = exports.combinedMapStyleChangeUpdater = exports.combinedLayerTypeChangeUpdater = exports.addDataToMapUpdater = exports.addDataToMapComposed = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _uiStateUpdaters = require("./ui-state-updaters");
10
+ var _visStateUpdaters = require("./vis-state-updaters");
11
+ var _mapStateUpdaters = require("./map-state-updaters");
12
+ var _mapStyleUpdaters = require("./map-style-updaters");
13
+ var _processors = require("@kepler.gl/processors");
14
+ var _composerHelpers = require("./composer-helpers");
15
+ var _utils = require("@kepler.gl/utils");
16
+ var _dataUtils = require("./data-utils");
17
+ var _constants = require("@kepler.gl/constants");
18
+ 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; }
19
+ 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
20
+ // Copyright contributors to the kepler.gl project
21
+ // compose action to apply result multiple reducers, with the output of one
22
+
23
+ /**
24
+ * Some actions will affect the entire kepler.lg instance state.
25
+ * The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
26
+ * as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
27
+ * @public
28
+ * @example
29
+ *
30
+ * import keplerGlReducer, {combinedUpdaters} from 'kepler.gl/reducers';
31
+ * // Root Reducer
32
+ * const reducers = combineReducers({
33
+ * keplerGl: keplerGlReducer,
34
+ * app: appReducer
35
+ * });
36
+ *
37
+ * const composedReducer = (state, action) => {
38
+ * switch (action.type) {
39
+ * // add data to map after receiving data from remote sources
40
+ * case 'LOAD_REMOTE_RESOURCE_SUCCESS':
41
+ * return {
42
+ * ...state,
43
+ * keplerGl: {
44
+ * ...state.keplerGl,
45
+ * // pass in kepler.gl instance state to combinedUpdaters
46
+ * map: combinedUpdaters.addDataToMapUpdater(
47
+ * state.keplerGl.map,
48
+ * {
49
+ * payload: {
50
+ * datasets: action.datasets,
51
+ * options: {readOnly: true},
52
+ * config: action.config
53
+ * }
54
+ * }
55
+ * )
56
+ * }
57
+ * };
58
+ * }
59
+ * return reducers(state, action);
60
+ * };
61
+ *
62
+ * export default composedReducer;
63
+ */
64
+
65
+ /* eslint-disable @typescript-eslint/no-unused-vars */
66
+ // @ts-ignore
67
+ var combinedUpdaters = null;
68
+ /* eslint-enable @typescript-eslint/no-unused-vars */
69
+
70
+ var isValidConfig = exports.isValidConfig = function isValidConfig(config) {
71
+ return (0, _utils.isPlainObject)(config) && (0, _utils.isPlainObject)(config.config) && config.version;
72
+ };
73
+ var defaultAddDataToMapOptions = exports.defaultAddDataToMapOptions = {
74
+ centerMap: true,
75
+ keepExistingConfig: false,
76
+ autoCreateLayers: true,
77
+ autoCreateTooltips: true
78
+ };
79
+
80
+ /**
81
+ * Combine data and full configuration update in a single action
82
+ *
83
+ * @memberof combinedUpdaters
84
+ * @param {Object} state kepler.gl instance state, containing all subreducer state
85
+ * @param {Object} action
86
+ * @param {Object} action.payload `{datasets, options, config}`
87
+ * @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
88
+ * Each dataset object needs to have `info` and `data` property.
89
+ * @param [action.payload.options] option object `{centerMap: true}`
90
+ * @param [action.payload.config] map config
91
+ * @param [action.payload.info] map info contains title and description
92
+ * @returns nextState
93
+ *
94
+ * @typedef {Object} Dataset
95
+ * @property info -info of a dataset
96
+ * @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
97
+ * @property info.label - A display name of this dataset
98
+ * @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
99
+ * @property data.fields - ***required** Array of fields,
100
+ * @property data.fields.name - ***required** Name of the field,
101
+ * @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
102
+ *
103
+ * @public
104
+ */
105
+ var addDataToMapUpdater = exports.addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
106
+ var _datasets$, _datasets$2, _datasets$3;
107
+ var payload = _ref.payload;
108
+ var datasets = payload.datasets,
109
+ config = payload.config,
110
+ info = payload.info;
111
+ var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
112
+
113
+ // check if progressive loading dataset by batches, and update visState directly
114
+ var isProgressiveLoading = Array.isArray(datasets) && ((_datasets$ = datasets[0]) === null || _datasets$ === void 0 ? void 0 : _datasets$.info.format) === 'arrow' && ((_datasets$2 = datasets[0]) === null || _datasets$2 === void 0 ? void 0 : _datasets$2.info.id) && ((_datasets$3 = datasets[0]) === null || _datasets$3 === void 0 ? void 0 : _datasets$3.info.id) in state.visState.datasets;
115
+ if (isProgressiveLoading) {
116
+ return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
117
+ datasets: datasets,
118
+ options: options,
119
+ config: config
120
+ }))])(state);
121
+ }
122
+
123
+ // @ts-expect-error
124
+ var parsedConfig = config;
125
+ if (isValidConfig(config)) {
126
+ // if passed in saved config
127
+ // @ts-expect-error
128
+ parsedConfig = state.visState.schema.parseSavedConfig(config);
129
+ }
130
+ var oldLayers = state.visState.layers;
131
+ var filterNewlyAddedLayers = function filterNewlyAddedLayers(layers) {
132
+ return layers.filter(function (nl) {
133
+ return !oldLayers.find(function (ol) {
134
+ return ol === nl;
135
+ });
136
+ });
137
+ };
138
+
139
+ // Returns undefined if not found, to make typescript happy
140
+ var findMapBoundsIfCentered = function findMapBoundsIfCentered(layers) {
141
+ var bounds = options.centerMap && (0, _dataUtils.findMapBounds)(layers);
142
+ return bounds ? bounds : undefined;
143
+ };
144
+ return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
145
+ datasets: datasets,
146
+ options: options,
147
+ config: parsedConfig
148
+ })), (0, _composerHelpers.if_)(Boolean(info), (0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.setMapInfoUpdater, {
149
+ info: info
150
+ }))),
151
+ // Note that fit bounds here won't be called in case datasets are created in Tasks.
152
+ // A separate Task to update bounds is created once the datasets are ready.
153
+ (0, _composerHelpers.with_)(function (_ref2) {
154
+ var visState = _ref2.visState;
155
+ return (0, _composerHelpers.pick_)('mapState')((0, _composerHelpers.apply_)(_mapStateUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
156
+ config: parsedConfig,
157
+ options: options,
158
+ bounds: findMapBoundsIfCentered(filterNewlyAddedLayers(visState.layers))
159
+ })));
160
+ }), (0, _composerHelpers.pick_)('mapStyle')((0, _composerHelpers.apply_)(_mapStyleUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
161
+ config: parsedConfig,
162
+ options: options
163
+ }))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.loadFilesSuccessUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.toggleModalUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.merge_)(Object.prototype.hasOwnProperty.call(options, 'readOnly') ? {
164
+ readOnly: options.readOnly
165
+ } : {}))])(state);
166
+ };
167
+ var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state, action) {
168
+ // still more to load
169
+ var payloads = (0, _processors.filesToDataPayload)(action.result);
170
+ var nextState = (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.merge_)({
171
+ fileLoading: false,
172
+ fileLoadingProgress: {}
173
+ }))])(state);
174
+ // make multiple add data to map calls
175
+ var stateWithData = (0, _composerHelpers.compose_)(payloads.map(function (p) {
176
+ return (0, _composerHelpers.apply_)(addDataToMapUpdater, (0, _composerHelpers.payload_)(p));
177
+ }))(nextState);
178
+ return stateWithData;
179
+ };
180
+ var addDataToMapComposed = exports.addDataToMapComposed = addDataToMapUpdater;
181
+
182
+ /**
183
+ * Helper which updates map overlay blending mode in visState,
184
+ * but only if it's not currently in the `normal` mode.
185
+ */
186
+ var updateOverlayBlending = function updateOverlayBlending(overlayBlending) {
187
+ return function (visState) {
188
+ if (visState.overlayBlending !== _constants.OVERLAY_BLENDINGS.normal.value) {
189
+ return _objectSpread(_objectSpread({}, visState), {}, {
190
+ overlayBlending: overlayBlending
191
+ });
192
+ }
193
+ return visState;
194
+ };
195
+ };
196
+
197
+ /**
198
+ * Helper which updates `darkBaseMapEnabled` in all the layers in visState which
199
+ * have this config setting (or in one specific layer if the `layerId` param is provided).
200
+ */
201
+ var updateDarkBaseMapLayers = function updateDarkBaseMapLayers(darkBaseMapEnabled) {
202
+ var layerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
203
+ return function (visState) {
204
+ return _objectSpread(_objectSpread({}, visState), {}, {
205
+ layers: visState.layers.map(function (layer) {
206
+ if (!layerId || layer.id === layerId) {
207
+ if (Object.prototype.hasOwnProperty.call(layer.visConfigSettings, 'darkBaseMapEnabled')) {
208
+ var visConfig = layer.config.visConfig;
209
+ return layer.updateLayerConfig({
210
+ visConfig: _objectSpread(_objectSpread({}, visConfig), {}, {
211
+ darkBaseMapEnabled: darkBaseMapEnabled
212
+ })
213
+ });
214
+ }
215
+ }
216
+ return layer;
217
+ })
218
+ });
219
+ };
220
+ };
221
+
222
+ /**
223
+ * Updater that changes the map style by calling mapStyleChangeUpdater on visState.
224
+ * In addition to that, it does the following:
225
+ *
226
+ * 1. Update map overlay blending mode in accordance with the colorMode of the
227
+ * base map, but only if it's not in the `normal` mode.
228
+ *
229
+ * 2. Update all the layers which have the `darkBaseMapEnabled` config setting
230
+ * adjusting it in accordance with the colorMode of the base map.
231
+ *
232
+ */
233
+ var combinedMapStyleChangeUpdater = exports.combinedMapStyleChangeUpdater = function combinedMapStyleChangeUpdater(state, action) {
234
+ var payload = action.payload;
235
+ var mapStyle = state.mapStyle;
236
+ var getColorMode = function getColorMode(key) {
237
+ var _mapStyle$mapStyles$k;
238
+ return (_mapStyle$mapStyles$k = mapStyle.mapStyles[key]) === null || _mapStyle$mapStyles$k === void 0 ? void 0 : _mapStyle$mapStyles$k.colorMode;
239
+ };
240
+ var prevColorMode = getColorMode(mapStyle.styleType);
241
+ var nextColorMode = getColorMode(payload.styleType);
242
+ var visState = state.visState;
243
+ if (nextColorMode !== prevColorMode) {
244
+ switch (nextColorMode) {
245
+ case _constants.BASE_MAP_COLOR_MODES.DARK:
246
+ visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.screen.value), updateDarkBaseMapLayers(true)])(visState);
247
+ break;
248
+ case _constants.BASE_MAP_COLOR_MODES.LIGHT:
249
+ visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.darken.value), updateDarkBaseMapLayers(false)])(visState);
250
+ break;
251
+ default:
252
+ // do nothing
253
+ }
254
+ }
255
+ return _objectSpread(_objectSpread({}, state), {}, {
256
+ visState: visState,
257
+ mapStyle: (0, _mapStyleUpdaters.mapStyleChangeUpdater)(mapStyle, {
258
+ payload: _objectSpread({}, payload)
259
+ })
260
+ });
261
+ };
262
+
263
+ /**
264
+ * Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
265
+ * In addition to that, if the new layer type has the `darkBaseMapEnabled` config
266
+ * setting, we adjust it in accordance with the colorMode of the base map.s
267
+ */
268
+ var combinedLayerTypeChangeUpdater = exports.combinedLayerTypeChangeUpdater = function combinedLayerTypeChangeUpdater(state, action) {
269
+ var visState = state.visState;
270
+ var oldLayerIndex = visState.layers.findIndex(function (layer) {
271
+ return layer === action.oldLayer;
272
+ });
273
+ visState = (0, _visStateUpdaters.layerTypeChangeUpdater)(visState, action);
274
+ var newLayer = visState.layers[oldLayerIndex];
275
+ if (Object.prototype.hasOwnProperty.call(newLayer === null || newLayer === void 0 ? void 0 : newLayer.visConfigSettings, 'darkBaseMapEnabled')) {
276
+ var mapStyle = state.mapStyle;
277
+ var colorMode = mapStyle.mapStyles[mapStyle.styleType].colorMode;
278
+ var darkBaseMapEnabled = newLayer.config.visConfig.darkBaseMapEnabled;
279
+ switch (colorMode) {
280
+ case _constants.BASE_MAP_COLOR_MODES.DARK:
281
+ if (!darkBaseMapEnabled) {
282
+ visState = updateDarkBaseMapLayers(true, newLayer.id)(visState);
283
+ }
284
+ break;
285
+ case _constants.BASE_MAP_COLOR_MODES.LIGHT:
286
+ if (darkBaseMapEnabled) {
287
+ visState = updateDarkBaseMapLayers(false, newLayer.id)(visState);
288
+ }
289
+ break;
290
+ default:
291
+ // do nothing
292
+ }
293
+ }
294
+ return _objectSpread(_objectSpread({}, state), {}, {
295
+ visState: visState
296
+ });
297
+ };
298
+
299
+ /**
300
+ * Make mapLegend active when toggleSplitMap action is called
301
+ */
302
+ var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
303
+ var _newState$uiState$map;
304
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
305
+ visState: (0, _visStateUpdaters.toggleSplitMapUpdater)(state.visState, action),
306
+ uiState: (0, _uiStateUpdaters.toggleSplitMapUpdater)(state.uiState),
307
+ mapState: (0, _mapStateUpdaters.toggleSplitMapUpdater)(state.mapState)
308
+ });
309
+ var isSplit = newState.visState.splitMaps.length !== 0;
310
+ var isLegendActive = (_newState$uiState$map = newState.uiState.mapControls) === null || _newState$uiState$map === void 0 || (_newState$uiState$map = _newState$uiState$map.mapLegend) === null || _newState$uiState$map === void 0 ? void 0 : _newState$uiState$map.active;
311
+ if (isSplit && !isLegendActive) {
312
+ newState.uiState = (0, _uiStateUpdaters.toggleMapControlUpdater)(newState.uiState, {
313
+ payload: {
314
+ panelId: 'mapLegend',
315
+ index: action.payload
316
+ }
317
+ });
318
+ }
319
+ return newState;
320
+ };
321
+ var defaultReplaceDataToMapOptions = {
322
+ keepExistingConfig: true,
323
+ centerMap: true,
324
+ autoCreateLayers: false
325
+ };
326
+
327
+ /**
328
+ * Updater replace a dataset in state
329
+ */
330
+ var replaceDataInMapUpdater = exports.replaceDataInMapUpdater = function replaceDataInMapUpdater(state, _ref3) {
331
+ var payload = _ref3.payload;
332
+ var datasetToReplaceId = payload.datasetToReplaceId,
333
+ datasetToUse = payload.datasetToUse,
334
+ _payload$options = payload.options,
335
+ options = _payload$options === void 0 ? {} : _payload$options;
336
+ var addDataToMapOptions = _objectSpread(_objectSpread({}, defaultReplaceDataToMapOptions), options);
337
+
338
+ // check if dataset is there
339
+ if (!state.visState.datasets[datasetToReplaceId]) {
340
+ return state;
341
+ }
342
+ // datasetToUse is ProtoDataset
343
+ var dataIdToUse = datasetToUse.info.id;
344
+ if (!dataIdToUse) {
345
+ return state;
346
+ }
347
+ // remove dataset and put dependencies in toBeMerged
348
+ var preparedState = _objectSpread(_objectSpread({}, state), {}, {
349
+ visState: (0, _visStateUpdaters.prepareStateForDatasetReplace)(state.visState, datasetToReplaceId, dataIdToUse)
350
+ });
351
+ var nextState = addDataToMapUpdater(preparedState, (0, _composerHelpers.payload_)({
352
+ datasets: datasetToUse,
353
+ // should zoom to new dataset
354
+ options: addDataToMapOptions
355
+ }));
356
+ return nextState;
357
+ };
358
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdWlTdGF0ZVVwZGF0ZXJzIiwicmVxdWlyZSIsIl92aXNTdGF0ZVVwZGF0ZXJzIiwiX21hcFN0YXRlVXBkYXRlcnMiLCJfbWFwU3R5bGVVcGRhdGVycyIsIl9wcm9jZXNzb3JzIiwiX2NvbXBvc2VySGVscGVycyIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfY29uc3RhbnRzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJjb21iaW5lZFVwZGF0ZXJzIiwiaXNWYWxpZENvbmZpZyIsImV4cG9ydHMiLCJjb25maWciLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsImRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zIiwiY2VudGVyTWFwIiwia2VlcEV4aXN0aW5nQ29uZmlnIiwiYXV0b0NyZWF0ZUxheWVycyIsImF1dG9DcmVhdGVUb29sdGlwcyIsImFkZERhdGFUb01hcFVwZGF0ZXIiLCJzdGF0ZSIsIl9yZWYiLCJfZGF0YXNldHMkIiwiX2RhdGFzZXRzJDIiLCJfZGF0YXNldHMkMyIsInBheWxvYWQiLCJkYXRhc2V0cyIsImluZm8iLCJvcHRpb25zIiwiaXNQcm9ncmVzc2l2ZUxvYWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmb3JtYXQiLCJpZCIsInZpc1N0YXRlIiwiY29tcG9zZV8iLCJwaWNrXyIsImFwcGx5XyIsInZpc1N0YXRlVXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJwYXJzZWRDb25maWciLCJzY2hlbWEiLCJwYXJzZVNhdmVkQ29uZmlnIiwib2xkTGF5ZXJzIiwibGF5ZXJzIiwiZmlsdGVyTmV3bHlBZGRlZExheWVycyIsIm5sIiwiZmluZCIsIm9sIiwiZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQiLCJib3VuZHMiLCJmaW5kTWFwQm91bmRzIiwidW5kZWZpbmVkIiwiaWZfIiwiQm9vbGVhbiIsInNldE1hcEluZm9VcGRhdGVyIiwid2l0aF8iLCJfcmVmMiIsInN0YXRlTWFwQ29uZmlnVXBkYXRlciIsInBheWxvYWRfIiwic3R5bGVNYXBDb25maWdVcGRhdGVyIiwidWlTdGF0ZUxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIiwidG9nZ2xlTW9kYWxVcGRhdGVyIiwibWVyZ2VfIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVhZE9ubHkiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsImFjdGlvbiIsInBheWxvYWRzIiwiZmlsZXNUb0RhdGFQYXlsb2FkIiwicmVzdWx0IiwibmV4dFN0YXRlIiwiZmlsZUxvYWRpbmciLCJmaWxlTG9hZGluZ1Byb2dyZXNzIiwic3RhdGVXaXRoRGF0YSIsIm1hcCIsInAiLCJhZGREYXRhVG9NYXBDb21wb3NlZCIsInVwZGF0ZU92ZXJsYXlCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwibm9ybWFsIiwidmFsdWUiLCJ1cGRhdGVEYXJrQmFzZU1hcExheWVycyIsImRhcmtCYXNlTWFwRW5hYmxlZCIsImxheWVySWQiLCJsYXllciIsInZpc0NvbmZpZ1NldHRpbmdzIiwidmlzQ29uZmlnIiwidXBkYXRlTGF5ZXJDb25maWciLCJjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsIm1hcFN0eWxlIiwiZ2V0Q29sb3JNb2RlIiwia2V5IiwiX21hcFN0eWxlJG1hcFN0eWxlcyRrIiwibWFwU3R5bGVzIiwiY29sb3JNb2RlIiwicHJldkNvbG9yTW9kZSIsInN0eWxlVHlwZSIsIm5leHRDb2xvck1vZGUiLCJCQVNFX01BUF9DT0xPUl9NT0RFUyIsIkRBUksiLCJzY3JlZW4iLCJMSUdIVCIsImRhcmtlbiIsIm1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsImNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJvbGRMYXllciIsImxheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJuZXdMYXllciIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsIl9uZXdTdGF0ZSR1aVN0YXRlJG1hcCIsIm5ld1N0YXRlIiwidmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJ1aVN0YXRlIiwidWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsIm1hcFN0YXRlIiwibWFwU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJpc1NwbGl0Iiwic3BsaXRNYXBzIiwiaXNMZWdlbmRBY3RpdmUiLCJtYXBDb250cm9scyIsIm1hcExlZ2VuZCIsImFjdGl2ZSIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwicGFuZWxJZCIsImluZGV4IiwiZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zIiwicmVwbGFjZURhdGFJbk1hcFVwZGF0ZXIiLCJfcmVmMyIsImRhdGFzZXRUb1JlcGxhY2VJZCIsImRhdGFzZXRUb1VzZSIsIl9wYXlsb2FkJG9wdGlvbnMiLCJhZGREYXRhVG9NYXBPcHRpb25zIiwiZGF0YUlkVG9Vc2UiLCJwcmVwYXJlZFN0YXRlIiwicHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2UiXSwic291cmNlcyI6WyIuLi9zcmMvY29tYmluZWQtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgdG9nZ2xlTW9kYWxVcGRhdGVyLFxuICBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciBhcyB1aVN0YXRlTG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIsXG4gIHRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyLFxuICB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgYXMgdWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlclxufSBmcm9tICcuL3VpLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIHVwZGF0ZVZpc0RhdGFVcGRhdGVyIGFzIHZpc1N0YXRlVXBkYXRlVmlzRGF0YVVwZGF0ZXIsXG4gIHNldE1hcEluZm9VcGRhdGVyLFxuICBsYXllclR5cGVDaGFuZ2VVcGRhdGVyLFxuICB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgYXMgdmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIsXG4gIHByZXBhcmVTdGF0ZUZvckRhdGFzZXRSZXBsYWNlXG59IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIHJlY2VpdmVNYXBDb25maWdVcGRhdGVyIGFzIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyIGFzIG1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyXG59IGZyb20gJy4vbWFwLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIG1hcFN0eWxlQ2hhbmdlVXBkYXRlcixcbiAgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgYXMgc3R5bGVNYXBDb25maWdVcGRhdGVyXG59IGZyb20gJy4vbWFwLXN0eWxlLXVwZGF0ZXJzJztcbmltcG9ydCB7ZmlsZXNUb0RhdGFQYXlsb2FkfSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHtwYXlsb2FkXywgYXBwbHlfLCB3aXRoXywgaWZfLCBjb21wb3NlXywgbWVyZ2VfLCBwaWNrX30gZnJvbSAnLi9jb21wb3Nlci1oZWxwZXJzJztcbmltcG9ydCB7TWFwU3RhdGUsIFVpU3RhdGUsIEFkZERhdGFUb01hcFBheWxvYWQsIFBhcnNlZENvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge01hcFN0eWxlfSBmcm9tICcuL21hcC1zdHlsZS11cGRhdGVycyc7XG5pbXBvcnQge1Byb3ZpZGVyU3RhdGV9IGZyb20gJy4vcHJvdmlkZXItc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtcbiAgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXJBY3Rpb24sXG4gIE1hcFN0eWxlQ2hhbmdlVXBkYXRlckFjdGlvbixcbiAgTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlckFjdGlvbixcbiAgVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uLFxuICBSZXBsYWNlRGF0YUluTWFwUGF5bG9hZFxufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2ZpbmRNYXBCb3VuZHN9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQge0JBU0VfTUFQX0NPTE9SX01PREVTLCBPVkVSTEFZX0JMRU5ESU5HU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5leHBvcnQgdHlwZSBLZXBsZXJHbFN0YXRlID0ge1xuICB2aXNTdGF0ZTogVmlzU3RhdGU7XG4gIG1hcFN0YXRlOiBNYXBTdGF0ZTtcbiAgbWFwU3R5bGU6IE1hcFN0eWxlO1xuICB1aVN0YXRlOiBVaVN0YXRlO1xuICBwcm92aWRlclN0YXRlOiBQcm92aWRlclN0YXRlO1xufTtcblxuLy8gY29tcG9zZSBhY3Rpb24gdG8gYXBwbHkgcmVzdWx0IG11bHRpcGxlIHJlZHVjZXJzLCB3aXRoIHRoZSBvdXRwdXQgb2Ygb25lXG5cbi8qKlxuICogU29tZSBhY3Rpb25zIHdpbGwgYWZmZWN0IHRoZSBlbnRpcmUga2VwbGVyLmxnIGluc3RhbmNlIHN0YXRlLlxuICogVGhlIHVwZGF0ZXJzIGZvciB0aGVzZSBhY3Rpb25zIGlzIGV4cG9ydGVkIGFzIGBjb21iaW5lZFVwZGF0ZXJzYC4gVGhlc2UgdXBkYXRlciB0YWtlIHRoZSBlbnRpcmUgaW5zdGFuY2Ugc3RhdGVcbiAqIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHtjb21iaW5lZFVwZGF0ZXJzfSBmcm9tICdrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gYWRkIGRhdGEgdG8gbWFwIGFmdGVyIHJlY2VpdmluZyBkYXRhIGZyb20gcmVtb3RlIHNvdXJjZXNcbiAqICAgIGNhc2UgJ0xPQURfUkVNT1RFX1JFU09VUkNFX1NVQ0NFU1MnOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIC8vIHBhc3MgaW4ga2VwbGVyLmdsIGluc3RhbmNlIHN0YXRlIHRvIGNvbWJpbmVkVXBkYXRlcnNcbiAqICAgICAgICAgIG1hcDogIGNvbWJpbmVkVXBkYXRlcnMuYWRkRGF0YVRvTWFwVXBkYXRlcihcbiAqICAgICAgICAgICBzdGF0ZS5rZXBsZXJHbC5tYXAsXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgcGF5bG9hZDoge1xuICogICAgICAgICAgICAgICBkYXRhc2V0czogYWN0aW9uLmRhdGFzZXRzLFxuICogICAgICAgICAgICAgICBvcHRpb25zOiB7cmVhZE9ubHk6IHRydWV9LFxuICogICAgICAgICAgICAgICBjb25maWc6IGFjdGlvbi5jb25maWdcbiAqICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICAgIClcbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgY29tYmluZWRVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZENvbmZpZyA9IGNvbmZpZyA9PlxuICBpc1BsYWluT2JqZWN0KGNvbmZpZykgJiYgaXNQbGFpbk9iamVjdChjb25maWcuY29uZmlnKSAmJiBjb25maWcudmVyc2lvbjtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zID0ge1xuICBjZW50ZXJNYXA6IHRydWUsXG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogZmFsc2UsXG4gIGF1dG9DcmVhdGVMYXllcnM6IHRydWUsXG4gIGF1dG9DcmVhdGVUb29sdGlwczogdHJ1ZVxufTtcblxuLyoqXG4gKiBDb21iaW5lIGRhdGEgYW5kIGZ1bGwgY29uZmlndXJhdGlvbiB1cGRhdGUgaW4gYSBzaW5nbGUgYWN0aW9uXG4gKlxuICogQG1lbWJlcm9mIGNvbWJpbmVkVXBkYXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBrZXBsZXIuZ2wgaW5zdGFuY2Ugc3RhdGUsIGNvbnRhaW5pbmcgYWxsIHN1YnJlZHVjZXIgc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24ucGF5bG9hZCBge2RhdGFzZXRzLCBvcHRpb25zLCBjb25maWd9YFxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkLmRhdGFzZXRzIC0gKioqcmVxdWlyZWQqKiBkYXRhc2V0cyBjYW4gYmUgYSBkYXRhc2V0IG9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKiBFYWNoIGRhdGFzZXQgb2JqZWN0IG5lZWRzIHRvIGhhdmUgYGluZm9gIGFuZCBgZGF0YWAgcHJvcGVydHkuXG4gKiBAcGFyYW0gW2FjdGlvbi5wYXlsb2FkLm9wdGlvbnNdIG9wdGlvbiBvYmplY3QgYHtjZW50ZXJNYXA6IHRydWV9YFxuICogQHBhcmFtIFthY3Rpb24ucGF5bG9hZC5jb25maWddIG1hcCBjb25maWdcbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQuaW5mb10gbWFwIGluZm8gY29udGFpbnMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhc2V0XG4gKiBAcHJvcGVydHkgaW5mbyAtaW5mbyBvZiBhIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBpbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuICogQHByb3BlcnR5IGluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBkYXRhIC0gKioqcmVxdWlyZWQqKiBUaGUgZGF0YSBvYmplY3QsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCAyIHByb3BlcnRpZXMgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHByb3BlcnR5IGRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4gKiBAcHJvcGVydHkgZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4gKiBAcHJvcGVydHkgZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBBZGREYXRhVG9NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0cywgY29uZmlnLCBpbmZvfSA9IHBheWxvYWQ7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyxcbiAgICAuLi5wYXlsb2FkLm9wdGlvbnNcbiAgfTtcblxuICAvLyBjaGVjayBpZiBwcm9ncmVzc2l2ZSBsb2FkaW5nIGRhdGFzZXQgYnkgYmF0Y2hlcywgYW5kIHVwZGF0ZSB2aXNTdGF0ZSBkaXJlY3RseVxuICBjb25zdCBpc1Byb2dyZXNzaXZlTG9hZGluZyA9XG4gICAgQXJyYXkuaXNBcnJheShkYXRhc2V0cykgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5mb3JtYXQgPT09ICdhcnJvdycgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5pZCAmJlxuICAgIGRhdGFzZXRzWzBdPy5pbmZvLmlkIGluIHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICBpZiAoaXNQcm9ncmVzc2l2ZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gY29tcG9zZV88S2VwbGVyR2xTdGF0ZT4oW1xuICAgICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKShzdGF0ZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGxldCBwYXJzZWRDb25maWc6IFBhcnNlZENvbmZpZyA9IGNvbmZpZztcblxuICBpZiAoaXNWYWxpZENvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIHNhdmVkIGNvbmZpZ1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwYXJzZWRDb25maWcgPSBzdGF0ZS52aXNTdGF0ZS5zY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICB9XG4gIGNvbnN0IG9sZExheWVycyA9IHN0YXRlLnZpc1N0YXRlLmxheWVycztcbiAgY29uc3QgZmlsdGVyTmV3bHlBZGRlZExheWVycyA9IChsYXllcnM6IExheWVyW10pID0+XG4gICAgbGF5ZXJzLmZpbHRlcihubCA9PiAhb2xkTGF5ZXJzLmZpbmQob2wgPT4gb2wgPT09IG5sKSk7XG5cbiAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLCB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHlcbiAgY29uc3QgZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQgPSAobGF5ZXJzOiBMYXllcltdKSA9PiB7XG4gICAgY29uc3QgYm91bmRzID0gb3B0aW9ucy5jZW50ZXJNYXAgJiYgZmluZE1hcEJvdW5kcyhsYXllcnMpO1xuICAgIHJldHVybiBib3VuZHMgPyBib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfPEtlcGxlckdsU3RhdGU+KFtcbiAgICBwaWNrXygndmlzU3RhdGUnKShcbiAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZ1xuICAgICAgfSlcbiAgICApLFxuXG4gICAgaWZfKEJvb2xlYW4oaW5mbyksIHBpY2tfKCd2aXNTdGF0ZScpKGFwcGx5XzxWaXNTdGF0ZSwgYW55PihzZXRNYXBJbmZvVXBkYXRlciwge2luZm99KSkpLFxuICAgIC8vIE5vdGUgdGhhdCBmaXQgYm91bmRzIGhlcmUgd29uJ3QgYmUgY2FsbGVkIGluIGNhc2UgZGF0YXNldHMgYXJlIGNyZWF0ZWQgaW4gVGFza3MuXG4gICAgLy8gQSBzZXBhcmF0ZSBUYXNrIHRvIHVwZGF0ZSBib3VuZHMgaXMgY3JlYXRlZCBvbmNlIHRoZSBkYXRhc2V0cyBhcmUgcmVhZHkuXG4gICAgd2l0aF8oKHt2aXNTdGF0ZX0pID0+XG4gICAgICBwaWNrXygnbWFwU3RhdGUnKShcbiAgICAgICAgYXBwbHlfKFxuICAgICAgICAgIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgICAgICAgICBwYXlsb2FkXyh7XG4gICAgICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBib3VuZHM6IGZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkKGZpbHRlck5ld2x5QWRkZWRMYXllcnModmlzU3RhdGUubGF5ZXJzKSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBwaWNrXygnbWFwU3R5bGUnKShhcHBseV8oc3R5bGVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSkpLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcbiAgICBwaWNrXygndWlTdGF0ZScpKGFwcGx5Xyh0b2dnbGVNb2RhbFVwZGF0ZXIsIHBheWxvYWRfKG51bGwpKSksXG4gICAgcGlja18oJ3VpU3RhdGUnKShcbiAgICAgIG1lcmdlXyhcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdyZWFkT25seScpXG4gICAgICAgICAgPyB7cmVhZE9ubHk6IG9wdGlvbnMucmVhZE9ubHl9XG4gICAgICAgICAgOiB7fVxuICAgICAgKVxuICAgIClcbiAgXSkoc3RhdGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIC8vIHN0aWxsIG1vcmUgdG8gbG9hZFxuICBjb25zdCBwYXlsb2FkcyA9IGZpbGVzVG9EYXRhUGF5bG9hZChhY3Rpb24ucmVzdWx0KTtcbiAgY29uc3QgbmV4dFN0YXRlID0gY29tcG9zZV8oW1xuICAgIHBpY2tfKCd2aXNTdGF0ZScpKFxuICAgICAgbWVyZ2VfKHtcbiAgICAgICAgZmlsZUxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBmaWxlTG9hZGluZ1Byb2dyZXNzOiB7fVxuICAgICAgfSlcbiAgICApXG4gIF0pKHN0YXRlKTtcbiAgLy8gbWFrZSBtdWx0aXBsZSBhZGQgZGF0YSB0byBtYXAgY2FsbHNcbiAgY29uc3Qgc3RhdGVXaXRoRGF0YSA9IGNvbXBvc2VfKHBheWxvYWRzLm1hcChwID0+IGFwcGx5XyhhZGREYXRhVG9NYXBVcGRhdGVyLCBwYXlsb2FkXyhwKSkpKShcbiAgICBuZXh0U3RhdGVcbiAgKTtcbiAgcmV0dXJuIHN0YXRlV2l0aERhdGEgYXMgS2VwbGVyR2xTdGF0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGREYXRhVG9NYXBDb21wb3NlZCA9IGFkZERhdGFUb01hcFVwZGF0ZXI7XG5cbi8qKlxuICogSGVscGVyIHdoaWNoIHVwZGF0ZXMgbWFwIG92ZXJsYXkgYmxlbmRpbmcgbW9kZSBpbiB2aXNTdGF0ZSxcbiAqIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IGN1cnJlbnRseSBpbiB0aGUgYG5vcm1hbGAgbW9kZS5cbiAqL1xuY29uc3QgdXBkYXRlT3ZlcmxheUJsZW5kaW5nID0gb3ZlcmxheUJsZW5kaW5nID0+IHZpc1N0YXRlID0+IHtcbiAgaWYgKHZpc1N0YXRlLm92ZXJsYXlCbGVuZGluZyAhPT0gT1ZFUkxBWV9CTEVORElOR1Mubm9ybWFsLnZhbHVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZpc1N0YXRlLFxuICAgICAgb3ZlcmxheUJsZW5kaW5nXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmlzU3RhdGU7XG59O1xuXG4vKipcbiAqIEhlbHBlciB3aGljaCB1cGRhdGVzIGBkYXJrQmFzZU1hcEVuYWJsZWRgIGluIGFsbCB0aGUgbGF5ZXJzIGluIHZpc1N0YXRlIHdoaWNoXG4gKiBoYXZlIHRoaXMgY29uZmlnIHNldHRpbmcgKG9yIGluIG9uZSBzcGVjaWZpYyBsYXllciBpZiB0aGUgYGxheWVySWRgIHBhcmFtIGlzIHByb3ZpZGVkKS5cbiAqL1xuY29uc3QgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnMgPVxuICAoZGFya0Jhc2VNYXBFbmFibGVkOiBib29sZWFuLCBsYXllcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbCkgPT5cbiAgdmlzU3RhdGUgPT4gKHtcbiAgICAuLi52aXNTdGF0ZSxcbiAgICBsYXllcnM6IHZpc1N0YXRlLmxheWVycy5tYXAobGF5ZXIgPT4ge1xuICAgICAgaWYgKCFsYXllcklkIHx8IGxheWVyLmlkID09PSBsYXllcklkKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MsICdkYXJrQmFzZU1hcEVuYWJsZWQnKSkge1xuICAgICAgICAgIGNvbnN0IHt2aXNDb25maWd9ID0gbGF5ZXIuY29uZmlnO1xuICAgICAgICAgIHJldHVybiBsYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgICAgICB2aXNDb25maWc6IHsuLi52aXNDb25maWcsIGRhcmtCYXNlTWFwRW5hYmxlZH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxheWVyO1xuICAgIH0pXG4gIH0pO1xuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBjaGFuZ2VzIHRoZSBtYXAgc3R5bGUgYnkgY2FsbGluZyBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIgb24gdmlzU3RhdGUuXG4gKiBJbiBhZGRpdGlvbiB0byB0aGF0LCBpdCBkb2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAxLiBVcGRhdGUgbWFwIG92ZXJsYXkgYmxlbmRpbmcgbW9kZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGNvbG9yTW9kZSBvZiB0aGVcbiAqICAgICAgYmFzZSBtYXAsIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IGluIHRoZSBgbm9ybWFsYCBtb2RlLlxuICpcbiAqICAgMi4gVXBkYXRlIGFsbCB0aGUgbGF5ZXJzIHdoaWNoIGhhdmUgdGhlIGBkYXJrQmFzZU1hcEVuYWJsZWRgIGNvbmZpZyBzZXR0aW5nXG4gKiAgICAgIGFkanVzdGluZyBpdCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGNvbG9yTW9kZSBvZiB0aGUgYmFzZSBtYXAuXG4gKlxuICovXG5leHBvcnQgY29uc3QgY29tYmluZWRNYXBTdHlsZUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IE1hcFN0eWxlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtwYXlsb2FkfSA9IGFjdGlvbjtcbiAgY29uc3Qge21hcFN0eWxlfSA9IHN0YXRlO1xuICBjb25zdCBnZXRDb2xvck1vZGUgPSBrZXkgPT4gbWFwU3R5bGUubWFwU3R5bGVzW2tleV0/LmNvbG9yTW9kZTtcbiAgY29uc3QgcHJldkNvbG9yTW9kZSA9IGdldENvbG9yTW9kZShtYXBTdHlsZS5zdHlsZVR5cGUpO1xuICBjb25zdCBuZXh0Q29sb3JNb2RlID0gZ2V0Q29sb3JNb2RlKHBheWxvYWQuc3R5bGVUeXBlKTtcbiAgbGV0IHt2aXNTdGF0ZX0gPSBzdGF0ZTtcbiAgaWYgKG5leHRDb2xvck1vZGUgIT09IHByZXZDb2xvck1vZGUpIHtcbiAgICBzd2l0Y2ggKG5leHRDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuREFSSzpcbiAgICAgICAgdmlzU3RhdGUgPSBjb21wb3NlXyhbXG4gICAgICAgICAgdXBkYXRlT3ZlcmxheUJsZW5kaW5nKE9WRVJMQVlfQkxFTkRJTkdTLnNjcmVlbi52YWx1ZSksXG4gICAgICAgICAgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnModHJ1ZSlcbiAgICAgICAgXSkodmlzU3RhdGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuTElHSFQ6XG4gICAgICAgIHZpc1N0YXRlID0gY29tcG9zZV8oW1xuICAgICAgICAgIHVwZGF0ZU92ZXJsYXlCbGVuZGluZyhPVkVSTEFZX0JMRU5ESU5HUy5kYXJrZW4udmFsdWUpLFxuICAgICAgICAgIHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKGZhbHNlKVxuICAgICAgICBdKSh2aXNTdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICB2aXNTdGF0ZSxcbiAgICBtYXBTdHlsZTogbWFwU3R5bGVDaGFuZ2VVcGRhdGVyKG1hcFN0eWxlLCB7cGF5bG9hZDogey4uLnBheWxvYWR9fSlcbiAgfTtcbn07XG5cbi8qKlxuICogVXBkYXRlciB0aGF0IGNoYW5nZXMgdGhlIGxheWVyIHR5cGUgYnkgY2FsbGluZyBgbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcmAgb24gdmlzU3RhdGUuXG4gKiBJbiBhZGRpdGlvbiB0byB0aGF0LCBpZiB0aGUgbmV3IGxheWVyIHR5cGUgaGFzIHRoZSBgZGFya0Jhc2VNYXBFbmFibGVkYCBjb25maWdcbiAqIHNldHRpbmcsIHdlIGFkanVzdCBpdCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGNvbG9yTW9kZSBvZiB0aGUgYmFzZSBtYXAuc1xuICovXG5leHBvcnQgY29uc3QgY29tYmluZWRMYXllclR5cGVDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBMYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgbGV0IHt2aXNTdGF0ZX0gPSBzdGF0ZTtcbiAgY29uc3Qgb2xkTGF5ZXJJbmRleCA9IHZpc1N0YXRlLmxheWVycy5maW5kSW5kZXgobGF5ZXIgPT4gbGF5ZXIgPT09IGFjdGlvbi5vbGRMYXllcik7XG4gIHZpc1N0YXRlID0gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcih2aXNTdGF0ZSwgYWN0aW9uKTtcbiAgY29uc3QgbmV3TGF5ZXIgPSB2aXNTdGF0ZS5sYXllcnNbb2xkTGF5ZXJJbmRleF07XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3TGF5ZXI/LnZpc0NvbmZpZ1NldHRpbmdzLCAnZGFya0Jhc2VNYXBFbmFibGVkJykpIHtcbiAgICBjb25zdCB7bWFwU3R5bGV9ID0gc3RhdGU7XG4gICAgY29uc3Qge2NvbG9yTW9kZX0gPSBtYXBTdHlsZS5tYXBTdHlsZXNbbWFwU3R5bGUuc3R5bGVUeXBlXTtcbiAgICBjb25zdCB7ZGFya0Jhc2VNYXBFbmFibGVkfSA9IG5ld0xheWVyLmNvbmZpZy52aXNDb25maWc7XG4gICAgc3dpdGNoIChjb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuREFSSzpcbiAgICAgICAgaWYgKCFkYXJrQmFzZU1hcEVuYWJsZWQpIHtcbiAgICAgICAgICB2aXNTdGF0ZSA9IHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKHRydWUsIG5ld0xheWVyLmlkKSh2aXNTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEJBU0VfTUFQX0NPTE9SX01PREVTLkxJR0hUOlxuICAgICAgICBpZiAoZGFya0Jhc2VNYXBFbmFibGVkKSB7XG4gICAgICAgICAgdmlzU3RhdGUgPSB1cGRhdGVEYXJrQmFzZU1hcExheWVycyhmYWxzZSwgbmV3TGF5ZXIuaWQpKHZpc1N0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGVcbiAgfTtcbn07XG5cbi8qKlxuICogTWFrZSBtYXBMZWdlbmQgYWN0aXZlIHdoZW4gdG9nZ2xlU3BsaXRNYXAgYWN0aW9uIGlzIGNhbGxlZFxuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBUb2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICB2aXNTdGF0ZTogdmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIoc3RhdGUudmlzU3RhdGUsIGFjdGlvbiksXG4gICAgdWlTdGF0ZTogdWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcihzdGF0ZS51aVN0YXRlKSxcbiAgICBtYXBTdGF0ZTogbWFwU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIoc3RhdGUubWFwU3RhdGUpXG4gIH07XG5cbiAgY29uc3QgaXNTcGxpdCA9IG5ld1N0YXRlLnZpc1N0YXRlLnNwbGl0TWFwcy5sZW5ndGggIT09IDA7XG4gIGNvbnN0IGlzTGVnZW5kQWN0aXZlID0gbmV3U3RhdGUudWlTdGF0ZS5tYXBDb250cm9scz8ubWFwTGVnZW5kPy5hY3RpdmU7XG4gIGlmIChpc1NwbGl0ICYmICFpc0xlZ2VuZEFjdGl2ZSkge1xuICAgIG5ld1N0YXRlLnVpU3RhdGUgPSB0b2dnbGVNYXBDb250cm9sVXBkYXRlcihuZXdTdGF0ZS51aVN0YXRlLCB7XG4gICAgICBwYXlsb2FkOiB7cGFuZWxJZDogJ21hcExlZ2VuZCcsIGluZGV4OiBhY3Rpb24ucGF5bG9hZH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbmNvbnN0IGRlZmF1bHRSZXBsYWNlRGF0YVRvTWFwT3B0aW9ucyA9IHtcbiAga2VlcEV4aXN0aW5nQ29uZmlnOiB0cnVlLFxuICBjZW50ZXJNYXA6IHRydWUsXG4gIGF1dG9DcmVhdGVMYXllcnM6IGZhbHNlXG59O1xuXG4vKipcbiAqIFVwZGF0ZXIgcmVwbGFjZSBhIGRhdGFzZXQgaW4gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VEYXRhSW5NYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAge3BheWxvYWR9OiB7cGF5bG9hZDogUmVwbGFjZURhdGFJbk1hcFBheWxvYWR9XG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3Qge2RhdGFzZXRUb1JlcGxhY2VJZCwgZGF0YXNldFRvVXNlLCBvcHRpb25zID0ge319ID0gcGF5bG9hZDtcbiAgY29uc3QgYWRkRGF0YVRvTWFwT3B0aW9ucyA9IHsuLi5kZWZhdWx0UmVwbGFjZURhdGFUb01hcE9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXG4gIC8vIGNoZWNrIGlmIGRhdGFzZXQgaXMgdGhlcmVcbiAgaWYgKCFzdGF0ZS52aXNTdGF0ZS5kYXRhc2V0c1tkYXRhc2V0VG9SZXBsYWNlSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIGRhdGFzZXRUb1VzZSBpcyBQcm90b0RhdGFzZXRcbiAgY29uc3QgZGF0YUlkVG9Vc2UgPSBkYXRhc2V0VG9Vc2UuaW5mby5pZDtcbiAgaWYgKCFkYXRhSWRUb1VzZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyByZW1vdmUgZGF0YXNldCBhbmQgcHV0IGRlcGVuZGVuY2llcyBpbiB0b0JlTWVyZ2VkXG4gIGNvbnN0IHByZXBhcmVkU3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGU6IHByZXBhcmVTdGF0ZUZvckRhdGFzZXRSZXBsYWNlKHN0YXRlLnZpc1N0YXRlLCBkYXRhc2V0VG9SZXBsYWNlSWQsIGRhdGFJZFRvVXNlKVxuICB9O1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IGFkZERhdGFUb01hcFVwZGF0ZXIoXG4gICAgcHJlcGFyZWRTdGF0ZSxcbiAgICBwYXlsb2FkXyh7XG4gICAgICBkYXRhc2V0czogZGF0YXNldFRvVXNlLFxuICAgICAgLy8gc2hvdWxkIHpvb20gdG8gbmV3IGRhdGFzZXRcbiAgICAgIG9wdGlvbnM6IGFkZERhdGFUb01hcE9wdGlvbnNcbiAgICB9KVxuICApO1xuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUdBLElBQUFBLGdCQUFBLEdBQUFDLE9BQUE7QUFNQSxJQUFBQyxpQkFBQSxHQUFBRCxPQUFBO0FBT0EsSUFBQUUsaUJBQUEsR0FBQUYsT0FBQTtBQUlBLElBQUFHLGlCQUFBLEdBQUFILE9BQUE7QUFJQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBTCxPQUFBO0FBYUEsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsVUFBQSxHQUFBUixPQUFBO0FBQTZFLFNBQUFTLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAs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
@@ -0,0 +1,24 @@
1
+ /** Returns a function that logs a value with a given message */
2
+ export declare function log(text: string): (value: any) => void;
3
+ /** Wraps a value in an object and stores it the `payload` field */
4
+ export declare function payload_<P>(payload: P): {
5
+ payload: P;
6
+ };
7
+ /** Wraps a value in an object and stores it the `payload` field */
8
+ export declare function apply_<State, P>(updater: (state: State, nextPayload: P) => State, payload: P): (state: State) => State;
9
+ declare type Arg<State> = (state: State) => (nextState: State) => State;
10
+ export declare function with_<State>(fn: Arg<State>): (state: State) => State;
11
+ export declare function if_<State>(pred: boolean, fn: (state: State) => State): (state: State) => State;
12
+ export declare function compose_<State>(fns: Array<(s: State) => State>): (s: State) => State;
13
+ /** Returns a reducer function that merges props with state */
14
+ export declare function merge_<Props>(obj: Props): <State>(state: State) => State;
15
+ export declare function pick_<Prop extends string>(prop: Prop): <Value>(fn: (p: Value) => Value) => <State extends Record<Prop, Value>>(state: State) => State;
16
+ export declare function swap_<X extends {
17
+ id: string;
18
+ }>(item: X): (arr: X[]) => X[];
19
+ export declare function map_<X, T>(fn: (state: X) => T): (arr: X[]) => T[];
20
+ export declare function filterOutById<X extends {
21
+ id: string;
22
+ }>(id: string): (arr: X[]) => X[];
23
+ export declare function removeElementAtIndex<X>(index: number): (arr: X[]) => X[];
24
+ export {};
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.apply_ = apply_;
8
+ exports.compose_ = compose_;
9
+ exports.filterOutById = filterOutById;
10
+ exports.if_ = if_;
11
+ exports.log = log;
12
+ exports.map_ = map_;
13
+ exports.merge_ = merge_;
14
+ exports.payload_ = payload_;
15
+ exports.pick_ = pick_;
16
+ exports.removeElementAtIndex = removeElementAtIndex;
17
+ exports.swap_ = swap_;
18
+ exports.with_ = with_;
19
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
20
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
21
+ var _console = _interopRequireDefault(require("global/console"));
22
+ 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; }
23
+ 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
24
+ // Copyright contributors to the kepler.gl project
25
+ var identity = function identity(state) {
26
+ return state;
27
+ };
28
+
29
+ /** Returns a function that logs a value with a given message */
30
+ function log(text) {
31
+ return function (value) {
32
+ return _console["default"].log(text, value);
33
+ };
34
+ }
35
+ /** Wraps a value in an object and stores it the `payload` field */
36
+ function payload_(payload) {
37
+ return {
38
+ payload: payload
39
+ };
40
+ }
41
+ /** Wraps a value in an object and stores it the `payload` field */
42
+ function apply_(updater, payload) {
43
+ return function (state) {
44
+ return updater(state, payload);
45
+ };
46
+ }
47
+ function with_(fn) {
48
+ return function (state) {
49
+ return fn(state)(state);
50
+ };
51
+ }
52
+ function if_(pred, fn) {
53
+ return pred ? fn : identity;
54
+ }
55
+ function compose_(fns) {
56
+ return function (state) {
57
+ return fns.reduce(function (state2, fn) {
58
+ return fn(state2);
59
+ }, state);
60
+ };
61
+ }
62
+ /** Returns a reducer function that merges props with state */
63
+ function merge_(obj) {
64
+ return function (state) {
65
+ return _objectSpread(_objectSpread({}, state), obj);
66
+ };
67
+ }
68
+ function pick_(prop) {
69
+ return function (fn) {
70
+ return function (state) {
71
+ return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, fn(state[prop])));
72
+ };
73
+ };
74
+ }
75
+ function swap_(item) {
76
+ return function (arr) {
77
+ return arr.map(function (a) {
78
+ return a.id === item.id ? item : a;
79
+ });
80
+ };
81
+ }
82
+ function map_(fn) {
83
+ return function (arr) {
84
+ return arr.map(function (e) {
85
+ return fn(e);
86
+ });
87
+ };
88
+ }
89
+ function filterOutById(id) {
90
+ return function (arr) {
91
+ return arr.filter(function (e) {
92
+ return e.id !== id;
93
+ });
94
+ };
95
+ }
96
+ function removeElementAtIndex(index) {
97
+ return function (arr) {
98
+ return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), (0, _toConsumableArray2["default"])(arr.slice(index + 1, arr.length)));
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJpZGVudGl0eSIsInN0YXRlIiwibG9nIiwidGV4dCIsInZhbHVlIiwiQ29uc29sZSIsInBheWxvYWRfIiwicGF5bG9hZCIsImFwcGx5XyIsInVwZGF0ZXIiLCJ3aXRoXyIsImZuIiwiaWZfIiwicHJlZCIsImNvbXBvc2VfIiwiZm5zIiwicmVkdWNlIiwic3RhdGUyIiwibWVyZ2VfIiwib2JqIiwicGlja18iLCJwcm9wIiwic3dhcF8iLCJpdGVtIiwiYXJyIiwibWFwIiwiYSIsImlkIiwibWFwXyIsImZpbHRlck91dEJ5SWQiLCJyZW1vdmVFbGVtZW50QXRJbmRleCIsImluZGV4IiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNsaWNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL2NvbXBvc2VyLWhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IENvbnNvbGUgZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuXG5jb25zdCBpZGVudGl0eSA9IHN0YXRlID0+IHN0YXRlO1xuXG4vKiogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgbG9ncyBhIHZhbHVlIHdpdGggYSBnaXZlbiBtZXNzYWdlICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKHRleHQ6IHN0cmluZyk6ICh2YWx1ZTogYW55KSA9PiB2b2lkIHtcbiAgcmV0dXJuIHZhbHVlID0+IENvbnNvbGUubG9nKHRleHQsIHZhbHVlKTtcbn1cbi8qKiBXcmFwcyBhIHZhbHVlIGluIGFuIG9iamVjdCBhbmQgc3RvcmVzIGl0IHRoZSBgcGF5bG9hZGAgZmllbGQgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXlsb2FkXzxQPihwYXlsb2FkOiBQKSB7XG4gIHJldHVybiB7cGF5bG9hZH07XG59XG4vKiogV3JhcHMgYSB2YWx1ZSBpbiBhbiBvYmplY3QgYW5kIHN0b3JlcyBpdCB0aGUgYHBheWxvYWRgIGZpZWxkICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlfPFN0YXRlLCBQPihcbiAgdXBkYXRlcjogKHN0YXRlOiBTdGF0ZSwgbmV4dFBheWxvYWQ6IFApID0+IFN0YXRlLFxuICBwYXlsb2FkOiBQXG4pOiAoc3RhdGU6IFN0YXRlKSA9PiBTdGF0ZSB7XG4gIHJldHVybiBzdGF0ZSA9PiB1cGRhdGVyKHN0YXRlLCBwYXlsb2FkKTtcbn1cblxudHlwZSBBcmc8U3RhdGU+ID0gKHN0YXRlOiBTdGF0ZSkgPT4gKG5leHRTdGF0ZTogU3RhdGUpID0+IFN0YXRlO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhfPFN0YXRlPihmbjogQXJnPFN0YXRlPik6IChzdGF0ZTogU3RhdGUpID0+IFN0YXRlIHtcbiAgcmV0dXJuIHN0YXRlID0+IGZuKHN0YXRlKShzdGF0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZl88U3RhdGU+KHByZWQ6IGJvb2xlYW4sIGZuOiAoc3RhdGU6IFN0YXRlKSA9PiBTdGF0ZSk6IChzdGF0ZTogU3RhdGUpID0+IFN0YXRlIHtcbiAgcmV0dXJuIHByZWQgPyBmbiA6IGlkZW50aXR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZV88U3RhdGU+KGZuczogQXJyYXk8KHM6IFN0YXRlKSA9PiBTdGF0ZT4pOiAoczogU3RhdGUpID0+IFN0YXRlIHtcbiAgcmV0dXJuIHN0YXRlID0+IGZucy5yZWR1Y2UoKHN0YXRlMiwgZm4pID0+IGZuKHN0YXRlMiksIHN0YXRlKTtcbn1cbi8qKiBSZXR1cm5zIGEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IG1lcmdlcyBwcm9wcyB3aXRoIHN0YXRlICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VfPFByb3BzPihvYmo6IFByb3BzKTogPFN0YXRlPihzdGF0ZTogU3RhdGUpID0+IFN0YXRlIHtcbiAgcmV0dXJuIHN0YXRlID0+ICh7Li4uc3RhdGUsIC4uLm9ian0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGlja188UHJvcCBleHRlbmRzIHN0cmluZz4oXG4gIHByb3A6IFByb3Bcbik6IDxWYWx1ZT4oZm46IChwOiBWYWx1ZSkgPT4gVmFsdWUpID0+IDxTdGF0ZSBleHRlbmRzIFJlY29yZDxQcm9wLCBWYWx1ZT4+KHN0YXRlOiBTdGF0ZSkgPT4gU3RhdGUge1xuICByZXR1cm4gZm4gPT4gc3RhdGUgPT4gKHsuLi5zdGF0ZSwgW3Byb3BdOiBmbihzdGF0ZVtwcm9wXSl9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN3YXBfPFggZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KGl0ZW06IFgpOiAoYXJyOiBYW10pID0+IFhbXSB7XG4gIHJldHVybiBhcnIgPT4gYXJyLm1hcChhID0+IChhLmlkID09PSBpdGVtLmlkID8gaXRlbSA6IGEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcF88WCwgVD4oZm46IChzdGF0ZTogWCkgPT4gVCk6IChhcnI6IFhbXSkgPT4gVFtdIHtcbiAgcmV0dXJuIGFyciA9PiBhcnIubWFwKGUgPT4gZm4oZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT3V0QnlJZDxYIGV4dGVuZHMge2lkOiBzdHJpbmd9PihpZDogc3RyaW5nKTogKGFycjogWFtdKSA9PiBYW10ge1xuICByZXR1cm4gYXJyID0+IGFyci5maWx0ZXIoZSA9PiBlLmlkICE9PSBpZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbGVtZW50QXRJbmRleDxYPihpbmRleDogbnVtYmVyKTogKGFycjogWFtdKSA9PiBYW10ge1xuICByZXR1cm4gYXJyID0+IFsuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLCAuLi5hcnIuc2xpY2UoaW5kZXggKyAxLCBhcnIubGVuZ3RoKV07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsUUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQXFDLFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FBQWMseUJB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