@kepler.gl/reducers 3.3.0-alpha.16 → 3.3.0-alpha.18
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/column-edit-reconcile.js +100 -0
- package/dist/cjs/column-edit-updaters.spec.js +840 -0
- package/dist/cjs/combined-updaters.js +28 -9
- package/dist/cjs/dataset-ops-updaters.js +101 -15
- package/dist/cjs/dataset-ops-updaters.spec.js +129 -4
- package/dist/cjs/export-utils.js +118 -46
- package/dist/cjs/interaction-utils.js +11 -3
- package/dist/cjs/layer-utils.js +3 -2
- package/dist/cjs/ui-state-updaters.js +70 -26
- package/dist/cjs/ui-state.js +2 -2
- package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
- package/dist/cjs/vis-state-merger.js +65 -22
- package/dist/cjs/vis-state-updaters.js +811 -298
- package/dist/cjs/vis-state.js +2 -2
- package/dist/column-edit-reconcile.d.ts +4 -0
- package/dist/column-edit-updaters.spec.d.ts +1 -0
- package/dist/combined-updaters.d.ts +14 -4
- package/dist/composers.d.ts +13 -2
- package/dist/dataset-ops-updaters.d.ts +3 -0
- package/dist/esm/column-edit-reconcile.js +95 -0
- package/dist/esm/column-edit-updaters.spec.js +839 -0
- package/dist/esm/combined-updaters.js +29 -10
- package/dist/esm/dataset-ops-updaters.js +99 -16
- package/dist/esm/dataset-ops-updaters.spec.js +129 -4
- package/dist/esm/export-utils.js +117 -45
- package/dist/esm/interaction-utils.js +10 -3
- package/dist/esm/layer-utils.js +3 -2
- package/dist/esm/ui-state-updaters.js +69 -25
- package/dist/esm/ui-state.js +2 -2
- package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
- package/dist/esm/vis-state-merger.js +66 -24
- package/dist/esm/vis-state-updaters.js +801 -306
- package/dist/esm/vis-state.js +2 -2
- package/dist/export-utils.d.ts +2 -2
- package/dist/interaction-utils.d.ts +4 -1
- package/dist/layer-utils.d.ts +1 -0
- package/dist/ui-state-updaters.d.ts +10 -0
- package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
- package/dist/vis-state-merger.d.ts +10 -2
- package/dist/vis-state-updaters.d.ts +31 -9
- package/dist/vis-state.d.ts +4 -0
- package/package.json +17 -17
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
4
|
+
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; }
|
|
5
|
+
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; }
|
|
6
|
+
// SPDX-License-Identifier: MIT
|
|
7
|
+
// Copyright contributors to the kepler.gl project
|
|
8
|
+
|
|
9
|
+
import { ALL_FIELD_TYPES, ANIMATION_WINDOW, FILTER_TYPES, PLOT_TYPES, SORT_ORDER } from '@kepler.gl/constants';
|
|
10
|
+
import { VisStateActions } from '@kepler.gl/actions';
|
|
11
|
+
import { KeplerTable } from '@kepler.gl/table';
|
|
12
|
+
import SchemaManager from '@kepler.gl/schemas';
|
|
13
|
+
import { drainTasksForTesting, errorTaskInTest, succeedTaskInTest } from '@kepler.gl/tasks';
|
|
14
|
+
import visStateReducer from './vis-state';
|
|
15
|
+
import { INITIAL_VIS_STATE } from './vis-state-updaters';
|
|
16
|
+
var reduceVisState = visStateReducer;
|
|
17
|
+
function makeTable(id, data) {
|
|
18
|
+
var table = new KeplerTable({
|
|
19
|
+
info: {
|
|
20
|
+
id: id,
|
|
21
|
+
label: id,
|
|
22
|
+
type: 'local'
|
|
23
|
+
},
|
|
24
|
+
color: [0, 0, 0]
|
|
25
|
+
});
|
|
26
|
+
return table.updateSchema(data);
|
|
27
|
+
}
|
|
28
|
+
function withTables() {
|
|
29
|
+
for (var _len = arguments.length, tables = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
30
|
+
tables[_key] = arguments[_key];
|
|
31
|
+
}
|
|
32
|
+
return _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
33
|
+
datasets: Object.fromEntries(tables.map(function (table) {
|
|
34
|
+
return [table.id, table];
|
|
35
|
+
}))
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function withFilter(state, dataId, column) {
|
|
39
|
+
return reduceVisState(state, VisStateActions.createOrUpdateFilter(undefined, dataId, column));
|
|
40
|
+
}
|
|
41
|
+
function withSyncedFilter(primary, secondary, column) {
|
|
42
|
+
return reduceVisState(withFilter(withTables(primary, secondary), primary.id, column), VisStateActions.setFilter(0, ['dataId', 'name'], [secondary.id, column], 1));
|
|
43
|
+
}
|
|
44
|
+
function changeType(state, dataId, column, type) {
|
|
45
|
+
return reduceVisState(state, VisStateActions.changeTableColumnType(dataId, column, type));
|
|
46
|
+
}
|
|
47
|
+
function makeCities() {
|
|
48
|
+
var table = new KeplerTable({
|
|
49
|
+
info: {
|
|
50
|
+
id: 'cities',
|
|
51
|
+
label: 'cities',
|
|
52
|
+
type: 'local'
|
|
53
|
+
},
|
|
54
|
+
color: [0, 0, 0]
|
|
55
|
+
});
|
|
56
|
+
table.updateSchema({
|
|
57
|
+
fields: [{
|
|
58
|
+
name: 'lat',
|
|
59
|
+
type: ALL_FIELD_TYPES.real
|
|
60
|
+
}, {
|
|
61
|
+
name: 'lng',
|
|
62
|
+
type: ALL_FIELD_TYPES.real
|
|
63
|
+
}, {
|
|
64
|
+
name: 'region',
|
|
65
|
+
type: ALL_FIELD_TYPES.string
|
|
66
|
+
}, {
|
|
67
|
+
name: 'pop',
|
|
68
|
+
type: ALL_FIELD_TYPES.integer
|
|
69
|
+
}],
|
|
70
|
+
rows: [[37.7, -122.4, 'west', 10], [40.7, -74.0, 'east', 40]]
|
|
71
|
+
});
|
|
72
|
+
return table;
|
|
73
|
+
}
|
|
74
|
+
function withCities() {
|
|
75
|
+
var cities = makeCities();
|
|
76
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
77
|
+
datasets: {
|
|
78
|
+
cities: cities
|
|
79
|
+
},
|
|
80
|
+
interactionConfig: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig), {}, {
|
|
81
|
+
tooltip: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig.tooltip), {}, {
|
|
82
|
+
config: _objectSpread(_objectSpread({}, INITIAL_VIS_STATE.interactionConfig.tooltip.config), {}, {
|
|
83
|
+
fieldsToShow: {
|
|
84
|
+
cities: [{
|
|
85
|
+
name: 'region',
|
|
86
|
+
format: null
|
|
87
|
+
}]
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
state = reduceVisState(state, VisStateActions.addLayer({
|
|
94
|
+
id: 'cities-layer',
|
|
95
|
+
type: 'point',
|
|
96
|
+
config: {
|
|
97
|
+
dataId: 'cities',
|
|
98
|
+
label: 'cities',
|
|
99
|
+
color: [255, 0, 0],
|
|
100
|
+
columns: {
|
|
101
|
+
lat: 'lat',
|
|
102
|
+
lng: 'lng'
|
|
103
|
+
},
|
|
104
|
+
colorField: {
|
|
105
|
+
name: 'region',
|
|
106
|
+
type: 'string'
|
|
107
|
+
},
|
|
108
|
+
textLabel: [{
|
|
109
|
+
field: {
|
|
110
|
+
name: 'region',
|
|
111
|
+
type: 'string'
|
|
112
|
+
}
|
|
113
|
+
}]
|
|
114
|
+
}
|
|
115
|
+
}));
|
|
116
|
+
state = reduceVisState(state, VisStateActions.createOrUpdateFilter(undefined, 'cities', 'region'));
|
|
117
|
+
state = reduceVisState(state, VisStateActions.addChart({
|
|
118
|
+
id: 'region-chart',
|
|
119
|
+
title: 'Regions',
|
|
120
|
+
type: 'barChart',
|
|
121
|
+
dataId: 'cities',
|
|
122
|
+
applyFilters: true,
|
|
123
|
+
display: {},
|
|
124
|
+
chartDisplay: {},
|
|
125
|
+
xAxis: {
|
|
126
|
+
field: {
|
|
127
|
+
name: 'region',
|
|
128
|
+
type: 'string'
|
|
129
|
+
},
|
|
130
|
+
aggregation: null,
|
|
131
|
+
title: 'region'
|
|
132
|
+
},
|
|
133
|
+
yAxis: {
|
|
134
|
+
field: {
|
|
135
|
+
name: 'pop',
|
|
136
|
+
type: 'integer'
|
|
137
|
+
},
|
|
138
|
+
aggregation: 'sum',
|
|
139
|
+
title: 'Population'
|
|
140
|
+
},
|
|
141
|
+
crossFilter: {
|
|
142
|
+
enabled: false,
|
|
143
|
+
filterId: 'region-chart-filter',
|
|
144
|
+
fieldNames: {
|
|
145
|
+
xAxis: 'region'
|
|
146
|
+
},
|
|
147
|
+
value: {}
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
return state;
|
|
151
|
+
}
|
|
152
|
+
describe('column edits', function () {
|
|
153
|
+
beforeEach(function () {
|
|
154
|
+
drainTasksForTesting();
|
|
155
|
+
});
|
|
156
|
+
test('rename changes the field identity stored in layers, filters, and saved maps', function () {
|
|
157
|
+
var _layer$config$colorFi, _layer$config$textLab, _state$charts$0$xAxis, _state$charts$0$yAxis, _state$charts$0$cross, _savedVisState$layers, _savedVisState$layers2, _savedVisState$layers3, _savedVisState$charts;
|
|
158
|
+
var state = withCities();
|
|
159
|
+
state.datasets.cities.hiddenColumns = ['region', 'pop'];
|
|
160
|
+
expect(state.layers).toHaveLength(1);
|
|
161
|
+
expect(state.filters[0].name).toEqual(['region']);
|
|
162
|
+
state = reduceVisState(state, VisStateActions.renameTableColumn('cities', 'region', 'area'));
|
|
163
|
+
var region = state.datasets.cities.fields.find(function (field) {
|
|
164
|
+
return field.name === 'area';
|
|
165
|
+
});
|
|
166
|
+
expect(region === null || region === void 0 ? void 0 : region.name).toBe('area');
|
|
167
|
+
expect(region === null || region === void 0 ? void 0 : region.id).toBe('area');
|
|
168
|
+
expect(region === null || region === void 0 ? void 0 : region.displayName).toBe('area');
|
|
169
|
+
expect(state.datasets.cities.fields.map(function (field) {
|
|
170
|
+
return field.name;
|
|
171
|
+
})).toEqual(['lat', 'lng', 'area', 'pop']);
|
|
172
|
+
expect(state.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
|
|
173
|
+
var layer = state.layers[0];
|
|
174
|
+
expect(layer.config.columns.lat.value).toBe('lat');
|
|
175
|
+
expect(layer.config.columns.lng.value).toBe('lng');
|
|
176
|
+
expect((_layer$config$colorFi = layer.config.colorField) === null || _layer$config$colorFi === void 0 ? void 0 : _layer$config$colorFi.name).toBe('area');
|
|
177
|
+
expect((_layer$config$textLab = layer.config.textLabel[0].field) === null || _layer$config$textLab === void 0 ? void 0 : _layer$config$textLab.name).toBe('area');
|
|
178
|
+
expect(state.filters[0].name).toEqual(['area']);
|
|
179
|
+
expect((_state$charts$0$xAxis = state.charts[0].xAxis) === null || _state$charts$0$xAxis === void 0 || (_state$charts$0$xAxis = _state$charts$0$xAxis.field) === null || _state$charts$0$xAxis === void 0 ? void 0 : _state$charts$0$xAxis.name).toBe('area');
|
|
180
|
+
expect((_state$charts$0$yAxis = state.charts[0].yAxis) === null || _state$charts$0$yAxis === void 0 || (_state$charts$0$yAxis = _state$charts$0$yAxis.field) === null || _state$charts$0$yAxis === void 0 ? void 0 : _state$charts$0$yAxis.name).toBe('pop');
|
|
181
|
+
expect((_state$charts$0$cross = state.charts[0].crossFilter) === null || _state$charts$0$cross === void 0 ? void 0 : _state$charts$0$cross.fieldNames).toEqual({
|
|
182
|
+
xAxis: 'area'
|
|
183
|
+
});
|
|
184
|
+
expect(state.interactionConfig.tooltip.config.fieldsToShow.cities[0].name).toBe('area');
|
|
185
|
+
expect(state.datasets.cities.hiddenColumns).toEqual(['area', 'pop']);
|
|
186
|
+
var saved = SchemaManager.save({
|
|
187
|
+
visState: state,
|
|
188
|
+
mapState: {},
|
|
189
|
+
mapStyle: {},
|
|
190
|
+
uiState: {}
|
|
191
|
+
});
|
|
192
|
+
var savedVisState = saved.config.config.visState;
|
|
193
|
+
expect((_savedVisState$layers = savedVisState.layers) === null || _savedVisState$layers === void 0 || (_savedVisState$layers = _savedVisState$layers[0].visualChannels) === null || _savedVisState$layers === void 0 ? void 0 : _savedVisState$layers.colorField).toEqual({
|
|
194
|
+
name: 'area',
|
|
195
|
+
type: 'string'
|
|
196
|
+
});
|
|
197
|
+
expect((_savedVisState$layers2 = savedVisState.layers) === null || _savedVisState$layers2 === void 0 ? void 0 : _savedVisState$layers2[0].config.columns.lat).toBe('lat');
|
|
198
|
+
expect((_savedVisState$layers3 = savedVisState.layers) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].config.textLabel) === null || _savedVisState$layers3 === void 0 || (_savedVisState$layers3 = _savedVisState$layers3[0].field) === null || _savedVisState$layers3 === void 0 ? void 0 : _savedVisState$layers3.name).toBe('area');
|
|
199
|
+
expect(JSON.stringify(savedVisState.filters)).toContain('area');
|
|
200
|
+
expect(JSON.stringify(savedVisState.filters)).not.toContain('region');
|
|
201
|
+
expect((_savedVisState$charts = savedVisState.charts) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts[0].xAxis) === null || _savedVisState$charts === void 0 || (_savedVisState$charts = _savedVisState$charts.field) === null || _savedVisState$charts === void 0 ? void 0 : _savedVisState$charts.name).toBe('area');
|
|
202
|
+
});
|
|
203
|
+
test('delete drops references and refuses the last column', function () {
|
|
204
|
+
var _state$charts$0$yAxis2;
|
|
205
|
+
var state = withCities();
|
|
206
|
+
state.datasets.cities.hiddenColumns = ['region', 'pop'];
|
|
207
|
+
state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'pop'));
|
|
208
|
+
expect(state.datasets.cities.fields.map(function (field) {
|
|
209
|
+
return field.name;
|
|
210
|
+
})).toEqual(['lat', 'lng', 'region']);
|
|
211
|
+
expect(state.layers).toHaveLength(1);
|
|
212
|
+
expect(state.filters).toHaveLength(1);
|
|
213
|
+
expect((_state$charts$0$yAxis2 = state.charts[0].yAxis) === null || _state$charts$0$yAxis2 === void 0 ? void 0 : _state$charts$0$yAxis2.field).toBeNull();
|
|
214
|
+
expect(state.datasets.cities.hiddenColumns).toEqual(['region']);
|
|
215
|
+
state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'lat'));
|
|
216
|
+
expect(state.layers).toHaveLength(0);
|
|
217
|
+
expect(state.datasets.cities.fields.map(function (field) {
|
|
218
|
+
return field.name;
|
|
219
|
+
})).toEqual(['lng', 'region']);
|
|
220
|
+
var only = new KeplerTable({
|
|
221
|
+
info: {
|
|
222
|
+
id: 'only',
|
|
223
|
+
label: 'only',
|
|
224
|
+
type: 'local'
|
|
225
|
+
},
|
|
226
|
+
color: [0, 0, 0]
|
|
227
|
+
});
|
|
228
|
+
only.updateSchema({
|
|
229
|
+
fields: [{
|
|
230
|
+
name: 'region',
|
|
231
|
+
type: ALL_FIELD_TYPES.string
|
|
232
|
+
}],
|
|
233
|
+
rows: [['west']]
|
|
234
|
+
});
|
|
235
|
+
var single = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
236
|
+
datasets: {
|
|
237
|
+
only: only
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
var kept = reduceVisState(single, VisStateActions.deleteTableColumn('only', 'region'));
|
|
241
|
+
expect(kept.datasets.only.fields.map(function (field) {
|
|
242
|
+
return field.name;
|
|
243
|
+
})).toEqual(['region']);
|
|
244
|
+
});
|
|
245
|
+
test('deleting an unrelated column preserves an inverted numeric histogram', function () {
|
|
246
|
+
var table = makeTable('data', {
|
|
247
|
+
fields: [{
|
|
248
|
+
name: 'unused',
|
|
249
|
+
type: ALL_FIELD_TYPES.string
|
|
250
|
+
}, {
|
|
251
|
+
name: 'value',
|
|
252
|
+
type: ALL_FIELD_TYPES.integer
|
|
253
|
+
}, {
|
|
254
|
+
name: 'category',
|
|
255
|
+
type: ALL_FIELD_TYPES.string
|
|
256
|
+
}],
|
|
257
|
+
rows: [['x', 1, 'A'], ['x', 2, 'B'], ['x', 3, 'A']]
|
|
258
|
+
});
|
|
259
|
+
var state = withFilter(withTables(table), 'data', 'category');
|
|
260
|
+
state = reduceVisState(state, VisStateActions.setFilter(0, 'value', ['A']));
|
|
261
|
+
state = withFilter(state, 'data', 'value');
|
|
262
|
+
state = reduceVisState(state, VisStateActions.setFilter(1, 'value', [2, 2]));
|
|
263
|
+
state = reduceVisState(state, VisStateActions.setFilter(1, 'inverted', true));
|
|
264
|
+
var histogramCount = function histogramCount() {
|
|
265
|
+
var _bins;
|
|
266
|
+
return (_bins = state.filters[1].bins) === null || _bins === void 0 || (_bins = _bins.data) === null || _bins === void 0 ? void 0 : _bins.reduce(function (sum, bin) {
|
|
267
|
+
return sum + bin.count;
|
|
268
|
+
}, 0);
|
|
269
|
+
};
|
|
270
|
+
expect(histogramCount()).toBe(2);
|
|
271
|
+
state = reduceVisState(state, VisStateActions.deleteTableColumn('data', 'unused'));
|
|
272
|
+
expect(histogramCount()).toBe(2);
|
|
273
|
+
expect(state.datasets.data.filteredIndex).toEqual([0, 2]);
|
|
274
|
+
expect(state.datasets.data.fields.map(function (field) {
|
|
275
|
+
return field.type;
|
|
276
|
+
})).toEqual([ALL_FIELD_TYPES.integer, ALL_FIELD_TYPES.string]);
|
|
277
|
+
});
|
|
278
|
+
test('type change converts values and reconciles incompatible references', function () {
|
|
279
|
+
var _state$layers$find, _state$layers$find2, _state$charts$0$yAxis3;
|
|
280
|
+
var state = withCities();
|
|
281
|
+
state = reduceVisState(state, VisStateActions.addLayer({
|
|
282
|
+
id: 'cities-heatmap',
|
|
283
|
+
type: 'heatmap',
|
|
284
|
+
config: {
|
|
285
|
+
dataId: 'cities',
|
|
286
|
+
label: 'cities heatmap',
|
|
287
|
+
color: [255, 0, 0],
|
|
288
|
+
columns: {
|
|
289
|
+
lat: 'lat',
|
|
290
|
+
lng: 'lng'
|
|
291
|
+
},
|
|
292
|
+
weightField: {
|
|
293
|
+
name: 'pop',
|
|
294
|
+
type: 'integer'
|
|
295
|
+
},
|
|
296
|
+
textLabel: [{
|
|
297
|
+
field: {
|
|
298
|
+
name: 'pop',
|
|
299
|
+
type: 'integer'
|
|
300
|
+
}
|
|
301
|
+
}]
|
|
302
|
+
}
|
|
303
|
+
}));
|
|
304
|
+
state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
|
|
305
|
+
var pop = state.datasets.cities.fields.find(function (field) {
|
|
306
|
+
return field.name === 'pop';
|
|
307
|
+
});
|
|
308
|
+
expect(pop).toMatchObject({
|
|
309
|
+
type: ALL_FIELD_TYPES.string,
|
|
310
|
+
analyzerType: 'STRING',
|
|
311
|
+
format: ''
|
|
312
|
+
});
|
|
313
|
+
expect(state.datasets.cities.dataContainer.rowAsArray(0)[3]).toBe('10');
|
|
314
|
+
expect(state.layers).toHaveLength(2);
|
|
315
|
+
expect(((_state$layers$find = state.layers.find(function (layer) {
|
|
316
|
+
return layer.id === 'cities-heatmap';
|
|
317
|
+
})) === null || _state$layers$find === void 0 ? void 0 : _state$layers$find.config).weightField).toBeNull();
|
|
318
|
+
expect((_state$layers$find2 = state.layers.find(function (layer) {
|
|
319
|
+
return layer.id === 'cities-heatmap';
|
|
320
|
+
})) === null || _state$layers$find2 === void 0 ? void 0 : _state$layers$find2.config.textLabel[0].field).toMatchObject({
|
|
321
|
+
name: 'pop',
|
|
322
|
+
type: 'string'
|
|
323
|
+
});
|
|
324
|
+
expect((_state$charts$0$yAxis3 = state.charts[0].yAxis) === null || _state$charts$0$yAxis3 === void 0 ? void 0 : _state$charts$0$yAxis3.field).toEqual({
|
|
325
|
+
name: 'pop',
|
|
326
|
+
type: 'string'
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
test('type change preserves polygon filters targeting the dataset', function () {
|
|
330
|
+
var _state$datasets$citie, _state$datasets$citie2;
|
|
331
|
+
var state = withCities();
|
|
332
|
+
var polygonFilter = {
|
|
333
|
+
id: 'polygon-filter',
|
|
334
|
+
dataId: ['cities'],
|
|
335
|
+
enabled: true,
|
|
336
|
+
fixedDomain: true,
|
|
337
|
+
view: 'side',
|
|
338
|
+
isAnimating: false,
|
|
339
|
+
speed: 1,
|
|
340
|
+
name: [],
|
|
341
|
+
type: FILTER_TYPES.polygon,
|
|
342
|
+
fieldIdx: [],
|
|
343
|
+
domain: null,
|
|
344
|
+
value: {
|
|
345
|
+
type: 'Feature',
|
|
346
|
+
id: 'polygon-selection',
|
|
347
|
+
properties: {
|
|
348
|
+
filterId: 'polygon-filter'
|
|
349
|
+
},
|
|
350
|
+
geometry: {
|
|
351
|
+
type: 'Polygon',
|
|
352
|
+
coordinates: [[[-123, 37], [-122, 37], [-122, 38], [-123, 37]]]
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
plotType: {
|
|
356
|
+
type: PLOT_TYPES.histogram
|
|
357
|
+
},
|
|
358
|
+
yAxis: null,
|
|
359
|
+
layerId: ['cities-layer'],
|
|
360
|
+
gpu: false
|
|
361
|
+
};
|
|
362
|
+
state = _objectSpread(_objectSpread({}, state), {}, {
|
|
363
|
+
filters: [].concat(_toConsumableArray(state.filters), [polygonFilter])
|
|
364
|
+
});
|
|
365
|
+
state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
|
|
366
|
+
expect(state.filters.find(function (filter) {
|
|
367
|
+
return filter.id === polygonFilter.id;
|
|
368
|
+
})).toBe(polygonFilter);
|
|
369
|
+
state = reduceVisState(state, VisStateActions.deleteTableColumn('cities', 'lat'));
|
|
370
|
+
expect(state.layers).toHaveLength(0);
|
|
371
|
+
expect(state.filters.find(function (filter) {
|
|
372
|
+
return filter.id === polygonFilter.id;
|
|
373
|
+
})).toBeUndefined();
|
|
374
|
+
expect((_state$datasets$citie = state.datasets.cities.filterRecord) === null || _state$datasets$citie === void 0 ? void 0 : _state$datasets$citie.gpu).not.toContainEqual(expect.objectContaining({
|
|
375
|
+
id: polygonFilter.id
|
|
376
|
+
}));
|
|
377
|
+
expect((_state$datasets$citie2 = state.datasets.cities.filterRecord) === null || _state$datasets$citie2 === void 0 ? void 0 : _state$datasets$citie2.cpu).not.toContainEqual(expect.objectContaining({
|
|
378
|
+
id: polygonFilter.id
|
|
379
|
+
}));
|
|
380
|
+
});
|
|
381
|
+
test('type change preserves an existing sort on another column', function () {
|
|
382
|
+
var state = withCities();
|
|
383
|
+
state = reduceVisState(state, VisStateActions.sortTableColumn('cities', 'region', SORT_ORDER.ASCENDING));
|
|
384
|
+
expect(state.datasets.cities.sortColumn).toEqual({
|
|
385
|
+
region: SORT_ORDER.ASCENDING
|
|
386
|
+
});
|
|
387
|
+
expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
|
|
388
|
+
state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
|
|
389
|
+
expect(state.datasets.cities.sortColumn).toEqual({
|
|
390
|
+
region: SORT_ORDER.ASCENDING
|
|
391
|
+
});
|
|
392
|
+
expect(state.datasets.cities.sortOrder).toEqual([1, 0]);
|
|
393
|
+
});
|
|
394
|
+
test('type change clears timeline state when a time filter becomes non-time', function () {
|
|
395
|
+
var events = makeTable('events', {
|
|
396
|
+
fields: [{
|
|
397
|
+
name: 'start',
|
|
398
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
399
|
+
analyzerType: 'DATETIME'
|
|
400
|
+
}, {
|
|
401
|
+
name: 'amount',
|
|
402
|
+
type: ALL_FIELD_TYPES.integer
|
|
403
|
+
}],
|
|
404
|
+
rows: [['2024-01-01T00:00:00Z', 10], ['2024-01-02T00:00:00Z', 20]]
|
|
405
|
+
});
|
|
406
|
+
var state = withFilter(withTables(events), 'events', 'start');
|
|
407
|
+
state = _objectSpread(_objectSpread({}, state), {}, {
|
|
408
|
+
filters: [_objectSpread(_objectSpread({}, state.filters[0]), {}, {
|
|
409
|
+
syncedWithLayerTimeline: true,
|
|
410
|
+
syncTimelineMode: 1,
|
|
411
|
+
isAnimating: true,
|
|
412
|
+
animationWindow: ANIMATION_WINDOW.interval,
|
|
413
|
+
timeBins: {
|
|
414
|
+
events: {
|
|
415
|
+
day: []
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
lineChart: {
|
|
419
|
+
series: [],
|
|
420
|
+
yDomain: [0, 1],
|
|
421
|
+
xDomain: [0, 1],
|
|
422
|
+
aggregation: 'sum',
|
|
423
|
+
interval: 'day',
|
|
424
|
+
yAxis: 'amount'
|
|
425
|
+
},
|
|
426
|
+
timezone: 'UTC',
|
|
427
|
+
invertTrendColor: true,
|
|
428
|
+
showTimeDisplay: true,
|
|
429
|
+
yAxis: state.datasets.events.fields[1],
|
|
430
|
+
plotType: {
|
|
431
|
+
type: PLOT_TYPES.lineChart,
|
|
432
|
+
interval: 'day',
|
|
433
|
+
aggregation: 'sum'
|
|
434
|
+
}
|
|
435
|
+
})]
|
|
436
|
+
});
|
|
437
|
+
state = changeType(state, 'events', 'start', ALL_FIELD_TYPES.string);
|
|
438
|
+
var filter = state.filters[0];
|
|
439
|
+
expect(filter.type).toBe('multiSelect');
|
|
440
|
+
expect(filter).not.toHaveProperty('syncedWithLayerTimeline');
|
|
441
|
+
expect(filter).not.toHaveProperty('syncTimelineMode');
|
|
442
|
+
expect(filter).not.toHaveProperty('timeBins');
|
|
443
|
+
expect(filter).not.toHaveProperty('lineChart');
|
|
444
|
+
expect(filter).not.toHaveProperty('timezone');
|
|
445
|
+
expect(filter).not.toHaveProperty('invertTrendColor');
|
|
446
|
+
expect(filter).not.toHaveProperty('showTimeDisplay');
|
|
447
|
+
expect(filter).toMatchObject({
|
|
448
|
+
fixedDomain: false,
|
|
449
|
+
isAnimating: false,
|
|
450
|
+
animationWindow: ANIMATION_WINDOW.free,
|
|
451
|
+
yAxis: null,
|
|
452
|
+
plotType: {
|
|
453
|
+
type: PLOT_TYPES.histogram
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
test('type change detaches an incompatible synced filter member and refilters its dataset', function () {
|
|
458
|
+
var _state$datasets$secon;
|
|
459
|
+
var primary = makeTable('primary', {
|
|
460
|
+
fields: [{
|
|
461
|
+
name: 'value',
|
|
462
|
+
type: ALL_FIELD_TYPES.integer
|
|
463
|
+
}],
|
|
464
|
+
rows: [[1], [2]]
|
|
465
|
+
});
|
|
466
|
+
var secondary = makeTable('secondary', {
|
|
467
|
+
fields: [{
|
|
468
|
+
name: 'value',
|
|
469
|
+
type: ALL_FIELD_TYPES.integer
|
|
470
|
+
}],
|
|
471
|
+
rows: [[1], [3]]
|
|
472
|
+
});
|
|
473
|
+
var state = withSyncedFilter(primary, secondary, 'value');
|
|
474
|
+
expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
|
|
475
|
+
expect((_state$datasets$secon = state.datasets.secondary.filterRecord) === null || _state$datasets$secon === void 0 ? void 0 : _state$datasets$secon.gpu).toHaveLength(1);
|
|
476
|
+
state = changeType(state, 'secondary', 'value', ALL_FIELD_TYPES.string);
|
|
477
|
+
expect(state.filters[0].dataId).toEqual(['primary']);
|
|
478
|
+
expect(state.filters[0].name).toEqual(['value']);
|
|
479
|
+
expect(state.filters[0].type).toBe('range');
|
|
480
|
+
expect(state.datasets.secondary.filterRecord).toMatchObject({
|
|
481
|
+
dynamicDomain: [],
|
|
482
|
+
fixedDomain: [],
|
|
483
|
+
cpu: [],
|
|
484
|
+
gpu: []
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
test('changing a synced secondary dataset does not reconcile the primary plot axis', function () {
|
|
488
|
+
var makeEvents = function makeEvents(id) {
|
|
489
|
+
return makeTable(id, {
|
|
490
|
+
fields: [{
|
|
491
|
+
name: 'start',
|
|
492
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
493
|
+
analyzerType: 'TIME',
|
|
494
|
+
format: 'x'
|
|
495
|
+
}, {
|
|
496
|
+
name: 'amount',
|
|
497
|
+
type: ALL_FIELD_TYPES.integer
|
|
498
|
+
}],
|
|
499
|
+
rows: [[1700000000, 10], [1700000020, 20]]
|
|
500
|
+
});
|
|
501
|
+
};
|
|
502
|
+
var primary = makeEvents('primary');
|
|
503
|
+
var secondary = makeEvents('secondary');
|
|
504
|
+
var state = withSyncedFilter(primary, secondary, 'start');
|
|
505
|
+
state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
|
|
506
|
+
yAxis: state.datasets.primary.fields[1]
|
|
507
|
+
}));
|
|
508
|
+
state = changeType(state, 'secondary', 'amount', ALL_FIELD_TYPES.string);
|
|
509
|
+
expect(state.filters[0].dataId).toEqual(['primary', 'secondary']);
|
|
510
|
+
expect(state.filters[0].yAxis).toMatchObject({
|
|
511
|
+
name: 'amount',
|
|
512
|
+
type: 'integer'
|
|
513
|
+
});
|
|
514
|
+
expect(state.filters[0].plotType.type).toBe('lineChart');
|
|
515
|
+
});
|
|
516
|
+
test('detaching a synced primary dataset rebuilds the plot for the new primary', function () {
|
|
517
|
+
var primary = makeTable('primary', {
|
|
518
|
+
fields: [{
|
|
519
|
+
name: 'start',
|
|
520
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
521
|
+
analyzerType: 'TIME',
|
|
522
|
+
format: 'x'
|
|
523
|
+
}, {
|
|
524
|
+
name: 'amount',
|
|
525
|
+
type: ALL_FIELD_TYPES.integer
|
|
526
|
+
}],
|
|
527
|
+
rows: [[1700000000, 10], [1700000020, 20]]
|
|
528
|
+
});
|
|
529
|
+
var secondary = makeTable('secondary', {
|
|
530
|
+
fields: [{
|
|
531
|
+
name: 'start',
|
|
532
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
533
|
+
analyzerType: 'TIME',
|
|
534
|
+
format: 'x'
|
|
535
|
+
}],
|
|
536
|
+
rows: [[1700000040], [1700000060]]
|
|
537
|
+
});
|
|
538
|
+
var state = withSyncedFilter(primary, secondary, 'start');
|
|
539
|
+
state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
|
|
540
|
+
yAxis: state.datasets.primary.fields[1]
|
|
541
|
+
}));
|
|
542
|
+
expect(state.filters[0].lineChart).toBeDefined();
|
|
543
|
+
state = changeType(state, 'primary', 'start', ALL_FIELD_TYPES.string);
|
|
544
|
+
expect(state.filters[0].dataId).toEqual(['secondary']);
|
|
545
|
+
expect(state.filters[0].name).toEqual(['start']);
|
|
546
|
+
expect(state.filters[0].type).toBe('timeRange');
|
|
547
|
+
expect(state.filters[0].yAxis).toBeNull();
|
|
548
|
+
expect(state.filters[0].plotType.type).toBe('histogram');
|
|
549
|
+
expect(state.filters[0].lineChart).toBeUndefined();
|
|
550
|
+
});
|
|
551
|
+
test('grouped timeline series survive a rename and rebuild when group values collapse', function () {
|
|
552
|
+
var _state$filters$0$line, _state$filters$0$line2, _state$filters$0$line3;
|
|
553
|
+
var events = makeTable('events', {
|
|
554
|
+
fields: [{
|
|
555
|
+
name: 'start',
|
|
556
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
557
|
+
analyzerType: 'TIME',
|
|
558
|
+
format: 'x'
|
|
559
|
+
}, {
|
|
560
|
+
name: 'group',
|
|
561
|
+
type: ALL_FIELD_TYPES.string
|
|
562
|
+
}, {
|
|
563
|
+
name: 'amount',
|
|
564
|
+
type: ALL_FIELD_TYPES.integer
|
|
565
|
+
}],
|
|
566
|
+
rows: [[1700000000, '01', 10], [1700000020, '1', 20]]
|
|
567
|
+
});
|
|
568
|
+
var state = withFilter(withTables(events), 'events', 'start');
|
|
569
|
+
state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
|
|
570
|
+
yAxis: state.datasets.events.fields[2]
|
|
571
|
+
}));
|
|
572
|
+
state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
|
|
573
|
+
plotType: {
|
|
574
|
+
groupBy: {
|
|
575
|
+
fieldName: 'group',
|
|
576
|
+
numGroups: 'ALL',
|
|
577
|
+
groupOthers: false
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}));
|
|
581
|
+
var seriesBefore = (_state$filters$0$line = state.filters[0].lineChart) === null || _state$filters$0$line === void 0 ? void 0 : _state$filters$0$line.series;
|
|
582
|
+
expect(new Set(seriesBefore.names)).toEqual(new Set(['01', '1']));
|
|
583
|
+
state = reduceVisState(state, VisStateActions.renameTableColumn('events', 'group', 'category'));
|
|
584
|
+
expect((_state$filters$0$line2 = state.filters[0].lineChart) === null || _state$filters$0$line2 === void 0 ? void 0 : _state$filters$0$line2.series).toEqual(seriesBefore);
|
|
585
|
+
expect(state.filters[0].plotType.groupBy.fieldName).toBe('category');
|
|
586
|
+
expect(state.datasets.events.fields[1].type).toBe(ALL_FIELD_TYPES.string);
|
|
587
|
+
state = changeType(state, 'events', 'category', ALL_FIELD_TYPES.integer);
|
|
588
|
+
var namesAfter = ((_state$filters$0$line3 = state.filters[0].lineChart) === null || _state$filters$0$line3 === void 0 ? void 0 : _state$filters$0$line3.series).names;
|
|
589
|
+
expect(new Set(namesAfter)).toEqual(new Set(['1']));
|
|
590
|
+
});
|
|
591
|
+
test('type change clears an interval end field that is no longer a timestamp', function () {
|
|
592
|
+
var _state$filters$0$yAxi, _timeFilter$timeBins, _timeFilter$timeBins2, _state$charts$0$xAxis2;
|
|
593
|
+
var events = makeTable('events', {
|
|
594
|
+
fields: [{
|
|
595
|
+
name: 'start',
|
|
596
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
597
|
+
analyzerType: 'TIME',
|
|
598
|
+
format: 'x'
|
|
599
|
+
}, {
|
|
600
|
+
name: 'end',
|
|
601
|
+
type: ALL_FIELD_TYPES.timestamp,
|
|
602
|
+
analyzerType: 'TIME',
|
|
603
|
+
format: 'x'
|
|
604
|
+
}, {
|
|
605
|
+
name: 'value',
|
|
606
|
+
type: ALL_FIELD_TYPES.integer
|
|
607
|
+
}],
|
|
608
|
+
rows: [[1700000000, 1700086400, 10], [1700000020, 1700172800, 20]]
|
|
609
|
+
});
|
|
610
|
+
var state = withTables(events);
|
|
611
|
+
state = reduceVisState(state, VisStateActions.addChart({
|
|
612
|
+
id: 'events-chart',
|
|
613
|
+
title: 'Events',
|
|
614
|
+
type: 'barChart',
|
|
615
|
+
dataId: 'events',
|
|
616
|
+
applyFilters: true,
|
|
617
|
+
display: {},
|
|
618
|
+
chartDisplay: {},
|
|
619
|
+
xAxis: {
|
|
620
|
+
field: {
|
|
621
|
+
name: 'end',
|
|
622
|
+
type: 'timestamp'
|
|
623
|
+
},
|
|
624
|
+
aggregation: 'timeBin',
|
|
625
|
+
interval: 'day',
|
|
626
|
+
title: 'end'
|
|
627
|
+
},
|
|
628
|
+
yAxis: {
|
|
629
|
+
field: {
|
|
630
|
+
name: 'value',
|
|
631
|
+
type: 'integer'
|
|
632
|
+
},
|
|
633
|
+
aggregation: 'sum',
|
|
634
|
+
title: 'value'
|
|
635
|
+
}
|
|
636
|
+
}));
|
|
637
|
+
state = withFilter(state, 'events', 'start');
|
|
638
|
+
state = reduceVisState(state, VisStateActions.setFilter(0, 'endName', 'end', 0));
|
|
639
|
+
state = reduceVisState(state, VisStateActions.setFilterPlot(0, {
|
|
640
|
+
yAxis: state.datasets.events.fields[2]
|
|
641
|
+
}));
|
|
642
|
+
expect(state.filters[0].endName).toEqual(['end']);
|
|
643
|
+
expect((_state$filters$0$yAxi = state.filters[0].yAxis) === null || _state$filters$0$yAxi === void 0 ? void 0 : _state$filters$0$yAxi.name).toBe('value');
|
|
644
|
+
state = changeType(state, 'events', 'value', ALL_FIELD_TYPES.string);
|
|
645
|
+
expect(state.filters[0].yAxis).toBeNull();
|
|
646
|
+
expect(state.filters[0].plotType.type).toBe('histogram');
|
|
647
|
+
expect(state.filters[0].endName).toEqual(['end']);
|
|
648
|
+
expect(state.charts[0].yAxis).toMatchObject({
|
|
649
|
+
field: {
|
|
650
|
+
name: 'value',
|
|
651
|
+
type: 'string'
|
|
652
|
+
},
|
|
653
|
+
aggregation: 'sum'
|
|
654
|
+
});
|
|
655
|
+
var timeFilter = state.filters[0];
|
|
656
|
+
var interval = timeFilter.plotType.interval;
|
|
657
|
+
var intervalBins = (_timeFilter$timeBins = timeFilter.timeBins) === null || _timeFilter$timeBins === void 0 || (_timeFilter$timeBins = _timeFilter$timeBins.events) === null || _timeFilter$timeBins === void 0 ? void 0 : _timeFilter$timeBins[interval];
|
|
658
|
+
expect(intervalBins === null || intervalBins === void 0 ? void 0 : intervalBins.reduce(function (sum, bin) {
|
|
659
|
+
return sum + bin.count;
|
|
660
|
+
}, 0)).toBeGreaterThan(2);
|
|
661
|
+
state = changeType(state, 'events', 'end', ALL_FIELD_TYPES.string);
|
|
662
|
+
expect(state.filters[0].type).toBe('timeRange');
|
|
663
|
+
expect(state.filters[0].endName).toBeUndefined();
|
|
664
|
+
expect(state.filters[0].endFieldIdx).toBeUndefined();
|
|
665
|
+
timeFilter = state.filters[0];
|
|
666
|
+
var bins = (_timeFilter$timeBins2 = timeFilter.timeBins) === null || _timeFilter$timeBins2 === void 0 || (_timeFilter$timeBins2 = _timeFilter$timeBins2.events) === null || _timeFilter$timeBins2 === void 0 ? void 0 : _timeFilter$timeBins2[interval];
|
|
667
|
+
expect(bins === null || bins === void 0 ? void 0 : bins.reduce(function (sum, bin) {
|
|
668
|
+
return sum + bin.count;
|
|
669
|
+
}, 0)).toBe(2);
|
|
670
|
+
expect(state.charts[0].xAxis).toMatchObject({
|
|
671
|
+
field: {
|
|
672
|
+
name: 'end',
|
|
673
|
+
type: 'string'
|
|
674
|
+
},
|
|
675
|
+
aggregation: 'uniqueBin'
|
|
676
|
+
});
|
|
677
|
+
expect((_state$charts$0$xAxis2 = state.charts[0].xAxis) === null || _state$charts$0$xAxis2 === void 0 ? void 0 : _state$charts$0$xAxis2.interval).toBeUndefined();
|
|
678
|
+
});
|
|
679
|
+
test('invalid type change is atomic and schedules a precise error', function () {
|
|
680
|
+
var _next$datasets$cities;
|
|
681
|
+
var state = withCities();
|
|
682
|
+
var next = changeType(state, 'cities', 'region', ALL_FIELD_TYPES.integer);
|
|
683
|
+
expect(next.datasets.cities).toBe(state.datasets.cities);
|
|
684
|
+
expect((_next$datasets$cities = next.datasets.cities.fields.find(function (field) {
|
|
685
|
+
return field.name === 'region';
|
|
686
|
+
})) === null || _next$datasets$cities === void 0 ? void 0 : _next$datasets$cities.type).toBe(ALL_FIELD_TYPES.string);
|
|
687
|
+
expect(next.datasets.cities.dataContainer.rowAsArray(0)[2]).toBe('west');
|
|
688
|
+
var tasks = drainTasksForTesting();
|
|
689
|
+
expect(tasks).toHaveLength(1);
|
|
690
|
+
var notification = succeedTaskInTest(tasks[0], undefined);
|
|
691
|
+
expect(notification.payload.message).toContain('Cannot change “region” to integer: row 1 value “west” is not a safe integer');
|
|
692
|
+
expect(notification.payload.message).toContain('No values were changed.');
|
|
693
|
+
});
|
|
694
|
+
test('late column statistics cannot overwrite a changed column', function () {
|
|
695
|
+
var _state$datasets$citie3;
|
|
696
|
+
var state = withCities();
|
|
697
|
+
state = reduceVisState(state, VisStateActions.loadColumnStats('cities', 'pop'));
|
|
698
|
+
var requestRevision = state.datasets.cities.dataRevision;
|
|
699
|
+
var _drainTasksForTesting = drainTasksForTesting(),
|
|
700
|
+
_drainTasksForTesting2 = _slicedToArray(_drainTasksForTesting, 1),
|
|
701
|
+
task = _drainTasksForTesting2[0];
|
|
702
|
+
var result = {
|
|
703
|
+
type: 'numeric',
|
|
704
|
+
mean: 25
|
|
705
|
+
};
|
|
706
|
+
var staleSuccess = succeedTaskInTest(task, {
|
|
707
|
+
result: result,
|
|
708
|
+
filterProps: {
|
|
709
|
+
type: FILTER_TYPES.range
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
expect(staleSuccess).toMatchObject({
|
|
713
|
+
fieldType: ALL_FIELD_TYPES.integer
|
|
714
|
+
});
|
|
715
|
+
state = changeType(state, 'cities', 'pop', ALL_FIELD_TYPES.string);
|
|
716
|
+
expect(state.datasets.cities.dataRevision).toBe(requestRevision + 1);
|
|
717
|
+
var changedState = state;
|
|
718
|
+
state = reduceVisState(state, staleSuccess);
|
|
719
|
+
expect(state).toBe(changedState);
|
|
720
|
+
var changedField = state.datasets.cities.fields.find(function (field) {
|
|
721
|
+
return field.name === 'pop';
|
|
722
|
+
});
|
|
723
|
+
expect(changedField).toMatchObject({
|
|
724
|
+
type: ALL_FIELD_TYPES.string
|
|
725
|
+
});
|
|
726
|
+
expect(changedField).not.toHaveProperty('isLoadingStats');
|
|
727
|
+
expect((_state$datasets$citie3 = state.datasets.cities.fields.find(function (field) {
|
|
728
|
+
return field.name === 'pop';
|
|
729
|
+
})) === null || _state$datasets$citie3 === void 0 || (_state$datasets$citie3 = _state$datasets$citie3.filterProps) === null || _state$datasets$citie3 === void 0 ? void 0 : _state$datasets$citie3.columnStats).not.toBe(result);
|
|
730
|
+
});
|
|
731
|
+
test.each(['refresh', 'append'])('pending statistics complete after a normal %s', function (update) {
|
|
732
|
+
var state = withCities();
|
|
733
|
+
var types = state.datasets.cities.fields.map(function (field) {
|
|
734
|
+
return field.type;
|
|
735
|
+
});
|
|
736
|
+
state = reduceVisState(state, VisStateActions.loadColumnStats('cities', 'pop'));
|
|
737
|
+
var _drainTasksForTesting3 = drainTasksForTesting(),
|
|
738
|
+
_drainTasksForTesting4 = _slicedToArray(_drainTasksForTesting3, 1),
|
|
739
|
+
task = _drainTasksForTesting4[0];
|
|
740
|
+
state = reduceVisState(state, VisStateActions.pinTableColumn('cities', 'region'));
|
|
741
|
+
var row = [41, -75, 'north', 50];
|
|
742
|
+
state = reduceVisState(state, update === 'refresh' ? VisStateActions.refreshDatasetSuccess('cities', {
|
|
743
|
+
notModified: false,
|
|
744
|
+
data: {
|
|
745
|
+
fields: state.datasets.cities.fields,
|
|
746
|
+
rows: [row]
|
|
747
|
+
}
|
|
748
|
+
}) : VisStateActions.addToDataset('cities', [row]));
|
|
749
|
+
var result = {
|
|
750
|
+
type: 'numeric',
|
|
751
|
+
mean: 25
|
|
752
|
+
};
|
|
753
|
+
var successState = reduceVisState(state, succeedTaskInTest(task, {
|
|
754
|
+
result: result,
|
|
755
|
+
filterProps: {
|
|
756
|
+
type: FILTER_TYPES.range
|
|
757
|
+
}
|
|
758
|
+
}));
|
|
759
|
+
var logError = jest.spyOn(console, 'error').mockImplementation(function () {
|
|
760
|
+
return undefined;
|
|
761
|
+
});
|
|
762
|
+
var errorState = reduceVisState(state, errorTaskInTest(task, new Error('stats failed')));
|
|
763
|
+
logError.mockRestore();
|
|
764
|
+
expect(state.datasets.cities.fields.map(function (field) {
|
|
765
|
+
return field.type;
|
|
766
|
+
})).toEqual(types);
|
|
767
|
+
expect(successState.datasets.cities.fields[3]).toMatchObject({
|
|
768
|
+
isLoadingStats: false,
|
|
769
|
+
filterProps: {
|
|
770
|
+
columnStats: result
|
|
771
|
+
}
|
|
772
|
+
});
|
|
773
|
+
expect(errorState.datasets.cities.fields[3].isLoadingStats).toBe(false);
|
|
774
|
+
expect(state.datasets.cities.dataContainer.rowAsArray(update === 'refresh' ? 0 : 2)).toEqual(row);
|
|
775
|
+
});
|
|
776
|
+
test('duplicate rename and non-tabular datasets are ignored', function () {
|
|
777
|
+
var state = withCities();
|
|
778
|
+
var duplicate = reduceVisState(state, VisStateActions.renameTableColumn('cities', 'region', 'pop'));
|
|
779
|
+
expect(duplicate).toBe(state);
|
|
780
|
+
var tiles = new KeplerTable({
|
|
781
|
+
info: {
|
|
782
|
+
id: 'tiles',
|
|
783
|
+
label: 'tiles',
|
|
784
|
+
type: 'vector-tile'
|
|
785
|
+
},
|
|
786
|
+
color: [0, 0, 0]
|
|
787
|
+
});
|
|
788
|
+
tiles.updateSchema({
|
|
789
|
+
fields: [{
|
|
790
|
+
name: 'region',
|
|
791
|
+
type: ALL_FIELD_TYPES.string
|
|
792
|
+
}, {
|
|
793
|
+
name: 'pop',
|
|
794
|
+
type: ALL_FIELD_TYPES.integer
|
|
795
|
+
}],
|
|
796
|
+
rows: [['west', 1]]
|
|
797
|
+
});
|
|
798
|
+
var tiled = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
799
|
+
datasets: {
|
|
800
|
+
tiles: tiles
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
var unchanged = reduceVisState(tiled, VisStateActions.renameTableColumn('tiles', 'region', 'area'));
|
|
804
|
+
expect(unchanged).toBe(tiled);
|
|
805
|
+
expect(reduceVisState(tiled, VisStateActions.deleteTableColumn('tiles', 'pop'))).toBe(tiled);
|
|
806
|
+
expect(changeType(tiled, 'tiles', 'pop', ALL_FIELD_TYPES.string)).toBe(tiled);
|
|
807
|
+
});
|
|
808
|
+
test('externally hosted datasets ignore rename and delete', function () {
|
|
809
|
+
var remote = new KeplerTable({
|
|
810
|
+
info: {
|
|
811
|
+
id: 'remote',
|
|
812
|
+
label: 'remote',
|
|
813
|
+
type: 'externally-hosted'
|
|
814
|
+
},
|
|
815
|
+
color: [0, 0, 0]
|
|
816
|
+
});
|
|
817
|
+
remote.updateSchema({
|
|
818
|
+
fields: [{
|
|
819
|
+
name: 'region',
|
|
820
|
+
type: ALL_FIELD_TYPES.string,
|
|
821
|
+
displayName: 'Region'
|
|
822
|
+
}, {
|
|
823
|
+
name: 'pop',
|
|
824
|
+
type: ALL_FIELD_TYPES.integer
|
|
825
|
+
}],
|
|
826
|
+
rows: [['west', 1]]
|
|
827
|
+
});
|
|
828
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
829
|
+
datasets: {
|
|
830
|
+
remote: remote
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
expect(reduceVisState(state, VisStateActions.renameTableColumn('remote', 'region', 'area'))).toBe(state);
|
|
834
|
+
expect(reduceVisState(state, VisStateActions.deleteTableColumn('remote', 'pop'))).toBe(state);
|
|
835
|
+
expect(changeType(state, 'remote', 'pop', ALL_FIELD_TYPES.string)).toBe(state);
|
|
836
|
+
expect(state.datasets.remote.fields[0].displayName).toBe('Region');
|
|
837
|
+
});
|
|
838
|
+
});
|
|
839
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJBTklNQVRJT05fV0lORE9XIiwiRklMVEVSX1RZUEVTIiwiUExPVF9UWVBFUyIsIlNPUlRfT1JERVIiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsImVycm9yVGFza0luVGVzdCIsInN1Y2NlZWRUYXNrSW5UZXN0IiwidmlzU3RhdGVSZWR1Y2VyIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJyZWR1Y2VWaXNTdGF0ZSIsIm1ha2VUYWJsZSIsImlkIiwiZGF0YSIsInRhYmxlIiwiaW5mbyIsImxhYmVsIiwidHlwZSIsImNvbG9yIiwidXBkYXRlU2NoZW1hIiwid2l0aFRhYmxlcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ0YWJsZXMiLCJBcnJheSIsIl9rZXkiLCJfb2JqZWN0U3ByZWFkIiwiZGF0YXNldHMiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsIm1hcCIsIndpdGhGaWx0ZXIiLCJzdGF0ZSIsImRhdGFJZCIsImNvbHVtbiIsImNyZWF0ZU9yVXBkYXRlRmlsdGVyIiwidW5kZWZpbmVkIiwid2l0aFN5bmNlZEZpbHRlciIsInByaW1hcnkiLCJzZWNvbmRhcnkiLCJzZXRGaWx0ZXIiLCJjaGFuZ2VUeXBlIiwiY2hhbmdlVGFibGVDb2x1bW5UeXBlIiwibWFrZUNpdGllcyIsImZpZWxkcyIsIm5hbWUiLCJyZWFsIiwic3RyaW5nIiwiaW50ZWdlciIsInJvd3MiLCJ3aXRoQ2l0aWVzIiwiY2l0aWVzIiwiaW50ZXJhY3Rpb25Db25maWciLCJ0b29sdGlwIiwiY29uZmlnIiwiZmllbGRzVG9TaG93IiwiZm9ybWF0IiwiYWRkTGF5ZXIiLCJjb2x1bW5zIiwibGF0IiwibG5nIiwiY29sb3JGaWVsZCIsInRleHRMYWJlbCIsImZpZWxkIiwiYWRkQ2hhcnQiLCJ0aXRsZSIsImFwcGx5RmlsdGVycyIsImRpc3BsYXkiLCJjaGFydERpc3BsYXkiLCJ4QXhpcyIsImFnZ3JlZ2F0aW9uIiwieUF4aXMiLCJjcm9zc0ZpbHRlciIsImVuYWJsZWQiLCJmaWx0ZXJJZCIsImZpZWxkTmFtZXMiLCJ2YWx1ZSIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsInRlc3QiLCJfbGF5ZXIkY29uZmlnJGNvbG9yRmkiLCJfbGF5ZXIkY29uZmlnJHRleHRMYWIiLCJfc3RhdGUkY2hhcnRzJDAkeEF4aXMiLCJfc3RhdGUkY2hhcnRzJDAkeUF4aXMiLCJfc3RhdGUkY2hhcnRzJDAkY3Jvc3MiLCJfc2F2ZWRWaXNTdGF0ZSRsYXllcnMiLCJfc2F2ZWRWaXNTdGF0ZSRsYXllcnMyIiwiX3NhdmVkVmlzU3RhdGUkbGF5ZXJzMyIsIl9zYXZlZFZpc1N0YXRlJGNoYXJ0cyIsImhpZGRlbkNvbHVtbnMiLCJleHBlY3QiLCJsYXllcnMiLCJ0b0hhdmVMZW5ndGgiLCJmaWx0ZXJzIiwidG9FcXVhbCIsInJlbmFtZVRhYmxlQ29sdW1uIiwicmVnaW9uIiwiZmluZCIsInRvQmUiLCJkaXNwbGF5TmFtZSIsImRhdGFDb250YWluZXIiLCJyb3dBc0FycmF5IiwibGF5ZXIiLCJjaGFydHMiLCJzYXZlZCIsInNhdmUiLCJ2aXNTdGF0ZSIsIm1hcFN0YXRlIiwibWFwU3R5bGUiLCJ1aVN0YXRlIiwic2F2ZWRWaXNTdGF0ZSIsInZpc3VhbENoYW5uZWxzIiwiSlNPTiIsInN0cmluZ2lmeSIsInRvQ29udGFpbiIsIm5vdCIsIl9zdGF0ZSRjaGFydHMkMCR5QXhpczIiLCJkZWxldGVUYWJsZUNvbHVtbiIsInRvQmVOdWxsIiwib25seSIsInNpbmdsZSIsImtlcHQiLCJoaXN0b2dyYW1Db3VudCIsIl9iaW5zIiwiYmlucyIsInJlZHVjZSIsInN1bSIsImJpbiIsImNvdW50IiwiZmlsdGVyZWRJbmRleCIsIl9zdGF0ZSRsYXllcnMkZmluZCIsIl9zdGF0ZSRsYXllcnMkZmluZDIiLCJfc3RhdGUkY2hhcnRzJDAkeUF4aXMzIiwid2VpZ2h0RmllbGQiLCJwb3AiLCJ0b01hdGNoT2JqZWN0IiwiYW5hbHl6ZXJUeXBlIiwiX3N0YXRlJGRhdGFzZXRzJGNpdGllIiwiX3N0YXRlJGRhdGFzZXRzJGNpdGllMiIsInBvbHlnb25GaWx0ZXIiLCJmaXhlZERvbWFpbiIsInZpZXciLCJpc0FuaW1hdGluZyIsInNwZWVkIiwicG9seWdvbiIsImZpZWxkSWR4IiwiZG9tYWluIiwicHJvcGVydGllcyIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJwbG90VHlwZSIsImhpc3RvZ3JhbSIsImxheWVySWQiLCJncHUiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmaWx0ZXIiLCJ0b0JlVW5kZWZpbmVkIiwiZmlsdGVyUmVjb3JkIiwidG9Db250YWluRXF1YWwiLCJvYmplY3RDb250YWluaW5nIiwiY3B1Iiwic29ydFRhYmxlQ29sdW1uIiwiQVNDRU5ESU5HIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsImV2ZW50cyIsInRpbWVzdGFtcCIsInN5bmNlZFdpdGhMYXllclRpbWVsaW5lIiwic3luY1RpbWVsaW5lTW9kZSIsImFuaW1hdGlvbldpbmRvdyIsImludGVydmFsIiwidGltZUJpbnMiLCJkYXkiLCJsaW5lQ2hhcnQiLCJzZXJpZXMiLCJ5RG9tYWluIiwieERvbWFpbiIsInRpbWV6b25lIiwiaW52ZXJ0VHJlbmRDb2xvciIsInNob3dUaW1lRGlzcGxheSIsInRvSGF2ZVByb3BlcnR5IiwiZnJlZSIsIl9zdGF0ZSRkYXRhc2V0cyRzZWNvbiIsImR5bmFtaWNEb21haW4iLCJtYWtlRXZlbnRzIiwic2V0RmlsdGVyUGxvdCIsInRvQmVEZWZpbmVkIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lIiwiX3N0YXRlJGZpbHRlcnMkMCRsaW5lMiIsIl9zdGF0ZSRmaWx0ZXJzJDAkbGluZTMiLCJncm91cEJ5IiwiZmllbGROYW1lIiwibnVtR3JvdXBzIiwiZ3JvdXBPdGhlcnMiLCJzZXJpZXNCZWZvcmUiLCJTZXQiLCJuYW1lcyIsIm5hbWVzQWZ0ZXIiLCJfc3RhdGUkZmlsdGVycyQwJHlBeGkiLCJfdGltZUZpbHRlciR0aW1lQmlucyIsIl90aW1lRmlsdGVyJHRpbWVCaW5zMiIsIl9zdGF0ZSRjaGFydHMkMCR4QXhpczIiLCJlbmROYW1lIiwidGltZUZpbHRlciIsImludGVydmFsQmlucyIsInRvQmVHcmVhdGVyVGhhbiIsImVuZEZpZWxkSWR4IiwiX25leHQkZGF0YXNldHMkY2l0aWVzIiwibmV4dCIsInRhc2tzIiwibm90aWZpY2F0aW9uIiwicGF5bG9hZCIsIm1lc3NhZ2UiLCJfc3RhdGUkZGF0YXNldHMkY2l0aWUzIiwibG9hZENvbHVtblN0YXRzIiwicmVxdWVzdFJldmlzaW9uIiwiZGF0YVJldmlzaW9uIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nMiIsIl9zbGljZWRUb0FycmF5IiwidGFzayIsInJlc3VsdCIsIm1lYW4iLCJzdGFsZVN1Y2Nlc3MiLCJmaWx0ZXJQcm9wcyIsInJhbmdlIiwiZmllbGRUeXBlIiwiY2hhbmdlZFN0YXRlIiwiY2hhbmdlZEZpZWxkIiwiY29sdW1uU3RhdHMiLCJlYWNoIiwidXBkYXRlIiwidHlwZXMiLCJfZHJhaW5UYXNrc0ZvclRlc3RpbmczIiwiX2RyYWluVGFza3NGb3JUZXN0aW5nNCIsInBpblRhYmxlQ29sdW1uIiwicm93IiwicmVmcmVzaERhdGFzZXRTdWNjZXNzIiwibm90TW9kaWZpZWQiLCJhZGRUb0RhdGFzZXQiLCJzdWNjZXNzU3RhdGUiLCJsb2dFcnJvciIsImplc3QiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJlcnJvclN0YXRlIiwiRXJyb3IiLCJtb2NrUmVzdG9yZSIsImlzTG9hZGluZ1N0YXRzIiwiZHVwbGljYXRlIiwidGlsZXMiLCJ0aWxlZCIsInVuY2hhbmdlZCIsInJlbW90ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2x1bW4tZWRpdC11cGRhdGVycy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7XG4gIEFMTF9GSUVMRF9UWVBFUyxcbiAgQU5JTUFUSU9OX1dJTkRPVyxcbiAgRklMVEVSX1RZUEVTLFxuICBQTE9UX1RZUEVTLFxuICBTT1JUX09SREVSXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgZXJyb3JUYXNrSW5UZXN0LCBzdWNjZWVkVGFza0luVGVzdH0gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG5pbXBvcnQgdHlwZSB7UG9seWdvbkZpbHRlciwgUmFuZ2VGaWx0ZXIsIFRpbWVSYW5nZUZpbHRlcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmltcG9ydCB2aXNTdGF0ZVJlZHVjZXIgZnJvbSAnLi92aXMtc3RhdGUnO1xuaW1wb3J0IHtJTklUSUFMX1ZJU19TVEFURX0gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuXG5jb25zdCByZWR1Y2VWaXNTdGF0ZSA9IHZpc1N0YXRlUmVkdWNlciBhcyAoc3RhdGU6IFZpc1N0YXRlLCBhY3Rpb246IHVua25vd24pID0+IFZpc1N0YXRlO1xuXG5mdW5jdGlvbiBtYWtlVGFibGUoaWQ6IHN0cmluZywgZGF0YTogUGFyYW1ldGVyczxLZXBsZXJUYWJsZVsndXBkYXRlU2NoZW1hJ10+WzBdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlLnVwZGF0ZVNjaGVtYShkYXRhKTtcbn1cblxuZnVuY3Rpb24gd2l0aFRhYmxlcyguLi50YWJsZXM6IEtlcGxlclRhYmxlW10pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgZGF0YXNldHM6IE9iamVjdC5mcm9tRW50cmllcyh0YWJsZXMubWFwKHRhYmxlID0+IFt0YWJsZS5pZCwgdGFibGVdKSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2l0aEZpbHRlcihzdGF0ZTogVmlzU3RhdGUsIGRhdGFJZDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuY3JlYXRlT3JVcGRhdGVGaWx0ZXIodW5kZWZpbmVkLCBkYXRhSWQsIGNvbHVtbikpO1xufVxuXG5mdW5jdGlvbiB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnk6IEtlcGxlclRhYmxlLCBzZWNvbmRhcnk6IEtlcGxlclRhYmxlLCBjb2x1bW46IHN0cmluZyk6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHJlZHVjZVZpc1N0YXRlKFxuICAgIHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhwcmltYXJ5LCBzZWNvbmRhcnkpLCBwcmltYXJ5LmlkLCBjb2x1bW4pLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgWydkYXRhSWQnLCAnbmFtZSddLCBbc2Vjb25kYXJ5LmlkLCBjb2x1bW5dLCAxKVxuICApO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VUeXBlKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBWaXNTdGF0ZSB7XG4gIHJldHVybiByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmNoYW5nZVRhYmxlQ29sdW1uVHlwZShkYXRhSWQsIGNvbHVtbiwgdHlwZSkpO1xufVxuXG5mdW5jdGlvbiBtYWtlQ2l0aWVzKCkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkOiAnY2l0aWVzJywgbGFiZWw6ICdjaXRpZXMnLCB0eXBlOiAnbG9jYWwnfSxcbiAgICBjb2xvcjogWzAsIDAsIDBdXG4gIH0pO1xuICB0YWJsZS51cGRhdGVTY2hlbWEoe1xuICAgIGZpZWxkczogW1xuICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICB7bmFtZTogJ2xuZycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgIF0sXG4gICAgcm93czogW1xuICAgICAgWzM3LjcsIC0xMjIuNCwgJ3dlc3QnLCAxMF0sXG4gICAgICBbNDAuNywgLTc0LjAsICdlYXN0JywgNDBdXG4gICAgXVxuICB9KTtcbiAgcmV0dXJuIHRhYmxlO1xufVxuXG5mdW5jdGlvbiB3aXRoQ2l0aWVzKCk6IFZpc1N0YXRlIHtcbiAgY29uc3QgY2l0aWVzID0gbWFrZUNpdGllcygpO1xuICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgIGRhdGFzZXRzOiB7Y2l0aWVzfSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgY2l0aWVzOiBbe25hbWU6ICdyZWdpb24nLCBmb3JtYXQ6IG51bGx9XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5hZGRMYXllcih7XG4gICAgICBpZDogJ2NpdGllcy1sYXllcicsXG4gICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGRhdGFJZDogJ2NpdGllcycsXG4gICAgICAgIGxhYmVsOiAnY2l0aWVzJyxcbiAgICAgICAgY29sb3I6IFsyNTUsIDAsIDBdLFxuICAgICAgICBjb2x1bW5zOiB7bGF0OiAnbGF0JywgbG5nOiAnbG5nJ30sXG4gICAgICAgIGNvbG9yRmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9LFxuICAgICAgICB0ZXh0TGFiZWw6IFt7ZmllbGQ6IHtuYW1lOiAncmVnaW9uJywgdHlwZTogJ3N0cmluZyd9fV1cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgIHN0YXRlLFxuICAgIFZpc1N0YXRlQWN0aW9ucy5jcmVhdGVPclVwZGF0ZUZpbHRlcih1bmRlZmluZWQsICdjaXRpZXMnLCAncmVnaW9uJylcbiAgKTtcbiAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICBzdGF0ZSxcbiAgICBWaXNTdGF0ZUFjdGlvbnMuYWRkQ2hhcnQoe1xuICAgICAgaWQ6ICdyZWdpb24tY2hhcnQnLFxuICAgICAgdGl0bGU6ICdSZWdpb25zJyxcbiAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICBkYXRhSWQ6ICdjaXRpZXMnLFxuICAgICAgYXBwbHlGaWx0ZXJzOiB0cnVlLFxuICAgICAgZGlzcGxheToge30sXG4gICAgICBjaGFydERpc3BsYXk6IHt9LFxuICAgICAgeEF4aXM6IHtmaWVsZDoge25hbWU6ICdyZWdpb24nLCB0eXBlOiAnc3RyaW5nJ30sIGFnZ3JlZ2F0aW9uOiBudWxsLCB0aXRsZTogJ3JlZ2lvbid9LFxuICAgICAgeUF4aXM6IHtmaWVsZDoge25hbWU6ICdwb3AnLCB0eXBlOiAnaW50ZWdlcid9LCBhZ2dyZWdhdGlvbjogJ3N1bScsIHRpdGxlOiAnUG9wdWxhdGlvbid9LFxuICAgICAgY3Jvc3NGaWx0ZXI6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGZpbHRlcklkOiAncmVnaW9uLWNoYXJ0LWZpbHRlcicsXG4gICAgICAgIGZpZWxkTmFtZXM6IHt4QXhpczogJ3JlZ2lvbid9LFxuICAgICAgICB2YWx1ZToge31cbiAgICAgIH1cbiAgICB9KVxuICApO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmRlc2NyaWJlKCdjb2x1bW4gZWRpdHMnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlbmFtZSBjaGFuZ2VzIHRoZSBmaWVsZCBpZGVudGl0eSBzdG9yZWQgaW4gbGF5ZXJzLCBmaWx0ZXJzLCBhbmQgc2F2ZWQgbWFwcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsICdhcmVhJykpO1xuXG4gICAgY29uc3QgcmVnaW9uID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChyZWdpb24/LmlkKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHJlZ2lvbj8uZGlzcGxheU5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoW1xuICAgICAgJ2xhdCcsXG4gICAgICAnbG5nJyxcbiAgICAgICdhcmVhJyxcbiAgICAgICdwb3AnXG4gICAgXSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbMl0pLnRvQmUoJ3dlc3QnKTtcblxuICAgIGNvbnN0IGxheWVyID0gc3RhdGUubGF5ZXJzWzBdO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sYXQudmFsdWUpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sdW1ucy5sbmcudmFsdWUpLnRvQmUoJ2xuZycpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChsYXllci5jb25maWcudGV4dExhYmVsWzBdLmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubmFtZSkudG9FcXVhbChbJ2FyZWEnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcz8uZmllbGQ/Lm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZD8ubmFtZSkudG9CZSgncG9wJyk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS5jcm9zc0ZpbHRlcj8uZmllbGROYW1lcykudG9FcXVhbCh7eEF4aXM6ICdhcmVhJ30pO1xuICAgIGV4cGVjdChzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3cuY2l0aWVzWzBdLm5hbWUpLnRvQmUoJ2FyZWEnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydhcmVhJywgJ3BvcCddKTtcblxuICAgIGNvbnN0IHNhdmVkID0gU2NoZW1hTWFuYWdlci5zYXZlKHtcbiAgICAgIHZpc1N0YXRlOiBzdGF0ZSxcbiAgICAgIG1hcFN0YXRlOiB7fSxcbiAgICAgIG1hcFN0eWxlOiB7fSxcbiAgICAgIHVpU3RhdGU6IHt9XG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGU7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUubGF5ZXJzPy5bMF0udmlzdWFsQ2hhbm5lbHM/LmNvbG9yRmllbGQpLnRvRXF1YWwoe1xuICAgICAgbmFtZTogJ2FyZWEnLFxuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9KTtcbiAgICBleHBlY3Qoc2F2ZWRWaXNTdGF0ZS5sYXllcnM/LlswXS5jb25maWcuY29sdW1ucy5sYXQpLnRvQmUoJ2xhdCcpO1xuICAgIGV4cGVjdChzYXZlZFZpc1N0YXRlLmxheWVycz8uWzBdLmNvbmZpZy50ZXh0TGFiZWw/LlswXS5maWVsZD8ubmFtZSkudG9CZSgnYXJlYScpO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShzYXZlZFZpc1N0YXRlLmZpbHRlcnMpKS50b0NvbnRhaW4oJ2FyZWEnKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaXNTdGF0ZS5maWx0ZXJzKSkubm90LnRvQ29udGFpbigncmVnaW9uJyk7XG4gICAgZXhwZWN0KHNhdmVkVmlzU3RhdGUuY2hhcnRzPy5bMF0ueEF4aXM/LmZpZWxkPy5uYW1lKS50b0JlKCdhcmVhJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBkcm9wcyByZWZlcmVuY2VzIGFuZCByZWZ1c2VzIHRoZSBsYXN0IGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMgPSBbJ3JlZ2lvbicsICdwb3AnXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdwb3AnKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvRXF1YWwoWydsYXQnLCAnbG5nJywgJ3JlZ2lvbiddKTtcbiAgICBleHBlY3Qoc3RhdGUubGF5ZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnlBeGlzPy5maWVsZCkudG9CZU51bGwoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmhpZGRlbkNvbHVtbnMpLnRvRXF1YWwoWydyZWdpb24nXSk7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2NpdGllcycsICdsYXQnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ2xuZycsICdyZWdpb24nXSk7XG5cbiAgICBjb25zdCBvbmx5ID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICAgIGluZm86IHtpZDogJ29ubHknLCBsYWJlbDogJ29ubHknLCB0eXBlOiAnbG9jYWwnfSxcbiAgICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgICB9KTtcbiAgICBvbmx5LnVwZGF0ZVNjaGVtYSh7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnXV1cbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge29ubHl9fTtcbiAgICBjb25zdCBrZXB0ID0gcmVkdWNlVmlzU3RhdGUoc2luZ2xlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ29ubHknLCAncmVnaW9uJykpO1xuICAgIGV4cGVjdChrZXB0LmRhdGFzZXRzLm9ubHkuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKSkudG9FcXVhbChbJ3JlZ2lvbiddKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgYW4gdW5yZWxhdGVkIGNvbHVtbiBwcmVzZXJ2ZXMgYW4gaW52ZXJ0ZWQgbnVtZXJpYyBoaXN0b2dyYW0nLCAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBtYWtlVGFibGUoJ2RhdGEnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICd1bnVzZWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICd2YWx1ZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjYXRlZ29yeScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XG4gICAgICBdLFxuICAgICAgcm93czogW1xuICAgICAgICBbJ3gnLCAxLCAnQSddLFxuICAgICAgICBbJ3gnLCAyLCAnQiddLFxuICAgICAgICBbJ3gnLCAzLCAnQSddXG4gICAgICBdXG4gICAgfSk7XG4gICAgbGV0IHN0YXRlID0gd2l0aEZpbHRlcih3aXRoVGFibGVzKHRhYmxlKSwgJ2RhdGEnLCAnY2F0ZWdvcnknKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICd2YWx1ZScsIFsnQSddKSk7XG4gICAgc3RhdGUgPSB3aXRoRmlsdGVyKHN0YXRlLCAnZGF0YScsICd2YWx1ZScpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMSwgJ3ZhbHVlJywgWzIsIDJdKSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlcigxLCAnaW52ZXJ0ZWQnLCB0cnVlKSk7XG4gICAgY29uc3QgaGlzdG9ncmFtQ291bnQgPSAoKSA9PlxuICAgICAgKHN0YXRlLmZpbHRlcnNbMV0gYXMgUmFuZ2VGaWx0ZXIpLmJpbnM/LmRhdGE/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCk7XG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuZGVsZXRlVGFibGVDb2x1bW4oJ2RhdGEnLCAndW51c2VkJykpO1xuXG4gICAgZXhwZWN0KGhpc3RvZ3JhbUNvdW50KCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmRhdGEuZmlsdGVyZWRJbmRleCkudG9FcXVhbChbMCwgMl0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5kYXRhLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQudHlwZSkpLnRvRXF1YWwoW1xuICAgICAgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIsXG4gICAgICBBTExfRklFTERfVFlQRVMuc3RyaW5nXG4gICAgXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNvbnZlcnRzIHZhbHVlcyBhbmQgcmVjb25jaWxlcyBpbmNvbXBhdGlibGUgcmVmZXJlbmNlcycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZExheWVyKHtcbiAgICAgICAgaWQ6ICdjaXRpZXMtaGVhdG1hcCcsXG4gICAgICAgIHR5cGU6ICdoZWF0bWFwJyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgZGF0YUlkOiAnY2l0aWVzJyxcbiAgICAgICAgICBsYWJlbDogJ2NpdGllcyBoZWF0bWFwJyxcbiAgICAgICAgICBjb2xvcjogWzI1NSwgMCwgMF0sXG4gICAgICAgICAgY29sdW1uczoge2xhdDogJ2xhdCcsIGxuZzogJ2xuZyd9LFxuICAgICAgICAgIHdlaWdodEZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ30sXG4gICAgICAgICAgdGV4dExhYmVsOiBbe2ZpZWxkOiB7bmFtZTogJ3BvcCcsIHR5cGU6ICdpbnRlZ2VyJ319XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgcG9wID0gc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09ICdwb3AnKTtcbiAgICBleHBlY3QocG9wKS50b01hdGNoT2JqZWN0KHt0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nLCBhbmFseXplclR5cGU6ICdTVFJJTkcnLCBmb3JtYXQ6ICcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMClbM10pLnRvQmUoJzEwJyk7XG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIGV4cGVjdChcbiAgICAgIChzdGF0ZS5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gJ2NpdGllcy1oZWF0bWFwJyk/LmNvbmZpZyBhcyB7d2VpZ2h0RmllbGQ/OiB1bmtub3dufSlcbiAgICAgICAgLndlaWdodEZpZWxkXG4gICAgKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChcbiAgICAgIHN0YXRlLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSAnY2l0aWVzLWhlYXRtYXAnKT8uY29uZmlnLnRleHRMYWJlbFswXS5maWVsZFxuICAgICkudG9NYXRjaE9iamVjdCh7bmFtZTogJ3BvcCcsIHR5cGU6ICdzdHJpbmcnfSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcz8uZmllbGQpLnRvRXF1YWwoe25hbWU6ICdwb3AnLCB0eXBlOiAnc3RyaW5nJ30pO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgcG9seWdvbiBmaWx0ZXJzIHRhcmdldGluZyB0aGUgZGF0YXNldCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgY29uc3QgcG9seWdvbkZpbHRlcjogUG9seWdvbkZpbHRlciA9IHtcbiAgICAgIGlkOiAncG9seWdvbi1maWx0ZXInLFxuICAgICAgZGF0YUlkOiBbJ2NpdGllcyddLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZpeGVkRG9tYWluOiB0cnVlLFxuICAgICAgdmlldzogJ3NpZGUnLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgc3BlZWQ6IDEsXG4gICAgICBuYW1lOiBbXSxcbiAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5wb2x5Z29uLFxuICAgICAgZmllbGRJZHg6IFtdLFxuICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogJ3BvbHlnb24tc2VsZWN0aW9uJyxcbiAgICAgICAgcHJvcGVydGllczoge2ZpbHRlcklkOiAncG9seWdvbi1maWx0ZXInfSxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM3XSxcbiAgICAgICAgICAgICAgWy0xMjIsIDM4XSxcbiAgICAgICAgICAgICAgWy0xMjMsIDM3XVxuICAgICAgICAgICAgXVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19LFxuICAgICAgeUF4aXM6IG51bGwsXG4gICAgICBsYXllcklkOiBbJ2NpdGllcy1sYXllciddLFxuICAgICAgZ3B1OiBmYWxzZVxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHsuLi5zdGF0ZSwgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIHBvbHlnb25GaWx0ZXJdfTtcbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdjaXRpZXMnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIuaWQgPT09IHBvbHlnb25GaWx0ZXIuaWQpKS50b0JlKHBvbHlnb25GaWx0ZXIpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmRlbGV0ZVRhYmxlQ29sdW1uKCdjaXRpZXMnLCAnbGF0JykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmxheWVycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzLmZpbmQoZmlsdGVyID0+IGZpbHRlci5pZCA9PT0gcG9seWdvbkZpbHRlci5pZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmZpbHRlclJlY29yZD8uZ3B1KS5ub3QudG9Db250YWluRXF1YWwoXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7aWQ6IHBvbHlnb25GaWx0ZXIuaWR9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWx0ZXJSZWNvcmQ/LmNwdSkubm90LnRvQ29udGFpbkVxdWFsKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe2lkOiBwb2x5Z29uRmlsdGVyLmlkfSlcbiAgICApO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBwcmVzZXJ2ZXMgYW4gZXhpc3Rpbmcgc29ydCBvbiBhbm90aGVyIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNvcnRUYWJsZUNvbHVtbignY2l0aWVzJywgJ3JlZ2lvbicsIFNPUlRfT1JERVIuQVNDRU5ESU5HKVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0Q29sdW1uKS50b0VxdWFsKHtyZWdpb246IFNPUlRfT1JERVIuQVNDRU5ESU5HfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcy5zb3J0T3JkZXIpLnRvRXF1YWwoWzEsIDBdKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdwb3AnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydENvbHVtbikudG9FcXVhbCh7cmVnaW9uOiBTT1JUX09SREVSLkFTQ0VORElOR30pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuc29ydE9yZGVyKS50b0VxdWFsKFsxLCAwXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGNsZWFycyB0aW1lbGluZSBzdGF0ZSB3aGVuIGEgdGltZSBmaWx0ZXIgYmVjb21lcyBub24tdGltZScsICgpID0+IHtcbiAgICBjb25zdCBldmVudHMgPSBtYWtlVGFibGUoJ2V2ZW50cycsIHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3N0YXJ0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCwgYW5hbHl6ZXJUeXBlOiAnREFURVRJTUUnfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsnMjAyNC0wMS0wMVQwMDowMDowMFonLCAxMF0sXG4gICAgICAgIFsnMjAyNC0wMS0wMlQwMDowMDowMFonLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoRmlsdGVyKHdpdGhUYWJsZXMoZXZlbnRzKSwgJ2V2ZW50cycsICdzdGFydCcpO1xuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4oc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXIpLFxuICAgICAgICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiB0cnVlLFxuICAgICAgICAgIHN5bmNUaW1lbGluZU1vZGU6IDEgYXMgY29uc3QsXG4gICAgICAgICAgaXNBbmltYXRpbmc6IHRydWUsXG4gICAgICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmludGVydmFsLFxuICAgICAgICAgIHRpbWVCaW5zOiB7ZXZlbnRzOiB7ZGF5OiBbXX19LFxuICAgICAgICAgIGxpbmVDaGFydDoge1xuICAgICAgICAgICAgc2VyaWVzOiBbXSxcbiAgICAgICAgICAgIHlEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIHhEb21haW46IFswLCAxXSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgICAgICAgICAgIGludGVydmFsOiAnZGF5JyxcbiAgICAgICAgICAgIHlBeGlzOiAnYW1vdW50J1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZXpvbmU6ICdVVEMnLFxuICAgICAgICAgIGludmVydFRyZW5kQ29sb3I6IHRydWUsXG4gICAgICAgICAgc2hvd1RpbWVEaXNwbGF5OiB0cnVlLFxuICAgICAgICAgIHlBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzFdLFxuICAgICAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5saW5lQ2hhcnQsIGludGVydmFsOiAnZGF5JywgYWdncmVnYXRpb246ICdzdW0nfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICdzdGFydCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXTtcbiAgICBleHBlY3QoZmlsdGVyLnR5cGUpLnRvQmUoJ211bHRpU2VsZWN0Jyk7XG4gICAgZXhwZWN0KGZpbHRlcikubm90LnRvSGF2ZVByb3BlcnR5KCdzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3luY1RpbWVsaW5lTW9kZScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZUJpbnMnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2xpbmVDaGFydCcpO1xuICAgIGV4cGVjdChmaWx0ZXIpLm5vdC50b0hhdmVQcm9wZXJ0eSgndGltZXpvbmUnKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ2ludmVydFRyZW5kQ29sb3InKTtcbiAgICBleHBlY3QoZmlsdGVyKS5ub3QudG9IYXZlUHJvcGVydHkoJ3Nob3dUaW1lRGlzcGxheScpO1xuICAgIGV4cGVjdChmaWx0ZXIpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZml4ZWREb21haW46IGZhbHNlLFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmZyZWUsXG4gICAgICB5QXhpczogbnVsbCxcbiAgICAgIHBsb3RUeXBlOiB7dHlwZTogUExPVF9UWVBFUy5oaXN0b2dyYW19XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3R5cGUgY2hhbmdlIGRldGFjaGVzIGFuIGluY29tcGF0aWJsZSBzeW5jZWQgZmlsdGVyIG1lbWJlciBhbmQgcmVmaWx0ZXJzIGl0cyBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IHByaW1hcnkgPSBtYWtlVGFibGUoJ3ByaW1hcnknLCB7XG4gICAgICBmaWVsZHM6IFt7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XSxcbiAgICAgIHJvd3M6IFtbMV0sIFsyXV1cbiAgICB9KTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlVGFibGUoJ3NlY29uZGFyeScsIHtcbiAgICAgIGZpZWxkczogW3tuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1dLFxuICAgICAgcm93czogW1sxXSwgWzNdXVxuICAgIH0pO1xuXG4gICAgbGV0IHN0YXRlID0gd2l0aFN5bmNlZEZpbHRlcihwcmltYXJ5LCBzZWNvbmRhcnksICd2YWx1ZScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5zZWNvbmRhcnkuZmlsdGVyUmVjb3JkPy5ncHUpLnRvSGF2ZUxlbmd0aCgxKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZGF0YUlkKS50b0VxdWFsKFsncHJpbWFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsndmFsdWUnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2Vjb25kYXJ5LmZpbHRlclJlY29yZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBkeW5hbWljRG9tYWluOiBbXSxcbiAgICAgIGZpeGVkRG9tYWluOiBbXSxcbiAgICAgIGNwdTogW10sXG4gICAgICBncHU6IFtdXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NoYW5naW5nIGEgc3luY2VkIHNlY29uZGFyeSBkYXRhc2V0IGRvZXMgbm90IHJlY29uY2lsZSB0aGUgcHJpbWFyeSBwbG90IGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFrZUV2ZW50cyA9IChpZDogc3RyaW5nKSA9PlxuICAgICAgbWFrZVRhYmxlKGlkLCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICAgIHtuYW1lOiAnYW1vdW50JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICAgIF0sXG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICBbMV83MDBfMDAwXzAwMCwgMTBdLFxuICAgICAgICAgIFsxXzcwMF8wMDBfMDIwLCAyMF1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJpbWFyeSA9IG1ha2VFdmVudHMoJ3ByaW1hcnknKTtcbiAgICBjb25zdCBzZWNvbmRhcnkgPSBtYWtlRXZlbnRzKCdzZWNvbmRhcnknKTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoU3luY2VkRmlsdGVyKHByaW1hcnksIHNlY29uZGFyeSwgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5wcmltYXJ5LmZpZWxkc1sxXX0pXG4gICAgKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3NlY29uZGFyeScsICdhbW91bnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b01hdGNoT2JqZWN0KHtuYW1lOiAnYW1vdW50JywgdHlwZTogJ2ludGVnZXInfSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnbGluZUNoYXJ0Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RldGFjaGluZyBhIHN5bmNlZCBwcmltYXJ5IGRhdGFzZXQgcmVidWlsZHMgdGhlIHBsb3QgZm9yIHRoZSBuZXcgcHJpbWFyeScsICgpID0+IHtcbiAgICBjb25zdCBwcmltYXJ5ID0gbWFrZVRhYmxlKCdwcmltYXJ5Jywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2Ftb3VudCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtcbiAgICAgICAgWzFfNzAwXzAwMF8wMDAsIDEwXSxcbiAgICAgICAgWzFfNzAwXzAwMF8wMjAsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHNlY29uZGFyeSA9IG1ha2VUYWJsZSgnc2Vjb25kYXJ5Jywge1xuICAgICAgZmllbGRzOiBbe25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J31dLFxuICAgICAgcm93czogW1sxXzcwMF8wMDBfMDQwXSwgWzFfNzAwXzAwMF8wNjBdXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhTeW5jZWRGaWx0ZXIocHJpbWFyeSwgc2Vjb25kYXJ5LCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLnByaW1hcnkuZmllbGRzWzFdfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydCkudG9CZURlZmluZWQoKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ3ByaW1hcnknLCAnc3RhcnQnLCBBTExfRklFTERfVFlQRVMuc3RyaW5nKTtcblxuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmRhdGFJZCkudG9FcXVhbChbJ3NlY29uZGFyeSddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5uYW1lKS50b0VxdWFsKFsnc3RhcnQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ueUF4aXMpLnRvQmVOdWxsKCk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ucGxvdFR5cGUudHlwZSkudG9CZSgnaGlzdG9ncmFtJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0KS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyb3VwZWQgdGltZWxpbmUgc2VyaWVzIHN1cnZpdmUgYSByZW5hbWUgYW5kIHJlYnVpbGQgd2hlbiBncm91cCB2YWx1ZXMgY29sbGFwc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgZXZlbnRzID0gbWFrZVRhYmxlKCdldmVudHMnLCB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge25hbWU6ICdzdGFydCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAnZ3JvdXAnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdhbW91bnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAnMDEnLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAnMScsIDIwXVxuICAgICAgXVxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IHdpdGhGaWx0ZXIod2l0aFRhYmxlcyhldmVudHMpLCAnZXZlbnRzJywgJ3N0YXJ0Jyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlclBsb3QoMCwge3lBeGlzOiBzdGF0ZS5kYXRhc2V0cy5ldmVudHMuZmllbGRzWzJdfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJQbG90KDAsIHtcbiAgICAgICAgcGxvdFR5cGU6IHtncm91cEJ5OiB7ZmllbGROYW1lOiAnZ3JvdXAnLCBudW1Hcm91cHM6ICdBTEwnLCBncm91cE90aGVyczogZmFsc2V9fVxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHNlcmllc0JlZm9yZSA9IHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMgYXMge25hbWVzPzogc3RyaW5nW119O1xuICAgIGV4cGVjdChuZXcgU2V0KHNlcmllc0JlZm9yZS5uYW1lcykpLnRvRXF1YWwobmV3IFNldChbJzAxJywgJzEnXSkpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCdldmVudHMnLCAnZ3JvdXAnLCAnY2F0ZWdvcnknKSk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0ubGluZUNoYXJ0Py5zZXJpZXMpLnRvRXF1YWwoc2VyaWVzQmVmb3JlKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS5wbG90VHlwZS5ncm91cEJ5LmZpZWxkTmFtZSkudG9CZSgnY2F0ZWdvcnknKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuZXZlbnRzLmZpZWxkc1sxXS50eXBlKS50b0JlKEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnZXZlbnRzJywgJ2NhdGVnb3J5JywgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXIpO1xuXG4gICAgY29uc3QgbmFtZXNBZnRlciA9IChzdGF0ZS5maWx0ZXJzWzBdLmxpbmVDaGFydD8uc2VyaWVzIGFzIHtuYW1lcz86IHN0cmluZ1tdfSkubmFtZXM7XG4gICAgZXhwZWN0KG5ldyBTZXQobmFtZXNBZnRlcikpLnRvRXF1YWwobmV3IFNldChbJzEnXSkpO1xuICB9KTtcblxuICB0ZXN0KCd0eXBlIGNoYW5nZSBjbGVhcnMgYW4gaW50ZXJ2YWwgZW5kIGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIGEgdGltZXN0YW1wJywgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50cyA9IG1ha2VUYWJsZSgnZXZlbnRzJywge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wLCBhbmFseXplclR5cGU6ICdUSU1FJywgZm9ybWF0OiAneCd9LFxuICAgICAgICB7bmFtZTogJ2VuZCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAsIGFuYWx5emVyVHlwZTogJ1RJTUUnLCBmb3JtYXQ6ICd4J30sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbXG4gICAgICAgIFsxXzcwMF8wMDBfMDAwLCAxXzcwMF8wODZfNDAwLCAxMF0sXG4gICAgICAgIFsxXzcwMF8wMDBfMDIwLCAxXzcwMF8xNzJfODAwLCAyMF1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB3aXRoVGFibGVzKGV2ZW50cyk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLmFkZENoYXJ0KHtcbiAgICAgICAgaWQ6ICdldmVudHMtY2hhcnQnLFxuICAgICAgICB0aXRsZTogJ0V2ZW50cycsXG4gICAgICAgIHR5cGU6ICdiYXJDaGFydCcsXG4gICAgICAgIGRhdGFJZDogJ2V2ZW50cycsXG4gICAgICAgIGFwcGx5RmlsdGVyczogdHJ1ZSxcbiAgICAgICAgZGlzcGxheToge30sXG4gICAgICAgIGNoYXJ0RGlzcGxheToge30sXG4gICAgICAgIHhBeGlzOiB7XG4gICAgICAgICAgZmllbGQ6IHtuYW1lOiAnZW5kJywgdHlwZTogJ3RpbWVzdGFtcCd9LFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiAndGltZUJpbicsXG4gICAgICAgICAgaW50ZXJ2YWw6ICdkYXknLFxuICAgICAgICAgIHRpdGxlOiAnZW5kJ1xuICAgICAgICB9LFxuICAgICAgICB5QXhpczoge2ZpZWxkOiB7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ2ludGVnZXInfSwgYWdncmVnYXRpb246ICdzdW0nLCB0aXRsZTogJ3ZhbHVlJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHdpdGhGaWx0ZXIoc3RhdGUsICdldmVudHMnLCAnc3RhcnQnKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICdlbmROYW1lJywgJ2VuZCcsIDApKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyUGxvdCgwLCB7eUF4aXM6IHN0YXRlLmRhdGFzZXRzLmV2ZW50cy5maWVsZHNbMl19KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9FcXVhbChbJ2VuZCddKTtcbiAgICBleHBlY3Qoc3RhdGUuZmlsdGVyc1swXS55QXhpcz8ubmFtZSkudG9CZSgndmFsdWUnKTtcblxuICAgIHN0YXRlID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2V2ZW50cycsICd2YWx1ZScsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnlBeGlzKS50b0JlTnVsbCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLnBsb3RUeXBlLnR5cGUpLnRvQmUoJ2hpc3RvZ3JhbScpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZE5hbWUpLnRvRXF1YWwoWydlbmQnXSk7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS55QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICd2YWx1ZScsIHR5cGU6ICdzdHJpbmcnfSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJ1xuICAgIH0pO1xuICAgIGxldCB0aW1lRmlsdGVyID0gc3RhdGUuZmlsdGVyc1swXSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSB0aW1lRmlsdGVyLnBsb3RUeXBlLmludGVydmFsO1xuICAgIGNvbnN0IGludGVydmFsQmlucyA9IHRpbWVGaWx0ZXIudGltZUJpbnM/LmV2ZW50cz8uW2ludGVydmFsXTtcbiAgICBleHBlY3QoaW50ZXJ2YWxCaW5zPy5yZWR1Y2UoKHN1bSwgYmluKSA9PiBzdW0gKyBiaW4uY291bnQsIDApKS50b0JlR3JlYXRlclRoYW4oMik7XG5cbiAgICBzdGF0ZSA9IGNoYW5nZVR5cGUoc3RhdGUsICdldmVudHMnLCAnZW5kJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0udHlwZSkudG9CZSgndGltZVJhbmdlJyk7XG4gICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZW5kTmFtZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5maWx0ZXJzWzBdLmVuZEZpZWxkSWR4KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgdGltZUZpbHRlciA9IHN0YXRlLmZpbHRlcnNbMF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IGJpbnMgPSB0aW1lRmlsdGVyLnRpbWVCaW5zPy5ldmVudHM/LltpbnRlcnZhbF07XG4gICAgZXhwZWN0KGJpbnM/LnJlZHVjZSgoc3VtLCBiaW4pID0+IHN1bSArIGJpbi5jb3VudCwgMCkpLnRvQmUoMik7XG4gICAgZXhwZWN0KHN0YXRlLmNoYXJ0c1swXS54QXhpcykudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWVsZDoge25hbWU6ICdlbmQnLCB0eXBlOiAnc3RyaW5nJ30sXG4gICAgICBhZ2dyZWdhdGlvbjogJ3VuaXF1ZUJpbidcbiAgICB9KTtcbiAgICBleHBlY3Qoc3RhdGUuY2hhcnRzWzBdLnhBeGlzPy5pbnRlcnZhbCkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCdpbnZhbGlkIHR5cGUgY2hhbmdlIGlzIGF0b21pYyBhbmQgc2NoZWR1bGVzIGEgcHJlY2lzZSBlcnJvcicsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCBuZXh0ID0gY2hhbmdlVHlwZShzdGF0ZSwgJ2NpdGllcycsICdyZWdpb24nLCBBTExfRklFTERfVFlQRVMuaW50ZWdlcik7XG5cbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMpLnRvQmUoc3RhdGUuZGF0YXNldHMuY2l0aWVzKTtcbiAgICBleHBlY3QobmV4dC5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3JlZ2lvbicpPy50eXBlKS50b0JlKFxuICAgICAgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ1xuICAgICk7XG4gICAgZXhwZWN0KG5leHQuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSgwKVsyXSkudG9CZSgnd2VzdCcpO1xuXG4gICAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICAgIGV4cGVjdCh0YXNrcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2tzWzBdLCB1bmRlZmluZWQpO1xuICAgIGV4cGVjdChub3RpZmljYXRpb24ucGF5bG9hZC5tZXNzYWdlKS50b0NvbnRhaW4oXG4gICAgICAnQ2Fubm90IGNoYW5nZSDigJxyZWdpb27igJ0gdG8gaW50ZWdlcjogcm93IDEgdmFsdWUg4oCcd2VzdOKAnSBpcyBub3QgYSBzYWZlIGludGVnZXInXG4gICAgKTtcbiAgICBleHBlY3Qobm90aWZpY2F0aW9uLnBheWxvYWQubWVzc2FnZSkudG9Db250YWluKCdObyB2YWx1ZXMgd2VyZSBjaGFuZ2VkLicpO1xuICB9KTtcblxuICB0ZXN0KCdsYXRlIGNvbHVtbiBzdGF0aXN0aWNzIGNhbm5vdCBvdmVyd3JpdGUgYSBjaGFuZ2VkIGNvbHVtbicsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB3aXRoQ2l0aWVzKCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmxvYWRDb2x1bW5TdGF0cygnY2l0aWVzJywgJ3BvcCcpKTtcbiAgICBjb25zdCByZXF1ZXN0UmV2aXNpb24gPSBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uO1xuICAgIGNvbnN0IFt0YXNrXSA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gICAgY29uc3QgcmVzdWx0ID0ge3R5cGU6ICdudW1lcmljJywgbWVhbjogMjV9O1xuICAgIGNvbnN0IHN0YWxlU3VjY2VzcyA9IHN1Y2NlZWRUYXNrSW5UZXN0KHRhc2ssIHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIGZpbHRlclByb3BzOiB7dHlwZTogRklMVEVSX1RZUEVTLnJhbmdlfVxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFsZVN1Y2Nlc3MpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgZmllbGRUeXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlclxuICAgIH0pO1xuXG4gICAgc3RhdGUgPSBjaGFuZ2VUeXBlKHN0YXRlLCAnY2l0aWVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZGF0YVJldmlzaW9uKS50b0JlKHJlcXVlc3RSZXZpc2lvbiArIDEpO1xuICAgIGNvbnN0IGNoYW5nZWRTdGF0ZSA9IHN0YXRlO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgc3RhbGVTdWNjZXNzKTtcblxuICAgIGV4cGVjdChzdGF0ZSkudG9CZShjaGFuZ2VkU3RhdGUpO1xuICAgIGNvbnN0IGNoYW5nZWRGaWVsZCA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lID09PSAncG9wJyk7XG4gICAgZXhwZWN0KGNoYW5nZWRGaWVsZCkudG9NYXRjaE9iamVjdCh7dHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30pO1xuICAgIGV4cGVjdChjaGFuZ2VkRmllbGQpLm5vdC50b0hhdmVQcm9wZXJ0eSgnaXNMb2FkaW5nU3RhdHMnKTtcbiAgICBleHBlY3QoXG4gICAgICBzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gJ3BvcCcpPy5maWx0ZXJQcm9wcz8uY29sdW1uU3RhdHNcbiAgICApLm5vdC50b0JlKHJlc3VsdCk7XG4gIH0pO1xuXG4gIHRlc3QuZWFjaChbJ3JlZnJlc2gnLCAnYXBwZW5kJ10pKCdwZW5kaW5nIHN0YXRpc3RpY3MgY29tcGxldGUgYWZ0ZXIgYSBub3JtYWwgJXMnLCB1cGRhdGUgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHdpdGhDaXRpZXMoKTtcbiAgICBjb25zdCB0eXBlcyA9IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLnR5cGUpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5sb2FkQ29sdW1uU3RhdHMoJ2NpdGllcycsICdwb3AnKSk7XG4gICAgY29uc3QgW3Rhc2tdID0gZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucGluVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nKSk7XG4gICAgY29uc3Qgcm93ID0gWzQxLCAtNzUsICdub3J0aCcsIDUwXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICB1cGRhdGUgPT09ICdyZWZyZXNoJ1xuICAgICAgICA/IFZpc1N0YXRlQWN0aW9ucy5yZWZyZXNoRGF0YXNldFN1Y2Nlc3MoJ2NpdGllcycsIHtcbiAgICAgICAgICAgIG5vdE1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGE6IHtmaWVsZHM6IHN0YXRlLmRhdGFzZXRzLmNpdGllcy5maWVsZHMsIHJvd3M6IFtyb3ddfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogVmlzU3RhdGVBY3Rpb25zLmFkZFRvRGF0YXNldCgnY2l0aWVzJywgW3Jvd10pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt0eXBlOiAnbnVtZXJpYycsIG1lYW46IDI1fTtcbiAgICBjb25zdCBzdWNjZXNzU3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgc3VjY2VlZFRhc2tJblRlc3QodGFzaywge3Jlc3VsdCwgZmlsdGVyUHJvcHM6IHt0eXBlOiBGSUxURVJfVFlQRVMucmFuZ2V9fSlcbiAgICApO1xuICAgIGNvbnN0IGxvZ0Vycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCAnZXJyb3InKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlcnJvclN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIGVycm9yVGFza0luVGVzdCh0YXNrLCBuZXcgRXJyb3IoJ3N0YXRzIGZhaWxlZCcpKSk7XG4gICAgbG9nRXJyb3IubW9ja1Jlc3RvcmUoKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC50eXBlKSkudG9FcXVhbCh0eXBlcyk7XG4gICAgZXhwZWN0KHN1Y2Nlc3NTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGlzTG9hZGluZ1N0YXRzOiBmYWxzZSxcbiAgICAgIGZpbHRlclByb3BzOiB7Y29sdW1uU3RhdHM6IHJlc3VsdH1cbiAgICB9KTtcbiAgICBleHBlY3QoZXJyb3JTdGF0ZS5kYXRhc2V0cy5jaXRpZXMuZmllbGRzWzNdLmlzTG9hZGluZ1N0YXRzKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzLmRhdGFDb250YWluZXIucm93QXNBcnJheSh1cGRhdGUgPT09ICdyZWZyZXNoJyA/IDAgOiAyKSkudG9FcXVhbChcbiAgICAgIHJvd1xuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2R1cGxpY2F0ZSByZW5hbWUgYW5kIG5vbi10YWJ1bGFyIGRhdGFzZXRzIGFyZSBpZ25vcmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gd2l0aENpdGllcygpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMucmVuYW1lVGFibGVDb2x1bW4oJ2NpdGllcycsICdyZWdpb24nLCAncG9wJylcbiAgICApO1xuICAgIGV4cGVjdChkdXBsaWNhdGUpLnRvQmUoc3RhdGUpO1xuXG4gICAgY29uc3QgdGlsZXMgPSBuZXcgS2VwbGVyVGFibGUoe1xuICAgICAgaW5mbzoge2lkOiAndGlsZXMnLCBsYWJlbDogJ3RpbGVzJywgdHlwZTogJ3ZlY3Rvci10aWxlJ30sXG4gICAgICBjb2xvcjogWzAsIDAsIDBdXG4gICAgfSk7XG4gICAgdGlsZXMudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIHJvd3M6IFtbJ3dlc3QnLCAxXV1cbiAgICB9KTtcbiAgICBjb25zdCB0aWxlZDogVmlzU3RhdGUgPSB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7dGlsZXN9fTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHRpbGVkLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnJlbmFtZVRhYmxlQ29sdW1uKCd0aWxlcycsICdyZWdpb24nLCAnYXJlYScpXG4gICAgKTtcbiAgICBleHBlY3QodW5jaGFuZ2VkKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUodGlsZWQsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigndGlsZXMnLCAncG9wJykpKS50b0JlKHRpbGVkKTtcbiAgICBleHBlY3QoY2hhbmdlVHlwZSh0aWxlZCwgJ3RpbGVzJywgJ3BvcCcsIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpKS50b0JlKHRpbGVkKTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZXJuYWxseSBob3N0ZWQgZGF0YXNldHMgaWdub3JlIHJlbmFtZSBhbmQgZGVsZXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlbW90ZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgICBpbmZvOiB7aWQ6ICdyZW1vdGUnLCBsYWJlbDogJ3JlbW90ZScsIHR5cGU6ICdleHRlcm5hbGx5LWhvc3RlZCd9LFxuICAgICAgY29sb3I6IFswLCAwLCAwXVxuICAgIH0pO1xuICAgIHJlbW90ZS51cGRhdGVTY2hlbWEoe1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZywgZGlzcGxheU5hbWU6ICdSZWdpb24nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICByb3dzOiBbWyd3ZXN0JywgMV1dXG4gICAgfSk7XG4gICAgY29uc3Qgc3RhdGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge3JlbW90ZX19O1xuXG4gICAgZXhwZWN0KFxuICAgICAgcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW5hbWVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3JlZ2lvbicsICdhcmVhJykpXG4gICAgKS50b0JlKHN0YXRlKTtcbiAgICBleHBlY3QocmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5kZWxldGVUYWJsZUNvbHVtbigncmVtb3RlJywgJ3BvcCcpKSkudG9CZShzdGF0ZSk7XG4gICAgZXhwZWN0KGNoYW5nZVR5cGUoc3RhdGUsICdyZW1vdGUnLCAncG9wJywgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZykpLnRvQmUoc3RhdGUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5yZW1vdGUuZmllbGRzWzBdLmRpc3BsYXlOYW1lKS50b0JlKCdSZWdpb24nKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQ0VBLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsVUFBVSxRQUNMLHNCQUFzQjtBQUM3QixTQUFRQyxlQUFlLFFBQU8sb0JBQW9CO0FBQ2xELFNBQVFDLFdBQVcsUUFBTyxrQkFBa0I7QUFDNUMsT0FBT0MsYUFBYSxNQUFrQixvQkFBb0I7QUFDMUQsU0FBUUMsb0JBQW9CLEVBQUVDLGVBQWUsRUFBRUMsaUJBQWlCLFFBQU8sa0JBQWtCO0FBR3pGLE9BQU9DLGVBQWUsTUFBTSxhQUFhO0FBQ3pDLFNBQVFDLGlCQUFpQixRQUFPLHNCQUFzQjtBQUV0RCxJQUFNQyxjQUFjLEdBQUdGLGVBQWlFO0FBRXhGLFNBQVNHLFNBQVNBLENBQUNDLEVBQVUsRUFBRUMsSUFBZ0QsRUFBRTtFQUMvRSxJQUFNQyxLQUFLLEdBQUcsSUFBSVgsV0FBVyxDQUFDO0lBQzVCWSxJQUFJLEVBQUU7TUFBQ0gsRUFBRSxFQUFGQSxFQUFFO01BQUVJLEtBQUssRUFBRUosRUFBRTtNQUFFSyxJQUFJLEVBQUU7SUFBTyxDQUFDO0lBQ3BDQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDakIsQ0FBQyxDQUFDO0VBQ0YsT0FBT0osS0FBSyxDQUFDSyxZQUFZLENBQUNOLElBQUksQ0FBQztBQUNqQztBQUVBLFNBQVNPLFVBQVVBLENBQUEsRUFBcUM7RUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxFQUFqQ0MsTUFBTSxPQUFBQyxLQUFBLENBQUFKLElBQUEsR0FBQUssSUFBQSxNQUFBQSxJQUFBLEdBQUFMLElBQUEsRUFBQUssSUFBQTtJQUFORixNQUFNLENBQUFFLElBQUEsSUFBQUosU0FBQSxDQUFBSSxJQUFBO0VBQUE7RUFDM0IsT0FB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
|