@kepler.gl/reducers 3.3.0-alpha.14 → 3.3.0-alpha.16
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.
- package/dist/cjs/combined-updaters.js +166 -8
- package/dist/cjs/composers.js +4 -5
- package/dist/cjs/dataset-ops-updaters.js +289 -0
- package/dist/cjs/dataset-ops-updaters.spec.js +257 -0
- package/dist/cjs/interaction-utils.js +156 -4
- package/dist/cjs/layer-utils.js +133 -8
- package/dist/cjs/ui-state-updaters.js +115 -48
- package/dist/cjs/ui-state.js +2 -2
- package/dist/cjs/vis-state-merger.js +35 -4
- package/dist/cjs/vis-state-selectors.js +5 -4
- package/dist/cjs/vis-state-updaters.js +731 -232
- package/dist/cjs/vis-state.js +2 -2
- package/dist/combined-updaters.d.ts +21 -1
- package/dist/composers.d.ts +3 -0
- package/dist/dataset-ops-updaters.d.ts +18 -0
- package/dist/dataset-ops-updaters.spec.d.ts +1 -0
- package/dist/esm/combined-updaters.js +166 -8
- package/dist/esm/composers.js +3 -2
- package/dist/esm/dataset-ops-updaters.js +274 -0
- package/dist/esm/dataset-ops-updaters.spec.js +256 -0
- package/dist/esm/interaction-utils.js +150 -1
- package/dist/esm/layer-utils.js +131 -8
- package/dist/esm/ui-state-updaters.js +115 -48
- package/dist/esm/ui-state.js +2 -2
- package/dist/esm/vis-state-merger.js +35 -4
- package/dist/esm/vis-state-selectors.js +5 -4
- package/dist/esm/vis-state-updaters.js +687 -237
- package/dist/esm/vis-state.js +2 -2
- package/dist/interaction-utils.d.ts +21 -1
- package/dist/layer-utils.d.ts +16 -0
- package/dist/ui-state-updaters.d.ts +32 -0
- package/dist/vis-state-updaters.d.ts +38 -12
- package/dist/vis-state.d.ts +20 -0
- package/package.json +16 -16
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
3
|
+
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; }
|
|
4
|
+
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) { _defineProperty(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; }
|
|
5
|
+
// SPDX-License-Identifier: MIT
|
|
6
|
+
// Copyright contributors to the kepler.gl project
|
|
7
|
+
|
|
8
|
+
import { generateHashId } from '@kepler.gl/common-utils';
|
|
9
|
+
import { defaultAggregationsForFields, groupByDataset, isTabularDatasetForOps, joinDatasets, spatialJoinDatasets, suggestSpatialGeo } from '@kepler.gl/table';
|
|
10
|
+
function deactivateOps(ops) {
|
|
11
|
+
return ops.map(function (op) {
|
|
12
|
+
return _objectSpread(_objectSpread({}, op), {}, {
|
|
13
|
+
isConfigActive: false
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function randomTwoDigitSuffix() {
|
|
18
|
+
return String(Math.floor(Math.random() * 100)).padStart(2, '0');
|
|
19
|
+
}
|
|
20
|
+
function defaultGroupByLabel() {
|
|
21
|
+
return "group-by-".concat(randomTwoDigitSuffix());
|
|
22
|
+
}
|
|
23
|
+
function defaultJoinLabel() {
|
|
24
|
+
return "join-dataset-".concat(randomTwoDigitSuffix());
|
|
25
|
+
}
|
|
26
|
+
function defaultSpatialJoinLabel(resultId) {
|
|
27
|
+
return "spatial-join-".concat(resultId);
|
|
28
|
+
}
|
|
29
|
+
export function addGroupByUpdater(state, action) {
|
|
30
|
+
var dataset = state.datasets[action.dataId];
|
|
31
|
+
if (!isTabularDatasetForOps(dataset)) {
|
|
32
|
+
return state;
|
|
33
|
+
}
|
|
34
|
+
var id = generateHashId(6);
|
|
35
|
+
var resultId = generateHashId(6);
|
|
36
|
+
var op = {
|
|
37
|
+
id: id,
|
|
38
|
+
dataId: action.dataId,
|
|
39
|
+
fieldName: null,
|
|
40
|
+
aggregations: defaultAggregationsForFields(dataset.fields),
|
|
41
|
+
resultId: resultId,
|
|
42
|
+
resultLabel: defaultGroupByLabel(),
|
|
43
|
+
isConfigActive: true,
|
|
44
|
+
error: null
|
|
45
|
+
};
|
|
46
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
47
|
+
groupBys: [].concat(_toConsumableArray(deactivateOps(state.groupBys)), [op]),
|
|
48
|
+
joins: deactivateOps(state.joins)
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function setGroupByConfigUpdater(state, action) {
|
|
52
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
53
|
+
groupBys: state.groupBys.map(function (op) {
|
|
54
|
+
var _action$config$error;
|
|
55
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
56
|
+
error: (_action$config$error = action.config.error) !== null && _action$config$error !== void 0 ? _action$config$error : null
|
|
57
|
+
}) : op;
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export function executeGroupBy(state, action) {
|
|
62
|
+
var op = state.groupBys.find(function (item) {
|
|
63
|
+
return item.id === action.id;
|
|
64
|
+
});
|
|
65
|
+
var dataset = op ? state.datasets[op.dataId] : undefined;
|
|
66
|
+
if (!op || !dataset || !op.fieldName) {
|
|
67
|
+
return {
|
|
68
|
+
state: setGroupByConfigUpdater(state, {
|
|
69
|
+
id: action.id,
|
|
70
|
+
config: {
|
|
71
|
+
error: 'Select a grouping field'
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
var proto = groupByDataset(dataset, {
|
|
78
|
+
fieldName: op.fieldName,
|
|
79
|
+
aggregations: op.aggregations,
|
|
80
|
+
label: op.resultLabel,
|
|
81
|
+
resultId: op.resultId,
|
|
82
|
+
operationId: op.id
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
86
|
+
groupBys: state.groupBys.map(function (item) {
|
|
87
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
88
|
+
isConfigActive: false,
|
|
89
|
+
error: null
|
|
90
|
+
}) : item;
|
|
91
|
+
})
|
|
92
|
+
}),
|
|
93
|
+
proto: proto
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
state: setGroupByConfigUpdater(state, {
|
|
98
|
+
id: action.id,
|
|
99
|
+
config: {
|
|
100
|
+
error: error instanceof Error ? error.message : String(error)
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function addJoinUpdater(state, action) {
|
|
107
|
+
var dataset = state.datasets[action.dataId];
|
|
108
|
+
if (!isTabularDatasetForOps(dataset)) {
|
|
109
|
+
return state;
|
|
110
|
+
}
|
|
111
|
+
var implementation = action.implementation || 'simple';
|
|
112
|
+
var id = generateHashId(6);
|
|
113
|
+
var resultId = generateHashId(6);
|
|
114
|
+
var op = {
|
|
115
|
+
id: id,
|
|
116
|
+
implementation: implementation,
|
|
117
|
+
leftDataId: action.dataId,
|
|
118
|
+
rightDataId: null,
|
|
119
|
+
leftField: null,
|
|
120
|
+
rightField: null,
|
|
121
|
+
type: 'LEFT',
|
|
122
|
+
aggregations: {},
|
|
123
|
+
leftGeo: implementation === 'spatial' ? suggestSpatialGeo(dataset.fields) : null,
|
|
124
|
+
rightGeo: null,
|
|
125
|
+
predicate: implementation === 'spatial' ? 'intersects' : undefined,
|
|
126
|
+
resultId: resultId,
|
|
127
|
+
resultLabel: implementation === 'spatial' ? defaultSpatialJoinLabel(resultId) : defaultJoinLabel(),
|
|
128
|
+
isConfigActive: true,
|
|
129
|
+
error: null
|
|
130
|
+
};
|
|
131
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
132
|
+
joins: [].concat(_toConsumableArray(deactivateOps(state.joins)), [op]),
|
|
133
|
+
groupBys: deactivateOps(state.groupBys)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export function setJoinConfigUpdater(state, action) {
|
|
137
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
138
|
+
joins: state.joins.map(function (op) {
|
|
139
|
+
var _action$config$error2;
|
|
140
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
141
|
+
error: (_action$config$error2 = action.config.error) !== null && _action$config$error2 !== void 0 ? _action$config$error2 : null
|
|
142
|
+
}) : op;
|
|
143
|
+
})
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
export function executeJoin(state, action) {
|
|
147
|
+
var op = state.joins.find(function (item) {
|
|
148
|
+
return item.id === action.id && item.implementation !== 'spatial';
|
|
149
|
+
});
|
|
150
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
151
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
152
|
+
if (!op || !left || !right || !op.leftField || !op.rightField) {
|
|
153
|
+
return {
|
|
154
|
+
state: setJoinConfigUpdater(state, {
|
|
155
|
+
id: action.id,
|
|
156
|
+
config: {
|
|
157
|
+
error: 'Select datasets and join keys'
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
var proto = joinDatasets(left, right, {
|
|
164
|
+
leftField: op.leftField,
|
|
165
|
+
rightField: op.rightField,
|
|
166
|
+
type: op.type,
|
|
167
|
+
leftColumns: op.leftColumns,
|
|
168
|
+
rightColumns: op.rightColumns,
|
|
169
|
+
label: op.resultLabel,
|
|
170
|
+
resultId: op.resultId,
|
|
171
|
+
operationId: op.id
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
175
|
+
joins: state.joins.map(function (item) {
|
|
176
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
177
|
+
isConfigActive: false,
|
|
178
|
+
error: null
|
|
179
|
+
}) : item;
|
|
180
|
+
})
|
|
181
|
+
}),
|
|
182
|
+
proto: proto
|
|
183
|
+
};
|
|
184
|
+
} catch (error) {
|
|
185
|
+
return {
|
|
186
|
+
state: setJoinConfigUpdater(state, {
|
|
187
|
+
id: action.id,
|
|
188
|
+
config: {
|
|
189
|
+
error: error instanceof Error ? error.message : String(error)
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
export function addSpatialJoinUpdater(state, action) {
|
|
196
|
+
return addJoinUpdater(state, {
|
|
197
|
+
dataId: action.dataId,
|
|
198
|
+
implementation: 'spatial'
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
export function setSpatialJoinConfigUpdater(state, action) {
|
|
202
|
+
return setJoinConfigUpdater(state, action);
|
|
203
|
+
}
|
|
204
|
+
export function executeSpatialJoin(state, action) {
|
|
205
|
+
var op = state.joins.find(function (item) {
|
|
206
|
+
return item.id === action.id && item.implementation === 'spatial';
|
|
207
|
+
});
|
|
208
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
209
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
210
|
+
if (!op || !left || !right || !op.leftGeo || !op.rightGeo) {
|
|
211
|
+
return {
|
|
212
|
+
state: setJoinConfigUpdater(state, {
|
|
213
|
+
id: action.id,
|
|
214
|
+
config: {
|
|
215
|
+
error: 'Select datasets and geometry fields'
|
|
216
|
+
}
|
|
217
|
+
})
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
var proto = spatialJoinDatasets(left, right, {
|
|
222
|
+
leftGeo: op.leftGeo,
|
|
223
|
+
rightGeo: op.rightGeo,
|
|
224
|
+
aggregations: op.aggregations,
|
|
225
|
+
leftColumns: op.leftColumns,
|
|
226
|
+
predicate: op.predicate || 'intersects',
|
|
227
|
+
label: op.resultLabel,
|
|
228
|
+
resultId: op.resultId,
|
|
229
|
+
operationId: op.id
|
|
230
|
+
});
|
|
231
|
+
return {
|
|
232
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
233
|
+
joins: state.joins.map(function (item) {
|
|
234
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
235
|
+
isConfigActive: false,
|
|
236
|
+
error: null
|
|
237
|
+
}) : item;
|
|
238
|
+
})
|
|
239
|
+
}),
|
|
240
|
+
proto: proto
|
|
241
|
+
};
|
|
242
|
+
} catch (error) {
|
|
243
|
+
return {
|
|
244
|
+
state: setJoinConfigUpdater(state, {
|
|
245
|
+
id: action.id,
|
|
246
|
+
config: {
|
|
247
|
+
error: error instanceof Error ? error.message : String(error)
|
|
248
|
+
}
|
|
249
|
+
})
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
export function removeDatasetOpUpdater(state, action) {
|
|
254
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
255
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
256
|
+
return op.id !== action.id;
|
|
257
|
+
}),
|
|
258
|
+
joins: state.joins.filter(function (op) {
|
|
259
|
+
return op.id !== action.id;
|
|
260
|
+
})
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
export function removeOpsForDatasets(state, dataIds) {
|
|
264
|
+
var ids = new Set(dataIds);
|
|
265
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
266
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
267
|
+
return !ids.has(op.dataId) && !ids.has(op.resultId);
|
|
268
|
+
}),
|
|
269
|
+
joins: state.joins.filter(function (op) {
|
|
270
|
+
return !ids.has(op.leftDataId) && !(op.rightDataId && ids.has(op.rightDataId)) && !ids.has(op.resultId);
|
|
271
|
+
})
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZW5lcmF0ZUhhc2hJZCIsImRlZmF1bHRBZ2dyZWdhdGlvbnNGb3JGaWVsZHMiLCJncm91cEJ5RGF0YXNldCIsImlzVGFidWxhckRhdGFzZXRGb3JPcHMiLCJqb2luRGF0YXNldHMiLCJzcGF0aWFsSm9pbkRhdGFzZXRzIiwic3VnZ2VzdFNwYXRpYWxHZW8iLCJkZWFjdGl2YXRlT3BzIiwib3BzIiwibWFwIiwib3AiLCJfb2JqZWN0U3ByZWFkIiwiaXNDb25maWdBY3RpdmUiLCJyYW5kb21Ud29EaWdpdFN1ZmZpeCIsIlN0cmluZyIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInBhZFN0YXJ0IiwiZGVmYXVsdEdyb3VwQnlMYWJlbCIsImNvbmNhdCIsImRlZmF1bHRKb2luTGFiZWwiLCJkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbCIsInJlc3VsdElkIiwiYWRkR3JvdXBCeVVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsImRhdGFzZXQiLCJkYXRhc2V0cyIsImRhdGFJZCIsImlkIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwiZmllbGRzIiwicmVzdWx0TGFiZWwiLCJlcnJvciIsImdyb3VwQnlzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwiam9pbnMiLCJzZXRHcm91cEJ5Q29uZmlnVXBkYXRlciIsIl9hY3Rpb24kY29uZmlnJGVycm9yIiwiY29uZmlnIiwiZXhlY3V0ZUdyb3VwQnkiLCJmaW5kIiwiaXRlbSIsInVuZGVmaW5lZCIsInByb3RvIiwibGFiZWwiLCJvcGVyYXRpb25JZCIsIkVycm9yIiwibWVzc2FnZSIsImFkZEpvaW5VcGRhdGVyIiwiaW1wbGVtZW50YXRpb24iLCJsZWZ0RGF0YUlkIiwicmlnaHREYXRhSWQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwidHlwZSIsImxlZnRHZW8iLCJyaWdodEdlbyIsInByZWRpY2F0ZSIsInNldEpvaW5Db25maWdVcGRhdGVyIiwiX2FjdGlvbiRjb25maWckZXJyb3IyIiwiZXhlY3V0ZUpvaW4iLCJsZWZ0IiwicmlnaHQiLCJsZWZ0Q29sdW1ucyIsInJpZ2h0Q29sdW1ucyIsImFkZFNwYXRpYWxKb2luVXBkYXRlciIsInNldFNwYXRpYWxKb2luQ29uZmlnVXBkYXRlciIsImV4ZWN1dGVTcGF0aWFsSm9pbiIsInJlbW92ZURhdGFzZXRPcFVwZGF0ZXIiLCJmaWx0ZXIiLCJyZW1vdmVPcHNGb3JEYXRhc2V0cyIsImRhdGFJZHMiLCJpZHMiLCJTZXQiLCJoYXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdEFnZ3JlZ2F0aW9uc0ZvckZpZWxkcyxcbiAgZ3JvdXBCeURhdGFzZXQsXG4gIGlzVGFidWxhckRhdGFzZXRGb3JPcHMsXG4gIGpvaW5EYXRhc2V0cyxcbiAgc3BhdGlhbEpvaW5EYXRhc2V0cyxcbiAgc3VnZ2VzdFNwYXRpYWxHZW8sXG4gIEdyb3VwQnlPcCxcbiAgSm9pbk9wXG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5leHBvcnQgdHlwZSBEZXJpdmVkRGF0YXNldE9wUmVzdWx0ID0ge1xuICBzdGF0ZTogVmlzU3RhdGU7XG4gIHByb3RvPzogUHJvdG9EYXRhc2V0O1xufTtcblxuZnVuY3Rpb24gZGVhY3RpdmF0ZU9wczxUIGV4dGVuZHMge2lzQ29uZmlnQWN0aXZlPzogYm9vbGVhbn0+KG9wczogVFtdKTogVFtdIHtcbiAgcmV0dXJuIG9wcy5tYXAob3AgPT4gKHsuLi5vcCwgaXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xufVxuXG5mdW5jdGlvbiByYW5kb21Ud29EaWdpdFN1ZmZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCkpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBncm91cC1ieS0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEpvaW5MYWJlbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYGpvaW4tZGF0YXNldC0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNwYXRpYWxKb2luTGFiZWwocmVzdWx0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgc3BhdGlhbC1qb2luLSR7cmVzdWx0SWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEdyb3VwQnlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEdyb3VwQnlVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1thY3Rpb24uZGF0YUlkXTtcbiAgaWYgKCFpc1RhYnVsYXJEYXRhc2V0Rm9yT3BzKGRhdGFzZXQpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGlkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IHJlc3VsdElkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IG9wOiBHcm91cEJ5T3AgPSB7XG4gICAgaWQsXG4gICAgZGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICBhZ2dyZWdhdGlvbnM6IGRlZmF1bHRBZ2dyZWdhdGlvbnNGb3JGaWVsZHMoZGF0YXNldC5maWVsZHMpLFxuICAgIHJlc3VsdElkLFxuICAgIHJlc3VsdExhYmVsOiBkZWZhdWx0R3JvdXBCeUxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpLCBvcF0sXG4gICAgam9pbnM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRHcm91cEJ5Q29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGdyb3VwQnlzOiBzdGF0ZS5ncm91cEJ5cy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlR3JvdXBCeShcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Hcm91cEJ5VXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCk7XG4gIGNvbnN0IGRhdGFzZXQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmRhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWRhdGFzZXQgfHwgIW9wLmZpZWxkTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogc2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgY29uZmlnOiB7ZXJyb3I6ICdTZWxlY3QgYSBncm91cGluZyBmaWVsZCd9XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gZ3JvdXBCeURhdGFzZXQoZGF0YXNldCwge1xuICAgICAgZmllbGROYW1lOiBvcC5maWVsZE5hbWUsXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRKb2luVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbYWN0aW9uLmRhdGFJZF07XG4gIGlmICghaXNUYWJ1bGFyRGF0YXNldEZvck9wcyhkYXRhc2V0KSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGFjdGlvbi5pbXBsZW1lbnRhdGlvbiB8fCAnc2ltcGxlJztcbiAgY29uc3QgaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3QgcmVzdWx0SWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3Qgb3A6IEpvaW5PcCA9IHtcbiAgICBpZCxcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBsZWZ0RGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIHJpZ2h0RGF0YUlkOiBudWxsLFxuICAgIGxlZnRGaWVsZDogbnVsbCxcbiAgICByaWdodEZpZWxkOiBudWxsLFxuICAgIHR5cGU6ICdMRUZUJyxcbiAgICBhZ2dyZWdhdGlvbnM6IHt9LFxuICAgIGxlZnRHZW86IGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBzdWdnZXN0U3BhdGlhbEdlbyhkYXRhc2V0LmZpZWxkcykgOiBudWxsLFxuICAgIHJpZ2h0R2VvOiBudWxsLFxuICAgIHByZWRpY2F0ZTogaW1wbGVtZW50YXRpb24gPT09ICdzcGF0aWFsJyA/ICdpbnRlcnNlY3RzJyA6IHVuZGVmaW5lZCxcbiAgICByZXN1bHRJZCxcbiAgICByZXN1bHRMYWJlbDpcbiAgICAgIGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbChyZXN1bHRJZCkgOiBkZWZhdWx0Sm9pbkxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBqb2luczogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpLCBvcF0sXG4gICAgZ3JvdXBCeXM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRKb2luQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRKb2luQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Kb2luVXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuam9pbnMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCAmJiBpdGVtLmltcGxlbWVudGF0aW9uICE9PSAnc3BhdGlhbCcpO1xuICBjb25zdCBsZWZ0ID0gb3AgPyBzdGF0ZS5kYXRhc2V0c1tvcC5sZWZ0RGF0YUlkXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmlnaHQgPSBvcD8ucmlnaHREYXRhSWQgPyBzdGF0ZS5kYXRhc2V0c1tvcC5yaWdodERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWxlZnQgfHwgIXJpZ2h0IHx8ICFvcC5sZWZ0RmllbGQgfHwgIW9wLnJpZ2h0RmllbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBqb2luIGtleXMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IGpvaW5EYXRhc2V0cyhsZWZ0LCByaWdodCwge1xuICAgICAgbGVmdEZpZWxkOiBvcC5sZWZ0RmllbGQsXG4gICAgICByaWdodEZpZWxkOiBvcC5yaWdodEZpZWxkLFxuICAgICAgdHlwZTogb3AudHlwZSxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHJpZ2h0Q29sdW1uczogb3AucmlnaHRDb2x1bW5zLFxuICAgICAgbGFiZWw6IG9wLnJlc3VsdExhYmVsLFxuICAgICAgcmVzdWx0SWQ6IG9wLnJlc3VsdElkLFxuICAgICAgb3BlcmF0aW9uSWQ6IG9wLmlkXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBqb2luczogc3RhdGUuam9pbnMubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBvcC5pZCA/IHsuLi5pdGVtLCBpc0NvbmZpZ0FjdGl2ZTogZmFsc2UsIGVycm9yOiBudWxsfSA6IGl0ZW1cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHByb3RvXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XG4gICAgICB9KVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNwYXRpYWxKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRTcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIGFkZEpvaW5VcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBpbXBsZW1lbnRhdGlvbjogJ3NwYXRpYWwnfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGF0aWFsSm9pbkNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVTcGF0aWFsSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5TcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IERlcml2ZWREYXRhc2V0T3BSZXN1bHQge1xuICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBhY3Rpb24uaWQgJiYgaXRlbS5pbXBsZW1lbnRhdGlvbiA9PT0gJ3NwYXRpYWwnKTtcbiAgY29uc3QgbGVmdCA9IG9wID8gc3RhdGUuZGF0YXNldHNbb3AubGVmdERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJpZ2h0ID0gb3A/LnJpZ2h0RGF0YUlkID8gc3RhdGUuZGF0YXNldHNbb3AucmlnaHREYXRhSWRdIDogdW5kZWZpbmVkO1xuICBpZiAoIW9wIHx8ICFsZWZ0IHx8ICFyaWdodCB8fCAhb3AubGVmdEdlbyB8fCAhb3AucmlnaHRHZW8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBnZW9tZXRyeSBmaWVsZHMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IHNwYXRpYWxKb2luRGF0YXNldHMobGVmdCwgcmlnaHQsIHtcbiAgICAgIGxlZnRHZW86IG9wLmxlZnRHZW8sXG4gICAgICByaWdodEdlbzogb3AucmlnaHRHZW8sXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHByZWRpY2F0ZTogb3AucHJlZGljYXRlIHx8ICdpbnRlcnNlY3RzJyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgam9pbnM6IHN0YXRlLmpvaW5zLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0T3BVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZURhdGFzZXRPcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogc3RhdGUuZ3JvdXBCeXMuZmlsdGVyKG9wID0+IG9wLmlkICE9PSBhY3Rpb24uaWQpLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIob3AgPT4gb3AuaWQgIT09IGFjdGlvbi5pZClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9wc0ZvckRhdGFzZXRzKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkczogc3RyaW5nW10pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoZGF0YUlkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLmZpbHRlcihvcCA9PiAhaWRzLmhhcyhvcC5kYXRhSWQpICYmICFpZHMuaGFzKG9wLnJlc3VsdElkKSksXG4gICAgam9pbnM6IHN0YXRlLmpvaW5zLmZpbHRlcihcbiAgICAgIG9wID0+XG4gICAgICAgICFpZHMuaGFzKG9wLmxlZnREYXRhSWQpICYmXG4gICAgICAgICEob3AucmlnaHREYXRhSWQgJiYgaWRzLmhhcyhvcC5yaWdodERhdGFJZCkpICYmXG4gICAgICAgICFpZHMuaGFzKG9wLnJlc3VsdElkKVxuICAgIClcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7O0FBRUEsU0FBUUEsY0FBYyxRQUFPLHlCQUF5QjtBQUN0RCxTQUNFQyw0QkFBNEIsRUFDNUJDLGNBQWMsRUFDZEMsc0JBQXNCLEVBQ3RCQyxZQUFZLEVBQ1pDLG1CQUFtQixFQUNuQkMsaUJBQWlCLFFBR1osa0JBQWtCO0FBVXpCLFNBQVNDLGFBQWFBLENBQXVDQyxHQUFRLEVBQU87RUFDMUUsT0FBT0EsR0FBRyxDQUFDQyxHQUFHLENBQUMsVUFBQUMsRUFBRTtJQUFBLE9BQUFD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
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
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; }
|
|
3
|
+
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) { _defineProperty(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; }
|
|
4
|
+
// SPDX-License-Identifier: MIT
|
|
5
|
+
// Copyright contributors to the kepler.gl project
|
|
6
|
+
|
|
7
|
+
import { ALL_FIELD_TYPES } from '@kepler.gl/constants';
|
|
8
|
+
import { VisStateActions } from '@kepler.gl/actions';
|
|
9
|
+
import { KeplerTable } from '@kepler.gl/table';
|
|
10
|
+
import SchemaManager from '@kepler.gl/schemas';
|
|
11
|
+
import { drainTasksForTesting, succeedTaskWithValues } from '@kepler.gl/tasks';
|
|
12
|
+
import visStateReducer from './vis-state';
|
|
13
|
+
import { INITIAL_VIS_STATE } from './vis-state-updaters';
|
|
14
|
+
var reduceVisState = visStateReducer;
|
|
15
|
+
function makeTable(id, fields, rows) {
|
|
16
|
+
var table = new KeplerTable({
|
|
17
|
+
info: {
|
|
18
|
+
id: id,
|
|
19
|
+
label: id,
|
|
20
|
+
type: 'local'
|
|
21
|
+
},
|
|
22
|
+
color: [0, 0, 0]
|
|
23
|
+
});
|
|
24
|
+
table.updateSchema({
|
|
25
|
+
fields: fields.map(function (field) {
|
|
26
|
+
return {
|
|
27
|
+
name: field.name,
|
|
28
|
+
type: field.type,
|
|
29
|
+
analyzerType: field.type
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
rows: rows
|
|
33
|
+
});
|
|
34
|
+
return table;
|
|
35
|
+
}
|
|
36
|
+
function flushCreateTableTasks(state) {
|
|
37
|
+
var tasks = drainTasksForTesting();
|
|
38
|
+
return tasks.reduce(function (nextState, task) {
|
|
39
|
+
if (!String(task.label || '').includes('CREATE_TABLE_TASK')) {
|
|
40
|
+
return nextState;
|
|
41
|
+
}
|
|
42
|
+
var tables = (Array.isArray(task.payload) ? task.payload : [task.payload]).map(function (payload) {
|
|
43
|
+
var table = new KeplerTable(_objectSpread({
|
|
44
|
+
info: payload.info,
|
|
45
|
+
color: payload.color
|
|
46
|
+
}, payload.opts));
|
|
47
|
+
table.updateSchema(payload.data);
|
|
48
|
+
return table;
|
|
49
|
+
});
|
|
50
|
+
return reduceVisState(nextState, succeedTaskWithValues(task, tables));
|
|
51
|
+
}, state);
|
|
52
|
+
}
|
|
53
|
+
describe('dataset ops vis-state', function () {
|
|
54
|
+
beforeEach(function () {
|
|
55
|
+
drainTasksForTesting();
|
|
56
|
+
});
|
|
57
|
+
test('runGroupBy adds a derived dataset', function () {
|
|
58
|
+
var cities = makeTable('cities', [{
|
|
59
|
+
name: 'region',
|
|
60
|
+
type: ALL_FIELD_TYPES.string
|
|
61
|
+
}, {
|
|
62
|
+
name: 'pop',
|
|
63
|
+
type: ALL_FIELD_TYPES.integer
|
|
64
|
+
}], [['west', 10], ['west', 20], ['east', 40]]);
|
|
65
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
66
|
+
datasets: {
|
|
67
|
+
cities: cities
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
71
|
+
expect(state.groupBys).toHaveLength(1);
|
|
72
|
+
var opId = state.groupBys[0].id;
|
|
73
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(opId, {
|
|
74
|
+
fieldName: 'region',
|
|
75
|
+
aggregations: {
|
|
76
|
+
pop: 'sum'
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(opId));
|
|
80
|
+
state = flushCreateTableTasks(state);
|
|
81
|
+
var resultId = state.groupBys[0].resultId;
|
|
82
|
+
expect(state.datasets[resultId]).toBeTruthy();
|
|
83
|
+
expect(state.datasets[resultId].metadata.derivedDataset).toEqual({
|
|
84
|
+
type: 'groupBy',
|
|
85
|
+
sourceDataIds: ['cities'],
|
|
86
|
+
operationId: opId
|
|
87
|
+
});
|
|
88
|
+
expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
|
|
89
|
+
});
|
|
90
|
+
test('delete parent keeps derived child snapshot', function () {
|
|
91
|
+
var cities = makeTable('cities', [{
|
|
92
|
+
name: 'region',
|
|
93
|
+
type: ALL_FIELD_TYPES.string
|
|
94
|
+
}, {
|
|
95
|
+
name: 'pop',
|
|
96
|
+
type: ALL_FIELD_TYPES.integer
|
|
97
|
+
}], [['west', 10]]);
|
|
98
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
99
|
+
datasets: {
|
|
100
|
+
cities: cities
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
104
|
+
var op = state.groupBys[0];
|
|
105
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
|
|
106
|
+
fieldName: 'region',
|
|
107
|
+
aggregations: {
|
|
108
|
+
pop: 'sum'
|
|
109
|
+
}
|
|
110
|
+
}));
|
|
111
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(op.id));
|
|
112
|
+
state = flushCreateTableTasks(state);
|
|
113
|
+
expect(Object.keys(state.datasets)).toHaveLength(2);
|
|
114
|
+
state = reduceVisState(state, VisStateActions.removeDataset('cities'));
|
|
115
|
+
expect(state.datasets.cities).toBeUndefined();
|
|
116
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
117
|
+
expect(state.groupBys).toHaveLength(0);
|
|
118
|
+
});
|
|
119
|
+
test('addGroupBy uses a short random result name', function () {
|
|
120
|
+
var cities = makeTable('cities', [{
|
|
121
|
+
name: 'region',
|
|
122
|
+
type: ALL_FIELD_TYPES.string
|
|
123
|
+
}], [['west']]);
|
|
124
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
125
|
+
datasets: {
|
|
126
|
+
cities: cities
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
130
|
+
expect(state.groupBys[0].resultLabel).toMatch(/^group-by-\d{2}$/);
|
|
131
|
+
});
|
|
132
|
+
test('addJoin uses a short random result name', function () {
|
|
133
|
+
var cities = makeTable('cities', [{
|
|
134
|
+
name: 'id',
|
|
135
|
+
type: ALL_FIELD_TYPES.string
|
|
136
|
+
}], [['1']]);
|
|
137
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
138
|
+
datasets: {
|
|
139
|
+
cities: cities
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
state = reduceVisState(state, VisStateActions.addJoin('cities'));
|
|
143
|
+
expect(state.joins[0].resultLabel).toMatch(/^join-dataset-\d{2}$/);
|
|
144
|
+
});
|
|
145
|
+
test('setSpatialJoinConfig updates the predicate', function () {
|
|
146
|
+
var polys = makeTable('polys', [{
|
|
147
|
+
name: 'geom',
|
|
148
|
+
type: ALL_FIELD_TYPES.geojson
|
|
149
|
+
}], []);
|
|
150
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
151
|
+
datasets: {
|
|
152
|
+
polys: polys
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
|
|
156
|
+
var op = state.joins[0];
|
|
157
|
+
expect(state.joins[0].predicate).toBe('intersects');
|
|
158
|
+
expect(state.joins[0].resultLabel).toBe("spatial-join-".concat(state.joins[0].resultId));
|
|
159
|
+
state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
|
|
160
|
+
predicate: 'within'
|
|
161
|
+
}));
|
|
162
|
+
expect(state.joins[0].predicate).toBe('within');
|
|
163
|
+
});
|
|
164
|
+
test('delete spatial join source keeps result snapshot', function () {
|
|
165
|
+
var polygon = {
|
|
166
|
+
type: 'Polygon',
|
|
167
|
+
coordinates: [[[-10, -10], [10, -10], [10, 10], [-10, 10], [-10, -10]]]
|
|
168
|
+
};
|
|
169
|
+
var polys = makeTable('polys', [{
|
|
170
|
+
name: 'name',
|
|
171
|
+
type: ALL_FIELD_TYPES.string
|
|
172
|
+
}, {
|
|
173
|
+
name: 'geom',
|
|
174
|
+
type: ALL_FIELD_TYPES.geojson
|
|
175
|
+
}], [['west', polygon]]);
|
|
176
|
+
var pts = makeTable('pts', [{
|
|
177
|
+
name: 'lat',
|
|
178
|
+
type: ALL_FIELD_TYPES.real
|
|
179
|
+
}, {
|
|
180
|
+
name: 'lng',
|
|
181
|
+
type: ALL_FIELD_TYPES.real
|
|
182
|
+
}, {
|
|
183
|
+
name: 'value',
|
|
184
|
+
type: ALL_FIELD_TYPES.integer
|
|
185
|
+
}], [[0, 0, 10]]);
|
|
186
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
187
|
+
datasets: {
|
|
188
|
+
polys: polys,
|
|
189
|
+
pts: pts
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
|
|
193
|
+
var op = state.joins[0];
|
|
194
|
+
state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
|
|
195
|
+
rightDataId: 'pts',
|
|
196
|
+
leftGeo: {
|
|
197
|
+
kind: 'geojson',
|
|
198
|
+
fieldName: 'geom'
|
|
199
|
+
},
|
|
200
|
+
rightGeo: {
|
|
201
|
+
kind: 'latlng',
|
|
202
|
+
latField: 'lat',
|
|
203
|
+
lngField: 'lng'
|
|
204
|
+
},
|
|
205
|
+
aggregations: {
|
|
206
|
+
value: 'sum'
|
|
207
|
+
}
|
|
208
|
+
}));
|
|
209
|
+
state = reduceVisState(state, VisStateActions.runSpatialJoin(op.id));
|
|
210
|
+
state = flushCreateTableTasks(state);
|
|
211
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
212
|
+
state = reduceVisState(state, VisStateActions.removeDataset('pts'));
|
|
213
|
+
expect(state.datasets.pts).toBeUndefined();
|
|
214
|
+
expect(state.datasets.polys).toBeTruthy();
|
|
215
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
216
|
+
expect(state.joins).toHaveLength(0);
|
|
217
|
+
});
|
|
218
|
+
test('save/load roundtrip keeps derivedDataset metadata and drafts', function () {
|
|
219
|
+
var _derivedMeta$derivedD, _saved$config$config$;
|
|
220
|
+
var cities = makeTable('cities', [{
|
|
221
|
+
name: 'region',
|
|
222
|
+
type: ALL_FIELD_TYPES.string
|
|
223
|
+
}, {
|
|
224
|
+
name: 'pop',
|
|
225
|
+
type: ALL_FIELD_TYPES.integer
|
|
226
|
+
}], [['west', 10]]);
|
|
227
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
228
|
+
datasets: {
|
|
229
|
+
cities: cities
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
233
|
+
var op = state.groupBys[0];
|
|
234
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
|
|
235
|
+
fieldName: 'region',
|
|
236
|
+
aggregations: {
|
|
237
|
+
pop: 'sum'
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(op.id));
|
|
241
|
+
state = flushCreateTableTasks(state);
|
|
242
|
+
var saved = SchemaManager.save({
|
|
243
|
+
visState: state,
|
|
244
|
+
mapState: {},
|
|
245
|
+
mapStyle: {},
|
|
246
|
+
uiState: {}
|
|
247
|
+
});
|
|
248
|
+
var derived = saved.datasets.find(function (dataset) {
|
|
249
|
+
return dataset.data.id === op.resultId;
|
|
250
|
+
});
|
|
251
|
+
var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
|
|
252
|
+
expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD === void 0 ? void 0 : _derivedMeta$derivedD.type).toBe('groupBy');
|
|
253
|
+
expect((_saved$config$config$ = saved.config.config.visState.groupBys) === null || _saved$config$config$ === void 0 ? void 0 : _saved$config$config$[0].fieldName).toBe('region');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsInZpc1N0YXRlUmVkdWNlciIsIklOSVRJQUxfVklTX1NUQVRFIiwicmVkdWNlVmlzU3RhdGUiLCJtYWtlVGFibGUiLCJpZCIsImZpZWxkcyIsInJvd3MiLCJ0YWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJyZWR1Y2UiLCJuZXh0U3RhdGUiLCJ0YXNrIiwiU3RyaW5nIiwiaW5jbHVkZXMiLCJ0YWJsZXMiLCJBcnJheSIsImlzQXJyYXkiLCJwYXlsb2FkIiwiX29iamVjdFNwcmVhZCIsIm9wdHMiLCJkYXRhIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwidGVzdCIsImNpdGllcyIsInN0cmluZyIsImludGVnZXIiLCJkYXRhc2V0cyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicnVuR3JvdXBCeSIsInJlc3VsdElkIiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJPYmplY3QiLCJrZXlzIiwicmVtb3ZlRGF0YXNldCIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJhZGRKb2luIiwiam9pbnMiLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsImNvbmNhdCIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsImNvb3JkaW5hdGVzIiwicHRzIiwicmVhbCIsInJpZ2h0RGF0YUlkIiwibGVmdEdlbyIsImtpbmQiLCJyaWdodEdlbyIsImxhdEZpZWxkIiwibG5nRmllbGQiLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiX2Rlcml2ZWRNZXRhJGRlcml2ZWREIiwiX3NhdmVkJGNvbmZpZyRjb25maWckIiwic2F2ZWQiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzZXQtb3BzLXVwZGF0ZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgc3VjY2VlZFRhc2tXaXRoVmFsdWVzfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcblxuaW1wb3J0IHZpc1N0YXRlUmVkdWNlciBmcm9tICcuL3Zpcy1zdGF0ZSc7XG5pbXBvcnQge0lOSVRJQUxfVklTX1NUQVRFfSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5cbmNvbnN0IHJlZHVjZVZpc1N0YXRlID0gdmlzU3RhdGVSZWR1Y2VyIGFzIChzdGF0ZTogVmlzU3RhdGUsIGFjdGlvbjogdW5rbm93bikgPT4gVmlzU3RhdGU7XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZShpZDogc3RyaW5nLCBmaWVsZHM6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ31bXSwgcm93czogYW55W11bXSkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkLCBsYWJlbDogaWQsIHR5cGU6ICdsb2NhbCd9LFxuICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgfSk7XG4gIHRhYmxlLnVwZGF0ZVNjaGVtYSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGFuYWx5emVyVHlwZTogZmllbGQudHlwZVxuICAgIH0pKSxcbiAgICByb3dzXG4gIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZTogVmlzU3RhdGUpIHtcbiAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICByZXR1cm4gdGFza3MucmVkdWNlKChuZXh0U3RhdGUsIHRhc2spID0+IHtcbiAgICBpZiAoIVN0cmluZyh0YXNrLmxhYmVsIHx8ICcnKS5pbmNsdWRlcygnQ1JFQVRFX1RBQkxFX1RBU0snKSkge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gKEFycmF5LmlzQXJyYXkodGFzay5wYXlsb2FkKSA/IHRhc2sucGF5bG9hZCA6IFt0YXNrLnBheWxvYWRdKS5tYXAocGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7aW5mbzogcGF5bG9hZC5pbmZvLCBjb2xvcjogcGF5bG9hZC5jb2xvciwgLi4ucGF5bG9hZC5vcHRzfSk7XG4gICAgICB0YWJsZS51cGRhdGVTY2hlbWEocGF5bG9hZC5kYXRhKTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVkdWNlVmlzU3RhdGUobmV4dFN0YXRlLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXModGFzaywgdGFibGVzKSk7XG4gIH0sIHN0YXRlKTtcbn1cblxuZGVzY3JpYmUoJ2RhdGFzZXQgb3BzIHZpcy1zdGF0ZScsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuR3JvdXBCeSBhZGRzIGEgZGVyaXZlZCBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWyd3ZXN0JywgMTBdLFxuICAgICAgICBbJ3dlc3QnLCAyMF0sXG4gICAgICAgIFsnZWFzdCcsIDQwXVxuICAgICAgXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3BJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLmlkO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3BJZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wSWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCByZXN1bHRJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLnJlc3VsdElkO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbcmVzdWx0SWRdLm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdncm91cEJ5JyxcbiAgICAgIHNvdXJjZURhdGFJZHM6IFsnY2l0aWVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3BJZFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBwYXJlbnQga2VlcHMgZGVyaXZlZCBjaGlsZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgMTBdXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3AuaWQsIHtcbiAgICAgICAgZmllbGROYW1lOiAncmVnaW9uJyxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7cG9wOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cykpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEdyb3VwQnkgdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIFtbJ3dlc3QnXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15ncm91cC1ieS1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEpvaW4gdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoJ2NpdGllcycsIFt7bmFtZTogJ2lkJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLCBbWycxJ11dKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRKb2luKCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b01hdGNoKC9eam9pbi1kYXRhc2V0LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0U3BhdGlhbEpvaW5Db25maWcgdXBkYXRlcyB0aGUgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKCdwb2x5cycsIFt7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1dLCBbXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtwb2x5c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucHJlZGljYXRlKS50b0JlKCdpbnRlcnNlY3RzJyk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b0JlKGBzcGF0aWFsLWpvaW4tJHtzdGF0ZS5qb2luc1swXS5yZXN1bHRJZH1gKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtwcmVkaWNhdGU6ICd3aXRoaW4nfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ3dpdGhpbicpO1xuICB9KTtcblxuICB0ZXN0KCdkZWxldGUgc3BhdGlhbCBqb2luIHNvdXJjZSBrZWVwcyByZXN1bHQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFtcbiAgICAgICAgICBbLTEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgLTEwXSxcbiAgICAgICAgICBbMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAxMF0sXG4gICAgICAgICAgWy0xMCwgLTEwXVxuICAgICAgICBdXG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZShcbiAgICAgICdwb2x5cycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAnbmFtZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgcG9seWdvbl1dXG4gICAgKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoXG4gICAgICAncHRzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1swLCAwLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzLCBwdHN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7XG4gICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgbGVmdEdlbzoge2tpbmQ6ICdnZW9qc29uJywgZmllbGROYW1lOiAnZ2VvbSd9LFxuICAgICAgICByaWdodEdlbzoge2tpbmQ6ICdsYXRsbmcnLCBsYXRGaWVsZDogJ2xhdCcsIGxuZ0ZpZWxkOiAnbG5nJ30sXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3ZhbHVlOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3BhdGlhbEpvaW4ob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ3B0cycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucHRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnBvbHlzKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdzYXZlL2xvYWQgcm91bmR0cmlwIGtlZXBzIGRlcml2ZWREYXRhc2V0IG1ldGFkYXRhIGFuZCBkcmFmdHMnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1snd2VzdCcsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRHcm91cEJ5Q29uZmlnKG9wLmlkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdncm91cEJ5Jyk7XG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUuZ3JvdXBCeXM/LlswXS5maWVsZE5hbWUpLnRvQmUoJ3JlZ2lvbicpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVD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
|