@kepler.gl/reducers 3.3.0-alpha.15 → 3.3.0-alpha.17

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 (47) hide show
  1. package/dist/cjs/column-edit-reconcile.js +100 -0
  2. package/dist/cjs/column-edit-updaters.spec.js +840 -0
  3. package/dist/cjs/combined-updaters.js +166 -8
  4. package/dist/cjs/composers.js +4 -5
  5. package/dist/cjs/dataset-ops-updaters.js +375 -0
  6. package/dist/cjs/dataset-ops-updaters.spec.js +382 -0
  7. package/dist/cjs/export-utils.js +118 -46
  8. package/dist/cjs/interaction-utils.js +166 -6
  9. package/dist/cjs/layer-utils.js +135 -9
  10. package/dist/cjs/ui-state-updaters.js +134 -51
  11. package/dist/cjs/ui-state.js +2 -2
  12. package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
  13. package/dist/cjs/vis-state-merger.js +99 -25
  14. package/dist/cjs/vis-state-selectors.js +5 -4
  15. package/dist/cjs/vis-state-updaters.js +1077 -256
  16. package/dist/cjs/vis-state.js +2 -2
  17. package/dist/column-edit-reconcile.d.ts +4 -0
  18. package/dist/column-edit-updaters.spec.d.ts +1 -0
  19. package/dist/combined-updaters.d.ts +21 -1
  20. package/dist/composers.d.ts +3 -0
  21. package/dist/dataset-ops-updaters.d.ts +21 -0
  22. package/dist/dataset-ops-updaters.spec.d.ts +1 -0
  23. package/dist/esm/column-edit-reconcile.js +95 -0
  24. package/dist/esm/column-edit-updaters.spec.js +839 -0
  25. package/dist/esm/combined-updaters.js +166 -8
  26. package/dist/esm/composers.js +3 -2
  27. package/dist/esm/dataset-ops-updaters.js +357 -0
  28. package/dist/esm/dataset-ops-updaters.spec.js +381 -0
  29. package/dist/esm/export-utils.js +117 -45
  30. package/dist/esm/interaction-utils.js +159 -3
  31. package/dist/esm/layer-utils.js +133 -9
  32. package/dist/esm/ui-state-updaters.js +133 -50
  33. package/dist/esm/ui-state.js +2 -2
  34. package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
  35. package/dist/esm/vis-state-merger.js +99 -26
  36. package/dist/esm/vis-state-selectors.js +5 -4
  37. package/dist/esm/vis-state-updaters.js +1020 -263
  38. package/dist/esm/vis-state.js +2 -2
  39. package/dist/export-utils.d.ts +2 -2
  40. package/dist/interaction-utils.d.ts +25 -2
  41. package/dist/layer-utils.d.ts +17 -0
  42. package/dist/ui-state-updaters.d.ts +30 -0
  43. package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
  44. package/dist/vis-state-merger.d.ts +10 -2
  45. package/dist/vis-state-updaters.d.ts +61 -15
  46. package/dist/vis-state.d.ts +20 -0
  47. package/package.json +17 -17
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _constants = require("@kepler.gl/constants");
6
+ var _actions = require("@kepler.gl/actions");
7
+ var _table = require("@kepler.gl/table");
8
+ var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
9
+ var _tasks = require("@kepler.gl/tasks");
10
+ var _visState = _interopRequireDefault(require("./vis-state"));
11
+ var _visStateUpdaters = require("./vis-state-updaters");
12
+ 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; }
13
+ 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
14
+ // Copyright contributors to the kepler.gl project
15
+ var reduceVisState = _visState["default"];
16
+ function makeTable(id, fields, rows) {
17
+ var table = new _table.KeplerTable({
18
+ info: {
19
+ id: id,
20
+ label: id,
21
+ type: 'local'
22
+ },
23
+ color: [0, 0, 0]
24
+ });
25
+ table.updateSchema({
26
+ fields: fields.map(function (field) {
27
+ return {
28
+ name: field.name,
29
+ type: field.type,
30
+ analyzerType: field.type
31
+ };
32
+ }),
33
+ rows: rows
34
+ });
35
+ return table;
36
+ }
37
+ function flushCreateTableTasks(state) {
38
+ var tasks = (0, _tasks.drainTasksForTesting)();
39
+ return tasks.reduce(function (nextState, task) {
40
+ if (!String(task.label || '').includes('CREATE_TABLE_TASK')) {
41
+ return nextState;
42
+ }
43
+ var tables = (Array.isArray(task.payload) ? task.payload : [task.payload]).map(function (payload) {
44
+ var table = new _table.KeplerTable(_objectSpread({
45
+ info: payload.info,
46
+ color: payload.color
47
+ }, payload.opts));
48
+ table.updateSchema(payload.data);
49
+ return table;
50
+ });
51
+ return reduceVisState(nextState, (0, _tasks.succeedTaskWithValues)(task, tables));
52
+ }, state);
53
+ }
54
+ describe('dataset ops vis-state', function () {
55
+ beforeEach(function () {
56
+ (0, _tasks.drainTasksForTesting)();
57
+ });
58
+ test('runGroupBy adds a derived dataset', function () {
59
+ var cities = makeTable('cities', [{
60
+ name: 'region',
61
+ type: _constants.ALL_FIELD_TYPES.string
62
+ }, {
63
+ name: 'pop',
64
+ type: _constants.ALL_FIELD_TYPES.integer
65
+ }], [['west', 10], ['west', 20], ['east', 40]]);
66
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
67
+ datasets: {
68
+ cities: cities
69
+ }
70
+ });
71
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
72
+ expect(state.groupBys).toHaveLength(1);
73
+ var opId = state.groupBys[0].id;
74
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(opId, {
75
+ fieldName: 'region',
76
+ aggregations: {
77
+ pop: 'sum'
78
+ }
79
+ }));
80
+ var resultId = state.groupBys[0].resultId;
81
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(opId));
82
+ state = flushCreateTableTasks(state);
83
+ expect(state.groupBys).toHaveLength(0);
84
+ expect(state.datasets[resultId]).toBeTruthy();
85
+ expect(state.datasets[resultId].metadata.derivedDataset).toEqual({
86
+ type: 'groupBy',
87
+ sourceDataIds: ['cities'],
88
+ operationId: opId
89
+ });
90
+ expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
91
+ });
92
+ test('delete parent keeps derived child snapshot', function () {
93
+ var cities = makeTable('cities', [{
94
+ name: 'region',
95
+ type: _constants.ALL_FIELD_TYPES.string
96
+ }, {
97
+ name: 'pop',
98
+ type: _constants.ALL_FIELD_TYPES.integer
99
+ }], [['west', 10]]);
100
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
101
+ datasets: {
102
+ cities: cities
103
+ }
104
+ });
105
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
106
+ var op = state.groupBys[0];
107
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
108
+ fieldName: 'region',
109
+ aggregations: {
110
+ pop: 'sum'
111
+ }
112
+ }));
113
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
114
+ state = flushCreateTableTasks(state);
115
+ expect(state.groupBys).toHaveLength(0);
116
+ expect(Object.keys(state.datasets)).toHaveLength(2);
117
+ state = reduceVisState(state, _actions.VisStateActions.removeDataset('cities'));
118
+ expect(state.datasets.cities).toBeUndefined();
119
+ expect(state.datasets[op.resultId]).toBeTruthy();
120
+ expect(state.groupBys).toHaveLength(0);
121
+ });
122
+ test('addGroupBy uses a short random result name', function () {
123
+ var cities = makeTable('cities', [{
124
+ name: 'region',
125
+ type: _constants.ALL_FIELD_TYPES.string
126
+ }], [['west']]);
127
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
128
+ datasets: {
129
+ cities: cities
130
+ }
131
+ });
132
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
133
+ expect(state.groupBys[0].resultLabel).toMatch(/^group-by-\d{2}$/);
134
+ });
135
+ test('addJoin uses a short random result name', function () {
136
+ var cities = makeTable('cities', [{
137
+ name: 'id',
138
+ type: _constants.ALL_FIELD_TYPES.string
139
+ }], [['1']]);
140
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
141
+ datasets: {
142
+ cities: cities
143
+ }
144
+ });
145
+ state = reduceVisState(state, _actions.VisStateActions.addJoin('cities'));
146
+ expect(state.joins[0].resultLabel).toMatch(/^join-dataset-\d{2}$/);
147
+ });
148
+ test('setSpatialJoinConfig updates the predicate', function () {
149
+ var polys = makeTable('polys', [{
150
+ name: 'geom',
151
+ type: _constants.ALL_FIELD_TYPES.geojson
152
+ }], []);
153
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
154
+ datasets: {
155
+ polys: polys
156
+ }
157
+ });
158
+ state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
159
+ var op = state.joins[0];
160
+ expect(state.joins[0].predicate).toBe('intersects');
161
+ expect(state.joins[0].resultLabel).toBe("spatial-join-".concat(state.joins[0].resultId));
162
+ state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
163
+ predicate: 'within'
164
+ }));
165
+ expect(state.joins[0].predicate).toBe('within');
166
+ });
167
+ test('delete spatial join source keeps result snapshot', function () {
168
+ var polygon = {
169
+ type: 'Polygon',
170
+ coordinates: [[[-10, -10], [10, -10], [10, 10], [-10, 10], [-10, -10]]]
171
+ };
172
+ var polys = makeTable('polys', [{
173
+ name: 'name',
174
+ type: _constants.ALL_FIELD_TYPES.string
175
+ }, {
176
+ name: 'geom',
177
+ type: _constants.ALL_FIELD_TYPES.geojson
178
+ }], [['west', polygon]]);
179
+ var pts = makeTable('pts', [{
180
+ name: 'lat',
181
+ type: _constants.ALL_FIELD_TYPES.real
182
+ }, {
183
+ name: 'lng',
184
+ type: _constants.ALL_FIELD_TYPES.real
185
+ }, {
186
+ name: 'value',
187
+ type: _constants.ALL_FIELD_TYPES.integer
188
+ }], [[0, 0, 10]]);
189
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
190
+ datasets: {
191
+ polys: polys,
192
+ pts: pts
193
+ }
194
+ });
195
+ state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
196
+ var op = state.joins[0];
197
+ state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
198
+ rightDataId: 'pts',
199
+ leftGeo: {
200
+ kind: 'geojson',
201
+ fieldName: 'geom'
202
+ },
203
+ rightGeo: {
204
+ kind: 'latlng',
205
+ latField: 'lat',
206
+ lngField: 'lng'
207
+ },
208
+ aggregations: {
209
+ value: 'sum'
210
+ }
211
+ }));
212
+ state = reduceVisState(state, _actions.VisStateActions.runSpatialJoin(op.id));
213
+ state = flushCreateTableTasks(state);
214
+ expect(state.joins).toHaveLength(0);
215
+ expect(state.datasets[op.resultId]).toBeTruthy();
216
+ state = reduceVisState(state, _actions.VisStateActions.removeDataset('pts'));
217
+ expect(state.datasets.pts).toBeUndefined();
218
+ expect(state.datasets.polys).toBeTruthy();
219
+ expect(state.datasets[op.resultId]).toBeTruthy();
220
+ expect(state.joins).toHaveLength(0);
221
+ });
222
+ test('save/load roundtrip keeps the derived dataset and drops the finished group by', function () {
223
+ var _derivedMeta$derivedD, _saved$config$config$;
224
+ var cities = makeTable('cities', [{
225
+ name: 'region',
226
+ type: _constants.ALL_FIELD_TYPES.string
227
+ }, {
228
+ name: 'pop',
229
+ type: _constants.ALL_FIELD_TYPES.integer
230
+ }], [['west', 10]]);
231
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
232
+ datasets: {
233
+ cities: cities
234
+ }
235
+ });
236
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
237
+ var op = state.groupBys[0];
238
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
239
+ fieldName: 'region',
240
+ aggregations: {
241
+ pop: 'sum'
242
+ }
243
+ }));
244
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
245
+ state = flushCreateTableTasks(state);
246
+ var saved = _schemas["default"].save({
247
+ visState: state,
248
+ mapState: {},
249
+ mapStyle: {},
250
+ uiState: {}
251
+ });
252
+ var derived = saved.datasets.find(function (dataset) {
253
+ return dataset.data.id === op.resultId;
254
+ });
255
+ var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
256
+ expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD === void 0 ? void 0 : _derivedMeta$derivedD.type).toBe('groupBy');
257
+ expect((_saved$config$config$ = saved.config.config.visState.groupBys) !== null && _saved$config$config$ !== void 0 ? _saved$config$config$ : []).toHaveLength(0);
258
+ });
259
+ });
260
+ describe('suitability vis-state', function () {
261
+ beforeEach(function () {
262
+ (0, _tasks.drainTasksForTesting)();
263
+ });
264
+ function siteState() {
265
+ var sites = makeTable('sites', [{
266
+ name: 'name',
267
+ type: _constants.ALL_FIELD_TYPES.string
268
+ }, {
269
+ name: 'lat',
270
+ type: _constants.ALL_FIELD_TYPES.real
271
+ }, {
272
+ name: 'lng',
273
+ type: _constants.ALL_FIELD_TYPES.real
274
+ }, {
275
+ name: 'access',
276
+ type: _constants.ALL_FIELD_TYPES.integer
277
+ }, {
278
+ name: 'cost',
279
+ type: _constants.ALL_FIELD_TYPES.integer
280
+ }], [['a', 0, 0, 0, 100], ['b', 1, 1, 5, 200], ['c', 2, 2, 10, 300]]);
281
+ return _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
282
+ datasets: {
283
+ sites: sites
284
+ }
285
+ });
286
+ }
287
+ test('addSuitability seeds numeric weights and a short random result name', function () {
288
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addSuitability('sites'));
289
+ expect(state.suitabilities).toHaveLength(1);
290
+ var op = state.suitabilities[0];
291
+ expect(op.weights).toEqual({
292
+ lat: 1,
293
+ lng: 1,
294
+ access: 1,
295
+ cost: 1
296
+ });
297
+ expect(op.weightStandardization).toBe('normalize');
298
+ expect(op.dataStandardization).toBe('range');
299
+ expect(op.outputFieldName).toBe('score');
300
+ expect(op.resultLabel).toMatch(/^suitability-\d{2}$/);
301
+ });
302
+ test('opening a suitability op closes an open group by', function () {
303
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addGroupBy('sites'));
304
+ expect(state.groupBys[0].isConfigActive).toBe(true);
305
+ state = reduceVisState(state, _actions.VisStateActions.addSuitability('sites'));
306
+ expect(state.groupBys[0].isConfigActive).toBe(false);
307
+ expect(state.suitabilities[0].isConfigActive).toBe(true);
308
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('sites'));
309
+ expect(state.suitabilities[0].isConfigActive).toBe(false);
310
+ });
311
+ test('runSuitability adds a scored dataset and a default layer', function () {
312
+ var _layer$config$colorFi;
313
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addSuitability('sites'));
314
+ var op = state.suitabilities[0];
315
+ state = reduceVisState(state, _actions.VisStateActions.setSuitabilityConfig(op.id, {
316
+ weights: {
317
+ access: 1,
318
+ cost: 1
319
+ }
320
+ }));
321
+ state = reduceVisState(state, _actions.VisStateActions.runSuitability(op.id));
322
+ state = flushCreateTableTasks(state);
323
+ var result = state.datasets[op.resultId];
324
+ expect(result).toBeTruthy();
325
+ expect(result.metadata.derivedDataset).toEqual({
326
+ type: 'suitability',
327
+ sourceDataIds: ['sites'],
328
+ operationId: op.id
329
+ });
330
+ expect(result.fields.map(function (field) {
331
+ return field.name;
332
+ })).toContain('score');
333
+ expect(state.suitabilities[0].isConfigActive).toBe(false);
334
+ var layer = state.layers.find(function (item) {
335
+ return item.config.dataId === op.resultId;
336
+ });
337
+ expect(layer).toBeTruthy();
338
+ expect(layer === null || layer === void 0 || (_layer$config$colorFi = layer.config.colorField) === null || _layer$config$colorFi === void 0 ? void 0 : _layer$config$colorFi.name).toBe('score');
339
+ });
340
+ test('running without a weighted field surfaces an error instead of a dataset', function () {
341
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addSuitability('sites'));
342
+ var op = state.suitabilities[0];
343
+ state = reduceVisState(state, _actions.VisStateActions.setSuitabilityConfig(op.id, {
344
+ weights: {}
345
+ }));
346
+ state = reduceVisState(state, _actions.VisStateActions.runSuitability(op.id));
347
+ expect(state.suitabilities[0].error).toBe('Select at least one field to score');
348
+ expect(state.suitabilities[0].isConfigActive).toBe(true);
349
+ expect(state.datasets[op.resultId]).toBeUndefined();
350
+ });
351
+ test('deleting the source dataset drops the op but keeps the scored snapshot', function () {
352
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addSuitability('sites'));
353
+ var op = state.suitabilities[0];
354
+ state = reduceVisState(state, _actions.VisStateActions.runSuitability(op.id));
355
+ state = flushCreateTableTasks(state);
356
+ expect(state.datasets[op.resultId]).toBeTruthy();
357
+ state = reduceVisState(state, _actions.VisStateActions.removeDataset('sites'));
358
+ expect(state.datasets.sites).toBeUndefined();
359
+ expect(state.datasets[op.resultId]).toBeTruthy();
360
+ expect(state.suitabilities).toHaveLength(0);
361
+ });
362
+ test('the op config stays out of saved maps while the derived dataset persists', function () {
363
+ var _derivedMeta$derivedD2;
364
+ var state = reduceVisState(siteState(), _actions.VisStateActions.addSuitability('sites'));
365
+ var op = state.suitabilities[0];
366
+ state = reduceVisState(state, _actions.VisStateActions.runSuitability(op.id));
367
+ state = flushCreateTableTasks(state);
368
+ var saved = _schemas["default"].save({
369
+ visState: state,
370
+ mapState: {},
371
+ mapStyle: {},
372
+ uiState: {}
373
+ });
374
+ expect(saved.config.config.visState).not.toHaveProperty('suitabilities');
375
+ var derived = saved.datasets.find(function (dataset) {
376
+ return dataset.data.id === op.resultId;
377
+ });
378
+ var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
379
+ expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD2 = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD2 === void 0 ? void 0 : _derivedMeta$derivedD2.type).toBe('suitability');
380
+ });
381
+ });
382
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3RhYmxlIiwiX3NjaGVtYXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3Rhc2tzIiwiX3Zpc1N0YXRlIiwiX3Zpc1N0YXRlVXBkYXRlcnMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInJlZHVjZVZpc1N0YXRlIiwidmlzU3RhdGVSZWR1Y2VyIiwibWFrZVRhYmxlIiwiaWQiLCJmaWVsZHMiLCJyb3dzIiwidGFibGUiLCJLZXBsZXJUYWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInJlZHVjZSIsIm5leHRTdGF0ZSIsInRhc2siLCJTdHJpbmciLCJpbmNsdWRlcyIsInRhYmxlcyIsIkFycmF5IiwiaXNBcnJheSIsInBheWxvYWQiLCJvcHRzIiwiZGF0YSIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsInRlc3QiLCJjaXRpZXMiLCJBTExfRklFTERfVFlQRVMiLCJzdHJpbmciLCJpbnRlZ2VyIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJkYXRhc2V0cyIsIlZpc1N0YXRlQWN0aW9ucyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicmVzdWx0SWQiLCJydW5Hcm91cEJ5IiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJyZW1vdmVEYXRhc2V0IiwidG9CZVVuZGVmaW5lZCIsInJlc3VsdExhYmVsIiwidG9NYXRjaCIsImFkZEpvaW4iLCJqb2lucyIsInBvbHlzIiwiZ2VvanNvbiIsImFkZFNwYXRpYWxKb2luIiwicHJlZGljYXRlIiwiY29uY2F0Iiwic2V0U3BhdGlhbEpvaW5Db25maWciLCJwb2x5Z29uIiwiY29vcmRpbmF0ZXMiLCJwdHMiLCJyZWFsIiwicmlnaHREYXRhSWQiLCJsZWZ0R2VvIiwia2luZCIsInJpZ2h0R2VvIiwibGF0RmllbGQiLCJsbmdGaWVsZCIsInZhbHVlIiwicnVuU3BhdGlhbEpvaW4iLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQiLCJfc2F2ZWQkY29uZmlnJGNvbmZpZyQiLCJzYXZlZCIsIlNjaGVtYU1hbmFnZXIiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwibG5nIiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJyZXN1bHQiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBTY2hlbWFNYW5hZ2VyLCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2RyYWluVGFza3NGb3JUZXN0aW5nLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuXG5pbXBvcnQgdmlzU3RhdGVSZWR1Y2VyIGZyb20gJy4vdmlzLXN0YXRlJztcbmltcG9ydCB7SU5JVElBTF9WSVNfU1RBVEV9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcblxuY29uc3QgcmVkdWNlVmlzU3RhdGUgPSB2aXNTdGF0ZVJlZHVjZXIgYXMgKHN0YXRlOiBWaXNTdGF0ZSwgYWN0aW9uOiB1bmtub3duKSA9PiBWaXNTdGF0ZTtcblxuZnVuY3Rpb24gbWFrZVRhYmxlKGlkOiBzdHJpbmcsIGZpZWxkczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nfVtdLCByb3dzOiBhbnlbXVtdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgdGFibGUudXBkYXRlU2NoZW1hKHtcbiAgICBmaWVsZHM6IGZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBmaWVsZC50eXBlXG4gICAgfSkpLFxuICAgIHJvd3NcbiAgfSk7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlOiBWaXNTdGF0ZSkge1xuICBjb25zdCB0YXNrcyA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIHJldHVybiB0YXNrcy5yZWR1Y2UoKG5leHRTdGF0ZSwgdGFzaykgPT4ge1xuICAgIGlmICghU3RyaW5nKHRhc2subGFiZWwgfHwgJycpLmluY2x1ZGVzKCdDUkVBVEVfVEFCTEVfVEFTSycpKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSAoQXJyYXkuaXNBcnJheSh0YXNrLnBheWxvYWQpID8gdGFzay5wYXlsb2FkIDogW3Rhc2sucGF5bG9hZF0pLm1hcChwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiBwYXlsb2FkLmluZm8sIGNvbG9yOiBwYXlsb2FkLmNvbG9yLCAuLi5wYXlsb2FkLm9wdHN9KTtcbiAgICAgIHRhYmxlLnVwZGF0ZVNjaGVtYShwYXlsb2FkLmRhdGEpO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH0pO1xuICAgIHJldHVybiByZWR1Y2VWaXNTdGF0ZShuZXh0U3RhdGUsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlcyh0YXNrLCB0YWJsZXMpKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5kZXNjcmliZSgnZGF0YXNldCBvcHMgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICB0ZXN0KCdydW5Hcm91cEJ5IGFkZHMgYSBkZXJpdmVkIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ3dlc3QnLCAxMF0sXG4gICAgICAgIFsnd2VzdCcsIDIwXSxcbiAgICAgICAgWydlYXN0JywgNDBdXG4gICAgICBdXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcElkID0gc3RhdGUuZ3JvdXBCeXNbMF0uaWQ7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcElkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0SWQgPSBzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRJZDtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcElkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0ubWV0YWRhdGEuZGVyaXZlZERhdGFzZXQpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ2dyb3VwQnknLFxuICAgICAgc291cmNlRGF0YUlkczogWydjaXRpZXMnXSxcbiAgICAgIG9wZXJhdGlvbklkOiBvcElkXG4gICAgfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgyKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRlIHBhcmVudCBrZWVwcyBkZXJpdmVkIGNoaWxkIHNuYXBzaG90JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9IYXZlTGVuZ3RoKDIpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkR3JvdXBCeSB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW3tuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLFxuICAgICAgW1snd2VzdCddXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmdyb3VwLWJ5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkSm9pbiB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZSgnY2l0aWVzJywgW3tuYW1lOiAnaWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sIFtbJzEnXV0pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEpvaW4oJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15qb2luLWRhdGFzZXQtXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRTcGF0aWFsSm9pbkNvbmZpZyB1cGRhdGVzIHRoZSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW3tuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufV0sIFtdKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFNwYXRpYWxKb2luKCdwb2x5cycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ2ludGVyc2VjdHMnKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvQmUoYHNwYXRpYWwtam9pbi0ke3N0YXRlLmpvaW5zWzBdLnJlc3VsdElkfWApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge3ByZWRpY2F0ZTogJ3dpdGhpbid9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnd2l0aGluJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBzcGF0aWFsIGpvaW4gc291cmNlIGtlZXBzIHJlc3VsdCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0ge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFstMTAsIC0xMF0sXG4gICAgICAgICAgWzEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgMTBdLFxuICAgICAgICAgIFstMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAtMTBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9O1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKFxuICAgICAgJ3BvbHlzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCBwb2x5Z29uXV1cbiAgICApO1xuICAgIGNvbnN0IHB0cyA9IG1ha2VUYWJsZShcbiAgICAgICdwdHMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ2xhdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdsbmcnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWzAsIDAsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXMsIHB0c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtcbiAgICAgICAgcmlnaHREYXRhSWQ6ICdwdHMnLFxuICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgIHJpZ2h0R2VvOiB7a2luZDogJ2xhdGxuZycsIGxhdEZpZWxkOiAnbGF0JywgbG5nRmllbGQ6ICdsbmcnfSxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7dmFsdWU6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TcGF0aWFsSm9pbihvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncHRzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5wdHMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucG9seXMpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NhdmUvbG9hZCByb3VuZHRyaXAga2VlcHMgdGhlIGRlcml2ZWQgZGF0YXNldCBhbmQgZHJvcHMgdGhlIGZpbmlzaGVkIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnZ3JvdXBCeScpO1xuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlLmdyb3VwQnlzID8/IFtdKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzdWl0YWJpbGl0eSB2aXMtc3RhdGUnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHNpdGVTdGF0ZSgpOiBWaXNTdGF0ZSB7XG4gICAgY29uc3Qgc2l0ZXMgPSBtYWtlVGFibGUoXG4gICAgICAnc2l0ZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ25hbWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2FjY2VzcycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjb3N0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ2EnLCAwLCAwLCAwLCAxMDBdLFxuICAgICAgICBbJ2InLCAxLCAxLCA1LCAyMDBdLFxuICAgICAgICBbJ2MnLCAyLCAyLCAxMCwgMzAwXVxuICAgICAgXVxuICAgICk7XG4gICAgcmV0dXJuIHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtzaXRlc319O1xuICB9XG5cbiAgdGVzdCgnYWRkU3VpdGFiaWxpdHkgc2VlZHMgbnVtZXJpYyB3ZWlnaHRzIGFuZCBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgZXhwZWN0KG9wLndlaWdodHMpLnRvRXF1YWwoe2xhdDogMSwgbG5nOiAxLCBhY2Nlc3M6IDEsIGNvc3Q6IDF9KTtcbiAgICBleHBlY3Qob3Aud2VpZ2h0U3RhbmRhcmRpemF0aW9uKS50b0JlKCdub3JtYWxpemUnKTtcbiAgICBleHBlY3Qob3AuZGF0YVN0YW5kYXJkaXphdGlvbikudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qob3Aub3V0cHV0RmllbGROYW1lKS50b0JlKCdzY29yZScpO1xuICAgIGV4cGVjdChvcC5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXnN1aXRhYmlsaXR5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnb3BlbmluZyBhIHN1aXRhYmlsaXR5IG9wIGNsb3NlcyBhbiBvcGVuIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuU3VpdGFiaWxpdHkgYWRkcyBhIHNjb3JlZCBkYXRhc2V0IGFuZCBhIGRlZmF1bHQgbGF5ZXInLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge2FjY2VzczogMSwgY29zdDogMX19KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3QocmVzdWx0Lm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdzdWl0YWJpbGl0eScsXG4gICAgICBzb3VyY2VEYXRhSWRzOiBbJ3NpdGVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvQ29udGFpbignc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG5cbiAgICBjb25zdCBsYXllciA9IHN0YXRlLmxheWVycy5maW5kKGl0ZW0gPT4gaXRlbS5jb25maWcuZGF0YUlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgZXhwZWN0KGxheWVyKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGxheWVyPy5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVubmluZyB3aXRob3V0IGEgd2VpZ2h0ZWQgZmllbGQgc3VyZmFjZXMgYW4gZXJyb3IgaW5zdGVhZCBvZiBhIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge319KSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5lcnJvcikudG9CZSgnU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBzY29yZScpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgdGhlIHNvdXJjZSBkYXRhc2V0IGRyb3BzIHRoZSBvcCBidXQga2VlcHMgdGhlIHNjb3JlZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2l0ZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhlIG9wIGNvbmZpZyBzdGF5cyBvdXQgb2Ygc2F2ZWQgbWFwcyB3aGlsZSB0aGUgZGVyaXZlZCBkYXRhc2V0IHBlcnNpc3RzJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3VpdGFiaWxpdHkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3VpdGFiaWxpdGllcycpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdzdWl0YWJpbGl0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBRUEsSUFBQU0sU0FBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQUF1RCxTQUFBUSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENB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