@kepler.gl/reducers 3.3.0-alpha.18 → 3.3.0-alpha.19

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.
@@ -1,4 +1,10 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
1
3
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
5
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
2
8
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
9
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
10
  // SPDX-License-Identifier: MIT
@@ -7,8 +13,17 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
7
13
  import { ALL_FIELD_TYPES } from '@kepler.gl/constants';
8
14
  import { VisStateActions } from '@kepler.gl/actions';
9
15
  import { KeplerTable } from '@kepler.gl/table';
16
+ import { arrowSchemaToFields, processArrowTable, processCsvData, processFileData, processGeojson, processKeplerglJSON } from '@kepler.gl/processors';
17
+ import { convertGeometryToWKB } from '@loaders.gl/gis';
18
+ import * as arrow from 'apache-arrow';
19
+ import GeoJsonLayer from '../../layers/src/geojson-layer/geojson-layer';
20
+ import { datasetSchema, VERSIONS } from '@kepler.gl/schemas';
21
+ import { datasetToFeatureCollection } from '../../processors/src/export/dataset-to-geojson';
22
+ import { Int64, Table, vectorFromArray } from 'apache-arrow';
23
+ import { exportMapToHTML, exportToJsonString, validateInputData } from '@kepler.gl/utils';
10
24
  import SchemaManager from '@kepler.gl/schemas';
11
25
  import { drainTasksForTesting, succeedTaskWithValues } from '@kepler.gl/tasks';
26
+ import { Response } from 'node-fetch';
12
27
  import visStateReducer from './vis-state';
13
28
  import { INITIAL_VIS_STATE } from './vis-state-updaters';
14
29
  var reduceVisState = visStateReducer;
@@ -51,6 +66,13 @@ function flushCreateTableTasks(state) {
51
66
  }, state);
52
67
  }
53
68
  describe('dataset ops vis-state', function () {
69
+ var originalResponse = globalThis.Response;
70
+ beforeAll(function () {
71
+ globalThis.Response = Response;
72
+ });
73
+ afterAll(function () {
74
+ globalThis.Response = originalResponse;
75
+ });
54
76
  beforeEach(function () {
55
77
  drainTasksForTesting();
56
78
  });
@@ -88,6 +110,124 @@ describe('dataset ops vis-state', function () {
88
110
  });
89
111
  expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
90
112
  });
113
+ test.each([false, true])('joined BigInts filter and save after source removal (mixed: %s)', function (mixed) {
114
+ var arrow = new Table({
115
+ key: vectorFromArray(['a', 'b', null]),
116
+ pop: vectorFromArray([10n, 20n, null], new Int64())
117
+ });
118
+ var arrowData = processArrowTable({
119
+ shape: 'arrow-table',
120
+ data: arrow
121
+ });
122
+ if (!arrowData) throw new Error('Invalid Arrow fixture');
123
+ var left = new KeplerTable({
124
+ info: {
125
+ id: 'left'
126
+ },
127
+ color: [0, 0, 0]
128
+ }).updateSchema(mixed ? {
129
+ fields: arrowData.fields,
130
+ rows: [['a', 10n], ['b', 20], [null, 0.5]]
131
+ } : arrowData);
132
+ var right = makeTable('right', [{
133
+ name: 'key',
134
+ type: 'string'
135
+ }], [['a'], ['b']]);
136
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
137
+ datasets: {
138
+ left: left,
139
+ right: right
140
+ }
141
+ });
142
+ state = reduceVisState(state, VisStateActions.addJoin('left'));
143
+ var op = state.joins[0];
144
+ state = reduceVisState(state, VisStateActions.setJoinConfig(op.id, {
145
+ rightDataId: 'right',
146
+ leftField: 'key',
147
+ rightField: 'key',
148
+ rightColumns: []
149
+ }));
150
+ state = flushCreateTableTasks(reduceVisState(state, VisStateActions.runJoin(op.id)));
151
+ state = reduceVisState(state, VisStateActions.addFilter(op.resultId));
152
+ state = reduceVisState(state, VisStateActions.setFilter(0, 'name', 'pop'));
153
+ expect(state.filters[0].domain).toEqual([10, 20]);
154
+ state = reduceVisState(state, VisStateActions.setFilter(0, 'gpu', false));
155
+ state = reduceVisState(state, VisStateActions.setFilter(0, 'value', [15, 20]));
156
+ expect(state.datasets[op.resultId].filteredIndex).toEqual([1]);
157
+ for (var _i = 0, _arr = [false, true]; _i < _arr.length; _i++) {
158
+ var _exportMapToHTML$matc, _processKeplerglJSON, _reloaded$getColumnFi;
159
+ var removeSources = _arr[_i];
160
+ if (removeSources) {
161
+ state = reduceVisState(state, VisStateActions.removeDataset('left'));
162
+ state = reduceVisState(state, VisStateActions.removeDataset('right'));
163
+ expect(Object.keys(state.datasets)).toEqual([op.resultId]);
164
+ }
165
+ var saved = SchemaManager.save({
166
+ visState: state
167
+ });
168
+ var json = JSON.parse(exportToJsonString(saved));
169
+ var embedded = JSON.parse(((_exportMapToHTML$matc = exportMapToHTML(saved).match(/const datasets = (.*);/)) === null || _exportMapToHTML$matc === void 0 ? void 0 : _exportMapToHTML$matc[1]) || '');
170
+ expect(embedded).toEqual(json.datasets);
171
+ var parsed = (_processKeplerglJSON = processKeplerglJSON(json)) === null || _processKeplerglJSON === void 0 || (_processKeplerglJSON = _processKeplerglJSON.datasets) === null || _processKeplerglJSON === void 0 ? void 0 : _processKeplerglJSON.find(function (dataset) {
172
+ return dataset.info.id === op.resultId;
173
+ });
174
+ if (!parsed) throw new Error('Missing derived dataset after reload');
175
+ var data = validateInputData(parsed.data);
176
+ if (!data) throw new Error('Invalid derived dataset after reload');
177
+ var reloaded = new KeplerTable({
178
+ info: parsed.info,
179
+ metadata: parsed.metadata,
180
+ color: [0, 0, 0]
181
+ }).updateSchema(data);
182
+ expect((_reloaded$getColumnFi = reloaded.getColumnFilterProps('pop')) === null || _reloaded$getColumnFi === void 0 ? void 0 : _reloaded$getColumnFi.domain).toEqual([10, 20]);
183
+ expect(reloaded.dataContainer.flattenData()).toEqual([['a', 10], ['b', 20], [null, null]]);
184
+ expect(state.datasets[op.resultId].dataContainer.flattenData()).toEqual([['a', 10n], ['b', 20n], [null, null]]);
185
+ }
186
+ expect([0, 1, 2].map(function (index) {
187
+ var _arrow$getChild;
188
+ return (_arrow$getChild = arrow.getChild('pop')) === null || _arrow$getChild === void 0 ? void 0 : _arrow$getChild.get(index);
189
+ })).toEqual([10n, 20n, null]);
190
+ expect([0, 1, 2].map(function (index) {
191
+ return left.dataContainer.valueAt(index, 1);
192
+ })).toEqual(mixed ? [10n, 20, 0.5] : [10n, 20n, null]);
193
+ });
194
+ test.each(['minimum', 'maximum'])('runGroupBy selects chronological %s from recognized CSV timestamps', function (technique) {
195
+ var december = '12/31/2025 10:00:00';
196
+ var january = '01/01/2026 10:00:00';
197
+ var data = processCsvData("group,time\nwest,".concat(december, "\nwest,").concat(january, "\neast,").concat(january, "\neast,").concat(december, "\nmissing,"));
198
+ if (!data) throw new Error('CSV import failed');
199
+ expect(data.fields[1]).toMatchObject({
200
+ type: 'timestamp',
201
+ format: 'M/D/YYYY H:m:s'
202
+ });
203
+ var times = makeTable('times', [], []);
204
+ times.updateSchema(data);
205
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
206
+ datasets: {
207
+ times: times
208
+ }
209
+ });
210
+ state = reduceVisState(state, VisStateActions.addGroupBy('times'));
211
+ var op = state.groupBys[0];
212
+ state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
213
+ fieldName: 'group',
214
+ aggregations: {
215
+ time: technique
216
+ }
217
+ }));
218
+ state = flushCreateTableTasks(reduceVisState(state, VisStateActions.runGroupBy(op.id)));
219
+ var result = state.datasets[op.resultId];
220
+ var expected = technique === 'minimum' ? december : january;
221
+ expect(result.dataContainer.getPlainIndex().map(function (i) {
222
+ return result.dataContainer.rowAsArray(i);
223
+ })).toEqual([['west', expected], ['east', expected], ['missing', null]]);
224
+ expect(result.fields[1]).toMatchObject({
225
+ type: 'timestamp',
226
+ format: data.fields[1].format
227
+ });
228
+ expect(times.dataContainer.valueAt(0, 1)).toBe(december);
229
+ expect(times.dataContainer.valueAt(1, 1)).toBe(january);
230
+ });
91
231
  test('delete parent keeps derived child snapshot', function () {
92
232
  var cities = makeTable('cities', [{
93
233
  name: 'region',
@@ -163,6 +303,50 @@ describe('dataset ops vis-state', function () {
163
303
  }));
164
304
  expect(state.joins[0].predicate).toBe('within');
165
305
  });
306
+ test('spatial joins imported WKT after repeated runs and source reloads without changing it', function () {
307
+ var polygon = 'POLYGON ((-10 -10, 10 -10, 10 10, -10 10, -10 -10))';
308
+ var polys = makeTable('polys', [], []);
309
+ var pts = makeTable('pts', [], []);
310
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
311
+ datasets: {
312
+ polys: polys,
313
+ pts: pts
314
+ }
315
+ });
316
+ for (var _i2 = 0, _arr2 = [0, 0, 30]; _i2 < _arr2.length; _i2++) {
317
+ var lng = _arr2[_i2];
318
+ var polygonData = processCsvData("geom\n\"".concat(polygon, "\""));
319
+ var point = "POINT (".concat(lng, " 0)");
320
+ var pointData = processCsvData("geom,value\n\"".concat(point, "\",10"));
321
+ if (!polygonData || !pointData) throw new Error('WKT CSV import failed');
322
+ polys.updateSchema(polygonData);
323
+ pts.updateSchema(pointData);
324
+ expect(polys.fields[0].type).toBe(ALL_FIELD_TYPES.geojson);
325
+ expect(pts.fields[0].type).toBe(ALL_FIELD_TYPES.geojson);
326
+ state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
327
+ var op = state.joins[0];
328
+ state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
329
+ rightDataId: 'pts',
330
+ leftGeo: {
331
+ kind: 'geojson',
332
+ fieldName: 'geom'
333
+ },
334
+ rightGeo: {
335
+ kind: 'geojson',
336
+ fieldName: 'geom'
337
+ },
338
+ aggregations: {
339
+ value: 'sum'
340
+ }
341
+ }));
342
+ state = reduceVisState(state, VisStateActions.runSpatialJoin(op.id));
343
+ state = flushCreateTableTasks(state);
344
+ expect(state.joins).toHaveLength(0);
345
+ expect(state.datasets[op.resultId].dataContainer.rowAsArray(0)).toEqual([polygon, lng === 0 ? 1 : 0, lng === 0 ? 10 : null]);
346
+ expect(polys.dataContainer.valueAt(0, 0)).toBe(polygon);
347
+ expect(pts.dataContainer.valueAt(0, 0)).toBe(point);
348
+ }
349
+ });
166
350
  test('delete spatial join source keeps result snapshot', function () {
167
351
  var polygon = {
168
352
  type: 'Polygon',
@@ -378,4 +562,649 @@ describe('suitability vis-state', function () {
378
562
  expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD2 = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD2 === void 0 ? void 0 : _derivedMeta$derivedD2.type).toBe('suitability');
379
563
  });
380
564
  });
381
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsInZpc1N0YXRlUmVkdWNlciIsIklOSVRJQUxfVklTX1NUQVRFIiwicmVkdWNlVmlzU3RhdGUiLCJtYWtlVGFibGUiLCJpZCIsImZpZWxkcyIsInJvd3MiLCJ0YWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJyZWR1Y2UiLCJuZXh0U3RhdGUiLCJ0YXNrIiwiU3RyaW5nIiwiaW5jbHVkZXMiLCJ0YWJsZXMiLCJBcnJheSIsImlzQXJyYXkiLCJwYXlsb2FkIiwiX29iamVjdFNwcmVhZCIsIm9wdHMiLCJkYXRhIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwidGVzdCIsImNpdGllcyIsInN0cmluZyIsImludGVnZXIiLCJkYXRhc2V0cyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicmVzdWx0SWQiLCJydW5Hcm91cEJ5IiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJPYmplY3QiLCJrZXlzIiwicmVtb3ZlRGF0YXNldCIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJhZGRKb2luIiwiam9pbnMiLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsImNvbmNhdCIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsImNvb3JkaW5hdGVzIiwicHRzIiwicmVhbCIsInJpZ2h0RGF0YUlkIiwibGVmdEdlbyIsImtpbmQiLCJyaWdodEdlbyIsImxhdEZpZWxkIiwibG5nRmllbGQiLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiX2Rlcml2ZWRNZXRhJGRlcml2ZWREIiwiX3NhdmVkJGNvbmZpZyRjb25maWckIiwic2F2ZWQiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwibG5nIiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJyZXN1bHQiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBTY2hlbWFNYW5hZ2VyLCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2RyYWluVGFza3NGb3JUZXN0aW5nLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuXG5pbXBvcnQgdmlzU3RhdGVSZWR1Y2VyIGZyb20gJy4vdmlzLXN0YXRlJztcbmltcG9ydCB7SU5JVElBTF9WSVNfU1RBVEV9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcblxuY29uc3QgcmVkdWNlVmlzU3RhdGUgPSB2aXNTdGF0ZVJlZHVjZXIgYXMgKHN0YXRlOiBWaXNTdGF0ZSwgYWN0aW9uOiB1bmtub3duKSA9PiBWaXNTdGF0ZTtcblxuZnVuY3Rpb24gbWFrZVRhYmxlKGlkOiBzdHJpbmcsIGZpZWxkczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nfVtdLCByb3dzOiBhbnlbXVtdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgdGFibGUudXBkYXRlU2NoZW1hKHtcbiAgICBmaWVsZHM6IGZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBmaWVsZC50eXBlXG4gICAgfSkpLFxuICAgIHJvd3NcbiAgfSk7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlOiBWaXNTdGF0ZSkge1xuICBjb25zdCB0YXNrcyA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIHJldHVybiB0YXNrcy5yZWR1Y2UoKG5leHRTdGF0ZSwgdGFzaykgPT4ge1xuICAgIGlmICghU3RyaW5nKHRhc2subGFiZWwgfHwgJycpLmluY2x1ZGVzKCdDUkVBVEVfVEFCTEVfVEFTSycpKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSAoQXJyYXkuaXNBcnJheSh0YXNrLnBheWxvYWQpID8gdGFzay5wYXlsb2FkIDogW3Rhc2sucGF5bG9hZF0pLm1hcChwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiBwYXlsb2FkLmluZm8sIGNvbG9yOiBwYXlsb2FkLmNvbG9yLCAuLi5wYXlsb2FkLm9wdHN9KTtcbiAgICAgIHRhYmxlLnVwZGF0ZVNjaGVtYShwYXlsb2FkLmRhdGEpO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH0pO1xuICAgIHJldHVybiByZWR1Y2VWaXNTdGF0ZShuZXh0U3RhdGUsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlcyh0YXNrLCB0YWJsZXMpKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5kZXNjcmliZSgnZGF0YXNldCBvcHMgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICB0ZXN0KCdydW5Hcm91cEJ5IGFkZHMgYSBkZXJpdmVkIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ3dlc3QnLCAxMF0sXG4gICAgICAgIFsnd2VzdCcsIDIwXSxcbiAgICAgICAgWydlYXN0JywgNDBdXG4gICAgICBdXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcElkID0gc3RhdGUuZ3JvdXBCeXNbMF0uaWQ7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcElkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0SWQgPSBzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRJZDtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcElkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0ubWV0YWRhdGEuZGVyaXZlZERhdGFzZXQpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ2dyb3VwQnknLFxuICAgICAgc291cmNlRGF0YUlkczogWydjaXRpZXMnXSxcbiAgICAgIG9wZXJhdGlvbklkOiBvcElkXG4gICAgfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgyKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRlIHBhcmVudCBrZWVwcyBkZXJpdmVkIGNoaWxkIHNuYXBzaG90JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9IYXZlTGVuZ3RoKDIpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkR3JvdXBCeSB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW3tuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLFxuICAgICAgW1snd2VzdCddXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmdyb3VwLWJ5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkSm9pbiB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZSgnY2l0aWVzJywgW3tuYW1lOiAnaWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sIFtbJzEnXV0pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEpvaW4oJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15qb2luLWRhdGFzZXQtXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRTcGF0aWFsSm9pbkNvbmZpZyB1cGRhdGVzIHRoZSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW3tuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufV0sIFtdKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFNwYXRpYWxKb2luKCdwb2x5cycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ2ludGVyc2VjdHMnKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvQmUoYHNwYXRpYWwtam9pbi0ke3N0YXRlLmpvaW5zWzBdLnJlc3VsdElkfWApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge3ByZWRpY2F0ZTogJ3dpdGhpbid9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnd2l0aGluJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBzcGF0aWFsIGpvaW4gc291cmNlIGtlZXBzIHJlc3VsdCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0ge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFstMTAsIC0xMF0sXG4gICAgICAgICAgWzEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgMTBdLFxuICAgICAgICAgIFstMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAtMTBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9O1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKFxuICAgICAgJ3BvbHlzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCBwb2x5Z29uXV1cbiAgICApO1xuICAgIGNvbnN0IHB0cyA9IG1ha2VUYWJsZShcbiAgICAgICdwdHMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ2xhdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdsbmcnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWzAsIDAsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXMsIHB0c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtcbiAgICAgICAgcmlnaHREYXRhSWQ6ICdwdHMnLFxuICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgIHJpZ2h0R2VvOiB7a2luZDogJ2xhdGxuZycsIGxhdEZpZWxkOiAnbGF0JywgbG5nRmllbGQ6ICdsbmcnfSxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7dmFsdWU6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TcGF0aWFsSm9pbihvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncHRzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5wdHMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucG9seXMpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NhdmUvbG9hZCByb3VuZHRyaXAga2VlcHMgdGhlIGRlcml2ZWQgZGF0YXNldCBhbmQgZHJvcHMgdGhlIGZpbmlzaGVkIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnZ3JvdXBCeScpO1xuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlLmdyb3VwQnlzID8/IFtdKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzdWl0YWJpbGl0eSB2aXMtc3RhdGUnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHNpdGVTdGF0ZSgpOiBWaXNTdGF0ZSB7XG4gICAgY29uc3Qgc2l0ZXMgPSBtYWtlVGFibGUoXG4gICAgICAnc2l0ZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ25hbWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2FjY2VzcycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjb3N0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ2EnLCAwLCAwLCAwLCAxMDBdLFxuICAgICAgICBbJ2InLCAxLCAxLCA1LCAyMDBdLFxuICAgICAgICBbJ2MnLCAyLCAyLCAxMCwgMzAwXVxuICAgICAgXVxuICAgICk7XG4gICAgcmV0dXJuIHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtzaXRlc319O1xuICB9XG5cbiAgdGVzdCgnYWRkU3VpdGFiaWxpdHkgc2VlZHMgbnVtZXJpYyB3ZWlnaHRzIGFuZCBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgZXhwZWN0KG9wLndlaWdodHMpLnRvRXF1YWwoe2xhdDogMSwgbG5nOiAxLCBhY2Nlc3M6IDEsIGNvc3Q6IDF9KTtcbiAgICBleHBlY3Qob3Aud2VpZ2h0U3RhbmRhcmRpemF0aW9uKS50b0JlKCdub3JtYWxpemUnKTtcbiAgICBleHBlY3Qob3AuZGF0YVN0YW5kYXJkaXphdGlvbikudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qob3Aub3V0cHV0RmllbGROYW1lKS50b0JlKCdzY29yZScpO1xuICAgIGV4cGVjdChvcC5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXnN1aXRhYmlsaXR5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnb3BlbmluZyBhIHN1aXRhYmlsaXR5IG9wIGNsb3NlcyBhbiBvcGVuIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuU3VpdGFiaWxpdHkgYWRkcyBhIHNjb3JlZCBkYXRhc2V0IGFuZCBhIGRlZmF1bHQgbGF5ZXInLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge2FjY2VzczogMSwgY29zdDogMX19KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3QocmVzdWx0Lm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdzdWl0YWJpbGl0eScsXG4gICAgICBzb3VyY2VEYXRhSWRzOiBbJ3NpdGVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvQ29udGFpbignc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG5cbiAgICBjb25zdCBsYXllciA9IHN0YXRlLmxheWVycy5maW5kKGl0ZW0gPT4gaXRlbS5jb25maWcuZGF0YUlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgZXhwZWN0KGxheWVyKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGxheWVyPy5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVubmluZyB3aXRob3V0IGEgd2VpZ2h0ZWQgZmllbGQgc3VyZmFjZXMgYW4gZXJyb3IgaW5zdGVhZCBvZiBhIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge319KSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5lcnJvcikudG9CZSgnU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBzY29yZScpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgdGhlIHNvdXJjZSBkYXRhc2V0IGRyb3BzIHRoZSBvcCBidXQga2VlcHMgdGhlIHNjb3JlZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2l0ZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhlIG9wIGNvbmZpZyBzdGF5cyBvdXQgb2Ygc2F2ZWQgbWFwcyB3aGlsZSB0aGUgZGVyaXZlZCBkYXRhc2V0IHBlcnNpc3RzJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3VpdGFiaWxpdHkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3VpdGFiaWxpdGllcycpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdzdWl0YWJpbGl0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVDLE9BQU9DLGFBQWEsTUFBa0Isb0JBQW9C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
565
+ describe('native GeoArrow attribute joins', function () {
566
+ var metadataKey = 'ARROW:extension:name';
567
+ var point = function point(x) {
568
+ return {
569
+ type: 'Point',
570
+ coordinates: [x, x + 1]
571
+ };
572
+ };
573
+ var multi = function multi(x) {
574
+ return {
575
+ type: 'MultiPoint',
576
+ coordinates: [[x, x + 1], [x + 2, x + 3]]
577
+ };
578
+ };
579
+ var pointType = new arrow.FixedSizeList(2, new arrow.Field('xy', new arrow.Float64(), false));
580
+ var list = function list(type) {
581
+ return new arrow.List(new arrow.Field('item', type, true));
582
+ };
583
+ var originalResponse = globalThis.Response;
584
+ beforeAll(function () {
585
+ globalThis.Response = Response;
586
+ });
587
+ afterAll(function () {
588
+ globalThis.Response = originalResponse;
589
+ });
590
+ beforeEach(function () {
591
+ drainTasksForTesting();
592
+ });
593
+ function nativeSource(_x, _x2, _x3, _x4) {
594
+ return _nativeSource.apply(this, arguments);
595
+ }
596
+ function _nativeSource() {
597
+ _nativeSource = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee0(id, encoding, type, coordinates) {
598
+ var keys,
599
+ input,
600
+ decoded,
601
+ _yield$processFileDat3,
602
+ _yield$processFileDat4,
603
+ file,
604
+ dataset,
605
+ _args0 = arguments;
606
+ return _regeneratorRuntime.wrap(function _callee0$(_context0) {
607
+ while (1) switch (_context0.prev = _context0.next) {
608
+ case 0:
609
+ keys = _args0.length > 4 && _args0[4] !== undefined ? _args0[4] : coordinates.map(function (_, i) {
610
+ return String(i);
611
+ });
612
+ input = new arrow.Table({
613
+ key: arrow.vectorFromArray(keys),
614
+ geometry: arrow.vectorFromArray(coordinates, type)
615
+ });
616
+ input.schema.fields[1].metadata.set(metadataKey, encoding);
617
+ decoded = arrow.tableFromIPC(arrow.tableToIPC(input, 'stream'));
618
+ _context0.next = 6;
619
+ return processFileData({
620
+ content: {
621
+ fileName: "".concat(id, ".arrow"),
622
+ data: decoded.batches
623
+ },
624
+ fileCache: []
625
+ });
626
+ case 6:
627
+ _yield$processFileDat3 = _context0.sent;
628
+ _yield$processFileDat4 = _slicedToArray(_yield$processFileDat3, 1);
629
+ file = _yield$processFileDat4[0];
630
+ dataset = new KeplerTable({
631
+ info: {
632
+ id: id,
633
+ label: id
634
+ },
635
+ color: [1, 2, 3]
636
+ });
637
+ _context0.next = 12;
638
+ return dataset.importData({
639
+ data: file.data
640
+ });
641
+ case 12:
642
+ return _context0.abrupt("return", dataset);
643
+ case 13:
644
+ case "end":
645
+ return _context0.stop();
646
+ }
647
+ }, _callee0);
648
+ }));
649
+ return _nativeSource.apply(this, arguments);
650
+ }
651
+ function source(id, kind) {
652
+ var keys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ['a', 'b'];
653
+ var values = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [10, 40];
654
+ return nativeSource(id, "geoarrow.".concat(kind.toLowerCase()), kind === 'Point' ? pointType : list(pointType), values.map(function (x) {
655
+ return x === null ? null : (kind === 'Point' ? point(x) : multi(x)).coordinates;
656
+ }), keys);
657
+ }
658
+ function join(left, right) {
659
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
660
+ var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
661
+ datasets: _defineProperty(_defineProperty({}, left.id, left), right.id, right)
662
+ });
663
+ state = reduceVisState(state, VisStateActions.addJoin(left.id));
664
+ var op = state.joins[0];
665
+ state = reduceVisState(state, VisStateActions.setJoinConfig(op.id, _objectSpread({
666
+ rightDataId: right.id,
667
+ leftField: 'key',
668
+ rightField: 'key',
669
+ type: 'LEFT'
670
+ }, config)));
671
+ state = reduceVisState(state, VisStateActions.runJoin(op.id));
672
+ state = flushCreateTableTasks(state);
673
+ return {
674
+ state: state,
675
+ result: state.datasets[op.resultId],
676
+ resultId: op.resultId
677
+ };
678
+ }
679
+ function features(dataset, fieldIndex) {
680
+ var props = GeoJsonLayer.findDefaultLayerProps(dataset).props;
681
+ expect(props.length).toBeGreaterThan(0);
682
+ var layer = new GeoJsonLayer(_objectSpread(_objectSpread({}, props[0]), {}, {
683
+ dataId: dataset.id
684
+ }, fieldIndex === undefined ? {} : {
685
+ columns: {
686
+ geojson: {
687
+ value: dataset.fields[fieldIndex].name,
688
+ fieldIdx: fieldIndex
689
+ }
690
+ }
691
+ }));
692
+ layer.setInitialLayerConfig(dataset);
693
+ return layer.formatLayerData(_defineProperty({}, dataset.id, dataset), {}).data;
694
+ }
695
+ function rawFingerprint(dataset) {
696
+ var column = dataset.dataContainer.getColumn(1);
697
+ var _bytes = function bytes(data) {
698
+ return {
699
+ type: String(data.type),
700
+ offset: data.offset,
701
+ length: data.length,
702
+ nullCount: data.nullCount,
703
+ buffers: data.buffers.map(function (b) {
704
+ return b ? Array.from(new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) : null;
705
+ }),
706
+ children: data.children.map(_bytes)
707
+ };
708
+ };
709
+ return {
710
+ column: column,
711
+ chunks: column.data.slice(),
712
+ content: JSON.stringify(column.data.map(_bytes)),
713
+ metadata: Array.from(dataset.fields[1].metadata.entries())
714
+ };
715
+ }
716
+ function assertUnchanged(dataset, before) {
717
+ var after = rawFingerprint(dataset);
718
+ expect(after.column).toBe(before.column);
719
+ after.chunks.forEach(function (chunk, i) {
720
+ return expect(chunk).toBe(before.chunks[i]);
721
+ });
722
+ expect(after.content).toBe(before.content);
723
+ expect(after.metadata).toEqual(before.metadata);
724
+ }
725
+ function roundtrip(dataset) {
726
+ var saved = datasetSchema[VERSIONS.v1].save(dataset);
727
+ var loaded = datasetSchema[VERSIONS.v1].load(JSON.parse(JSON.stringify(saved)));
728
+ return new KeplerTable({
729
+ info: {
730
+ id: "".concat(dataset.id, "-reload")
731
+ },
732
+ color: [1, 2, 3]
733
+ }).updateSchema(loaded.data);
734
+ }
735
+ test.each(['Point', 'MultiPoint'])('preserves imported %s geometry through join actions, layer accessors, export and reload', /*#__PURE__*/function () {
736
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(kind) {
737
+ var left, before, right, expected, _join, result, state, _i3, _arr3, dataset, data, control;
738
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
739
+ while (1) switch (_context.prev = _context.next) {
740
+ case 0:
741
+ _context.next = 2;
742
+ return source('native', kind);
743
+ case 2:
744
+ left = _context.sent;
745
+ before = rawFingerprint(left);
746
+ right = makeTable('lookup', [{
747
+ name: 'key',
748
+ type: 'string'
749
+ }, {
750
+ name: 'value',
751
+ type: 'real'
752
+ }], [['a', 1], ['b', 2]]);
753
+ expected = [10, 40].map(function (x) {
754
+ return kind === 'Point' ? point(x) : multi(x);
755
+ });
756
+ expect(datasetToFeatureCollection(left.dataContainer, left.fields).features.map(function (f) {
757
+ return f.geometry;
758
+ })).toEqual(expected);
759
+ _join = join(left, right), result = _join.result, state = _join.state;
760
+ expect(state.joins).toHaveLength(0);
761
+ expect(result.dataContainer.constructor.name).toBe('RowDataContainer');
762
+ expect(result.dataContainer.numRows()).toBe(2);
763
+ expect(result.fields[1]).toMatchObject({
764
+ type: 'geojson',
765
+ analyzerType: 'GEOMETRY_FROM_STRING'
766
+ });
767
+ expect(result.fields[1].metadata).toBeUndefined();
768
+ expect(JSON.parse(result.fields[1].valueAccessor({
769
+ index: 0
770
+ }))).toEqual(expected[0]);
771
+ expect(result.fields[3].valueAccessor({
772
+ index: 1
773
+ })).toBe(2);
774
+ expect(state.layers.filter(function (layer) {
775
+ return layer.config.dataId === result.id;
776
+ })).toHaveLength(1);
777
+ for (_i3 = 0, _arr3 = [result, roundtrip(result)]; _i3 < _arr3.length; _i3++) {
778
+ dataset = _arr3[_i3];
779
+ expect(features(dataset).map(function (f) {
780
+ return f.geometry;
781
+ })).toEqual(expected);
782
+ expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
783
+ return f.geometry;
784
+ })).toEqual(expected);
785
+ }
786
+ data = processGeojson({
787
+ type: 'FeatureCollection',
788
+ features: expected.map(function (geometry, i) {
789
+ return {
790
+ type: 'Feature',
791
+ geometry: geometry,
792
+ properties: {
793
+ key: ['a', 'b'][i]
794
+ }
795
+ };
796
+ })
797
+ });
798
+ control = new KeplerTable({
799
+ info: {
800
+ id: 'geojson'
801
+ },
802
+ color: [1, 2, 3]
803
+ }).updateSchema(data);
804
+ expect(features(join(control, right).result).map(function (f) {
805
+ return f.geometry;
806
+ })).toEqual(expected);
807
+ assertUnchanged(left, before);
808
+ case 21:
809
+ case "end":
810
+ return _context.stop();
811
+ }
812
+ }, _callee);
813
+ }));
814
+ return function (_x5) {
815
+ return _ref.apply(this, arguments);
816
+ };
817
+ }());
818
+ test.each(['Point', 'MultiPoint'])('preserves %s on both sides with duplicates, nulls, unmatched rows and empty joins', /*#__PURE__*/function () {
819
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(kind) {
820
+ var left, right, beforeLeft, beforeRight, _iterator, _step, _step$value, type, expectedRows, leftFeatures, rightFeatures, _join2, result, _state, _i4, _arr4, dataset, empty;
821
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
822
+ while (1) switch (_context2.prev = _context2.next) {
823
+ case 0:
824
+ _context2.next = 2;
825
+ return source('left', kind, ['a', 'b', 'c', null], [10, null, 40, 70]);
826
+ case 2:
827
+ left = _context2.sent;
828
+ _context2.next = 5;
829
+ return source('right', kind, ['a', 'a', 'd', null], [20, null, 50, 80]);
830
+ case 5:
831
+ right = _context2.sent;
832
+ beforeLeft = rawFingerprint(left);
833
+ beforeRight = rawFingerprint(right);
834
+ _iterator = _createForOfIteratorHelper([['LEFT', 5, 4, 1], ['INNER', 2, 2, 1], ['FULL', 7, 4, 3]]);
835
+ try {
836
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
837
+ _step$value = _slicedToArray(_step.value, 4), type = _step$value[0], expectedRows = _step$value[1], leftFeatures = _step$value[2], rightFeatures = _step$value[3];
838
+ _join2 = join(left, right, {
839
+ type: type
840
+ }), result = _join2.result, _state = _join2.state;
841
+ expect(_state.joins).toHaveLength(0);
842
+ expect(result.dataContainer.numRows()).toBe(expectedRows);
843
+ for (_i4 = 0, _arr4 = [result, roundtrip(result)]; _i4 < _arr4.length; _i4++) {
844
+ dataset = _arr4[_i4];
845
+ expect(features(dataset, 1)).toHaveLength(leftFeatures);
846
+ expect(features(dataset, 3)).toHaveLength(rightFeatures);
847
+ }
848
+ expect(result.dataContainer.valueAt(1, 3)).toBeNull();
849
+ if (type !== 'INNER') expect(result.dataContainer.valueAt(2, 1)).toBeNull();
850
+ if (type === 'FULL') expect(result.dataContainer.valueAt(5, 1)).toBeNull();
851
+ }
852
+ } catch (err) {
853
+ _iterator.e(err);
854
+ } finally {
855
+ _iterator.f();
856
+ }
857
+ _context2.t0 = join;
858
+ _context2.t1 = left;
859
+ _context2.next = 14;
860
+ return source('absent', kind, ['none'], [90]);
861
+ case 14:
862
+ _context2.t2 = _context2.sent;
863
+ _context2.t3 = {
864
+ type: 'INNER'
865
+ };
866
+ empty = (0, _context2.t0)(_context2.t1, _context2.t2, _context2.t3).result;
867
+ expect(empty.dataContainer.numRows()).toBe(0);
868
+ expect(features(empty, 1)).toEqual([]);
869
+ assertUnchanged(left, beforeLeft);
870
+ assertUnchanged(right, beforeRight);
871
+ case 21:
872
+ case "end":
873
+ return _context2.stop();
874
+ }
875
+ }, _callee2);
876
+ }));
877
+ return function (_x6) {
878
+ return _ref2.apply(this, arguments);
879
+ };
880
+ }());
881
+ test.each([3, 4])('preserves precision and all %i native coordinate ordinates', /*#__PURE__*/function () {
882
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(dimensions) {
883
+ var coordinates, type, left, right, _join3, result, _i5, _arr5, dataset;
884
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
885
+ while (1) switch (_context3.prev = _context3.next) {
886
+ case 0:
887
+ coordinates = [-122.41234567890123, 37.81234567890123, 123.4567890123, 99.125].slice(0, dimensions);
888
+ type = new arrow.FixedSizeList(dimensions, new arrow.Field('coordinate', new arrow.Float64(), false));
889
+ _context3.next = 4;
890
+ return nativeSource('native', 'geoarrow.point', type, [coordinates]);
891
+ case 4:
892
+ left = _context3.sent;
893
+ right = makeTable('lookup', [{
894
+ name: 'key',
895
+ type: 'string'
896
+ }], [['0']]);
897
+ _join3 = join(left, right), result = _join3.result;
898
+ for (_i5 = 0, _arr5 = [result, roundtrip(result)]; _i5 < _arr5.length; _i5++) {
899
+ dataset = _arr5[_i5];
900
+ expect(features(dataset)[0].geometry).toEqual({
901
+ type: 'Point',
902
+ coordinates: coordinates
903
+ });
904
+ expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features[0].geometry).toEqual({
905
+ type: 'Point',
906
+ coordinates: coordinates
907
+ });
908
+ }
909
+ case 8:
910
+ case "end":
911
+ return _context3.stop();
912
+ }
913
+ }, _callee3);
914
+ }));
915
+ return function (_x7) {
916
+ return _ref3.apply(this, arguments);
917
+ };
918
+ }());
919
+ test('preserves empty native Points separately from null geometry', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
920
+ var left, before, right, _join4, result, state, expected, _i6, _arr6, dataset;
921
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
922
+ while (1) switch (_context4.prev = _context4.next) {
923
+ case 0:
924
+ _context4.next = 2;
925
+ return nativeSource('native', 'geoarrow.point', pointType, [[10, 11], [NaN, NaN], null]);
926
+ case 2:
927
+ left = _context4.sent;
928
+ before = rawFingerprint(left);
929
+ right = makeTable('lookup', [{
930
+ name: 'key',
931
+ type: 'string'
932
+ }], [['0'], ['1'], ['2']]);
933
+ _join4 = join(left, right), result = _join4.result, state = _join4.state;
934
+ expect(state.joins).toHaveLength(0);
935
+ expected = [point(10), {
936
+ type: 'Point',
937
+ coordinates: []
938
+ }, null];
939
+ for (_i6 = 0, _arr6 = [result, roundtrip(result)]; _i6 < _arr6.length; _i6++) {
940
+ dataset = _arr6[_i6];
941
+ expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
942
+ return f.geometry;
943
+ })).toEqual(expected);
944
+ expect(features(dataset).map(function (f) {
945
+ return f.geometry;
946
+ })).toEqual(expected.slice(0, 2));
947
+ }
948
+ assertUnchanged(left, before);
949
+ case 10:
950
+ case "end":
951
+ return _context4.stop();
952
+ }
953
+ }, _callee4);
954
+ })));
955
+ test.each([['LineString', 1, [[10, 11], [12, 13]]], ['Polygon', 2, [[[10, 11], [12, 11], [12, 13], [10, 11]]]], ['MultiPoint', 1, [[10, 11], [12, 13]]], ['MultiLineString', 2, [[[10, 11], [12, 13]]]], ['MultiPolygon', 3, [[[[10, 11], [12, 11], [12, 13], [10, 11]]]]]])('retains %s coordinates and empty geometries', /*#__PURE__*/function () {
956
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(kind, depth, coordinates) {
957
+ var type, i, left, before, right, _join5, result, state, expected, _i7, _arr7, dataset;
958
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
959
+ while (1) switch (_context5.prev = _context5.next) {
960
+ case 0:
961
+ type = pointType;
962
+ for (i = 0; i < Number(depth); i++) type = list(type);
963
+ _context5.next = 4;
964
+ return nativeSource('native', "geoarrow.".concat(String(kind).toLowerCase()), type, [coordinates, [], null]);
965
+ case 4:
966
+ left = _context5.sent;
967
+ before = rawFingerprint(left);
968
+ right = makeTable('lookup', [{
969
+ name: 'key',
970
+ type: 'string'
971
+ }], [['0'], ['1'], ['2']]);
972
+ _join5 = join(left, right), result = _join5.result, state = _join5.state;
973
+ expect(state.joins).toHaveLength(0);
974
+ expected = [{
975
+ type: kind,
976
+ coordinates: coordinates
977
+ }, {
978
+ type: kind,
979
+ coordinates: []
980
+ }, null];
981
+ for (_i7 = 0, _arr7 = [result, roundtrip(result)]; _i7 < _arr7.length; _i7++) {
982
+ dataset = _arr7[_i7];
983
+ expect(datasetToFeatureCollection(dataset.dataContainer, dataset.fields).features.map(function (f) {
984
+ return f.geometry;
985
+ })).toEqual(expected);
986
+ expect(features(dataset)[0].geometry).toEqual(expected[0]);
987
+ }
988
+ assertUnchanged(left, before);
989
+ case 12:
990
+ case "end":
991
+ return _context5.stop();
992
+ }
993
+ }, _callee5);
994
+ }));
995
+ return function (_x8, _x9, _x0) {
996
+ return _ref5.apply(this, arguments);
997
+ };
998
+ }());
999
+ test.each([['geoarrow.point', pointType, [[10, Infinity]]], ['geoarrow.point', pointType, [[10, NaN]]], ['geoarrow.point', new arrow.Struct([new arrow.Field('x', new arrow.Float64(), false), new arrow.Field('y', new arrow.Float64(), false)]), [{
1000
+ x: 10,
1001
+ y: 11
1002
+ }]], ['geoarrow.point', new arrow.FixedSizeList(1, new arrow.Field('x', new arrow.Float64(), false)), [[10]]], ['geoarrow.multipoint', list(pointType), [[[10, 11], null]]], ['geoarrow.unknown', pointType, [[10, 11]]]])('surfaces invalid or unsupported %s instead of creating corrupt output', /*#__PURE__*/function () {
1003
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(encoding, type, coordinates) {
1004
+ var left, right, before, _join6, state, result;
1005
+ return _regeneratorRuntime.wrap(function _callee6$(_context6) {
1006
+ while (1) switch (_context6.prev = _context6.next) {
1007
+ case 0:
1008
+ _context6.next = 2;
1009
+ return nativeSource('native', encoding, type, coordinates);
1010
+ case 2:
1011
+ left = _context6.sent;
1012
+ right = makeTable('lookup', [{
1013
+ name: 'key',
1014
+ type: 'string'
1015
+ }], [['0']]);
1016
+ before = rawFingerprint(left);
1017
+ _join6 = join(left, right), state = _join6.state, result = _join6.result;
1018
+ expect(result).toBeUndefined();
1019
+ expect(state.joins[0].error).toMatch(/geometry.*row 1/i);
1020
+ assertUnchanged(left, before);
1021
+ // Omitted geometry and nonmatching INNER rows must not be converted eagerly.
1022
+ expect(join(left, right, {
1023
+ leftColumns: ['key']
1024
+ }).result.dataContainer.rowAsArray(0)).toEqual(['0', '0']);
1025
+ expect(join(left, makeTable('absent', [{
1026
+ name: 'key',
1027
+ type: 'string'
1028
+ }], [['absent']]), {
1029
+ type: 'INNER'
1030
+ }).result.dataContainer.numRows()).toBe(0);
1031
+ case 11:
1032
+ case "end":
1033
+ return _context6.stop();
1034
+ }
1035
+ }, _callee6);
1036
+ }));
1037
+ return function (_x1, _x10, _x11) {
1038
+ return _ref6.apply(this, arguments);
1039
+ };
1040
+ }());
1041
+ test.each(['wkb', 'wkt'])('preserves %s geometry through chained attribute joins', /*#__PURE__*/function () {
1042
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(encoding) {
1043
+ var geometry, value, original, right, left, run, _join7, _state2, result;
1044
+ return _regeneratorRuntime.wrap(function _callee7$(_context7) {
1045
+ while (1) switch (_context7.prev = _context7.next) {
1046
+ case 0:
1047
+ geometry = {
1048
+ type: 'Point',
1049
+ coordinates: [10, 11]
1050
+ };
1051
+ value = encoding === 'wkb' ? new Uint8Array(convertGeometryToWKB(geometry)) : 'POINT (10 11)';
1052
+ _context7.next = 4;
1053
+ return nativeSource('source', "geoarrow.".concat(encoding), encoding === 'wkb' ? new arrow.Binary() : new arrow.Utf8(), [value, null], ['a', 'b']);
1054
+ case 4:
1055
+ original = _context7.sent;
1056
+ right = makeTable('lookup', [{
1057
+ name: 'key',
1058
+ type: 'string'
1059
+ }], [['a'], ['b']]);
1060
+ left = original;
1061
+ for (run = 0; run < 2; run++) {
1062
+ _join7 = join(left, right, {
1063
+ rightColumns: []
1064
+ }), _state2 = _join7.state, result = _join7.result;
1065
+ expect(_state2.joins).toHaveLength(0);
1066
+ expect(datasetToFeatureCollection(result.dataContainer, result.fields).features.map(function (feature) {
1067
+ return feature.geometry;
1068
+ })).toEqual([geometry, null]);
1069
+ expect(features(result).map(function (feature) {
1070
+ return feature.geometry;
1071
+ })).toEqual([geometry]);
1072
+ left = result;
1073
+ }
1074
+ expect(original.dataContainer.valueAt(0, 1)).toEqual(value);
1075
+ expect(original.dataContainer.valueAt(1, 1)).toBeNull();
1076
+ case 10:
1077
+ case "end":
1078
+ return _context7.stop();
1079
+ }
1080
+ }, _callee7);
1081
+ }));
1082
+ return function (_x12) {
1083
+ return _ref7.apply(this, arguments);
1084
+ };
1085
+ }());
1086
+ test('joins unannotated WKB identified as GEOMETRY', function () {
1087
+ var geometry = {
1088
+ type: 'Point',
1089
+ coordinates: [10, 11]
1090
+ };
1091
+ var values = arrow.vectorFromArray([new Uint8Array(convertGeometryToWKB(geometry)), null], new arrow.Binary());
1092
+ var keys = arrow.vectorFromArray(['a', 'b']);
1093
+ var input = new arrow.Table({
1094
+ key: keys,
1095
+ geometry: values
1096
+ });
1097
+ var left = new KeplerTable({
1098
+ info: {
1099
+ id: 'source'
1100
+ },
1101
+ color: [1, 2, 3]
1102
+ }).updateSchema({
1103
+ fields: arrowSchemaToFields(input, {
1104
+ geometry: 'GEOMETRY'
1105
+ }),
1106
+ cols: [keys, values],
1107
+ rows: []
1108
+ });
1109
+ var right = makeTable('lookup', [{
1110
+ name: 'key',
1111
+ type: 'string'
1112
+ }], [['a'], ['b']]);
1113
+ var _join8 = join(left, right, {
1114
+ rightColumns: []
1115
+ }),
1116
+ state = _join8.state,
1117
+ result = _join8.result;
1118
+ expect(state.joins).toHaveLength(0);
1119
+ expect(datasetToFeatureCollection(result.dataContainer, result.fields).features.map(function (feature) {
1120
+ return feature.geometry;
1121
+ })).toEqual([geometry, null]);
1122
+ expect(features(result).map(function (feature) {
1123
+ return feature.geometry;
1124
+ })).toEqual([geometry]);
1125
+ });
1126
+ test('joins ordinary Arrow attributes after JSON save/reload without changing values', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8() {
1127
+ var input, _yield$processFileDat, _yield$processFileDat2, file, original, restored, right;
1128
+ return _regeneratorRuntime.wrap(function _callee8$(_context8) {
1129
+ while (1) switch (_context8.prev = _context8.next) {
1130
+ case 0:
1131
+ input = new arrow.Table({
1132
+ key: arrow.vectorFromArray(['a', 'b']),
1133
+ value: arrow.vectorFromArray([1.25, 2.5])
1134
+ });
1135
+ _context8.next = 3;
1136
+ return processFileData({
1137
+ content: {
1138
+ fileName: 'ordinary.arrow',
1139
+ data: input.batches
1140
+ },
1141
+ fileCache: []
1142
+ });
1143
+ case 3:
1144
+ _yield$processFileDat = _context8.sent;
1145
+ _yield$processFileDat2 = _slicedToArray(_yield$processFileDat, 1);
1146
+ file = _yield$processFileDat2[0];
1147
+ original = new KeplerTable({
1148
+ info: {
1149
+ id: 'ordinary'
1150
+ },
1151
+ color: [1, 2, 3]
1152
+ }).updateSchema(file.data);
1153
+ restored = roundtrip(original);
1154
+ right = makeTable('lookup', [{
1155
+ name: 'key',
1156
+ type: 'string'
1157
+ }], [['a'], ['b']]);
1158
+ expect(join(restored, right).result.dataContainer.flattenData()).toEqual([['a', 1.25, 'a'], ['b', 2.5, 'b']]);
1159
+ case 10:
1160
+ case "end":
1161
+ return _context8.stop();
1162
+ }
1163
+ }, _callee8);
1164
+ })));
1165
+ test('reads geometry once per emitted source row and does not retain a stale cache across joins', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
1166
+ var left, right, read, first, replacement, second;
1167
+ return _regeneratorRuntime.wrap(function _callee9$(_context9) {
1168
+ while (1) switch (_context9.prev = _context9.next) {
1169
+ case 0:
1170
+ _context9.next = 2;
1171
+ return source('left', 'Point');
1172
+ case 2:
1173
+ left = _context9.sent;
1174
+ right = makeTable('lookup', [{
1175
+ name: 'key',
1176
+ type: 'string'
1177
+ }], [['a'], ['a'], ['a']]);
1178
+ read = jest.spyOn(left.dataContainer, 'valueAt');
1179
+ first = join(left, right, {
1180
+ type: 'INNER'
1181
+ }).result;
1182
+ expect(first.dataContainer.numRows()).toBe(3);
1183
+ expect(read.mock.calls.filter(function (_ref0) {
1184
+ var _ref1 = _slicedToArray(_ref0, 2),
1185
+ fieldIndex = _ref1[1];
1186
+ return fieldIndex === 1;
1187
+ })).toEqual([[0, 1]]);
1188
+ read.mockRestore();
1189
+ _context9.next = 11;
1190
+ return source('replacement', 'Point', ['a', 'b'], [50, 60]);
1191
+ case 11:
1192
+ replacement = _context9.sent;
1193
+ left.updateSchema({
1194
+ fields: replacement.fields,
1195
+ rows: [],
1196
+ cols: [replacement.dataContainer.getColumn(0), replacement.dataContainer.getColumn(1)]
1197
+ });
1198
+ second = join(left, right, {
1199
+ type: 'INNER'
1200
+ }).result;
1201
+ expect(JSON.parse(second.dataContainer.valueAt(0, 1))).toEqual(point(50));
1202
+ expect(JSON.parse(first.dataContainer.valueAt(0, 1))).toEqual(point(10));
1203
+ case 16:
1204
+ case "end":
1205
+ return _context9.stop();
1206
+ }
1207
+ }, _callee9);
1208
+ })));
1209
+ });
1210
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJwcm9jZXNzQXJyb3dUYWJsZSIsInByb2Nlc3NDc3ZEYXRhIiwicHJvY2Vzc0ZpbGVEYXRhIiwicHJvY2Vzc0dlb2pzb24iLCJwcm9jZXNzS2VwbGVyZ2xKU09OIiwiY29udmVydEdlb21ldHJ5VG9XS0IiLCJhcnJvdyIsIkdlb0pzb25MYXllciIsImRhdGFzZXRTY2hlbWEiLCJWRVJTSU9OUyIsImRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uIiwiSW50NjQiLCJUYWJsZSIsInZlY3RvckZyb21BcnJheSIsImV4cG9ydE1hcFRvSFRNTCIsImV4cG9ydFRvSnNvblN0cmluZyIsInZhbGlkYXRlSW5wdXREYXRhIiwiU2NoZW1hTWFuYWdlciIsImRyYWluVGFza3NGb3JUZXN0aW5nIiwic3VjY2VlZFRhc2tXaXRoVmFsdWVzIiwiUmVzcG9uc2UiLCJ2aXNTdGF0ZVJlZHVjZXIiLCJJTklUSUFMX1ZJU19TVEFURSIsInJlZHVjZVZpc1N0YXRlIiwibWFrZVRhYmxlIiwiaWQiLCJmaWVsZHMiLCJyb3dzIiwidGFibGUiLCJpbmZvIiwibGFiZWwiLCJ0eXBlIiwiY29sb3IiLCJ1cGRhdGVTY2hlbWEiLCJtYXAiLCJmaWVsZCIsIm5hbWUiLCJhbmFseXplclR5cGUiLCJmbHVzaENyZWF0ZVRhYmxlVGFza3MiLCJzdGF0ZSIsInRhc2tzIiwicmVkdWNlIiwibmV4dFN0YXRlIiwidGFzayIsIlN0cmluZyIsImluY2x1ZGVzIiwidGFibGVzIiwiQXJyYXkiLCJpc0FycmF5IiwicGF5bG9hZCIsIl9vYmplY3RTcHJlYWQiLCJvcHRzIiwiZGF0YSIsImRlc2NyaWJlIiwib3JpZ2luYWxSZXNwb25zZSIsImdsb2JhbFRoaXMiLCJiZWZvcmVBbGwiLCJhZnRlckFsbCIsImJlZm9yZUVhY2giLCJ0ZXN0IiwiY2l0aWVzIiwic3RyaW5nIiwiaW50ZWdlciIsImRhdGFzZXRzIiwiYWRkR3JvdXBCeSIsImV4cGVjdCIsImdyb3VwQnlzIiwidG9IYXZlTGVuZ3RoIiwib3BJZCIsInNldEdyb3VwQnlDb25maWciLCJmaWVsZE5hbWUiLCJhZ2dyZWdhdGlvbnMiLCJwb3AiLCJyZXN1bHRJZCIsInJ1bkdyb3VwQnkiLCJ0b0JlVHJ1dGh5IiwibWV0YWRhdGEiLCJkZXJpdmVkRGF0YXNldCIsInRvRXF1YWwiLCJzb3VyY2VEYXRhSWRzIiwib3BlcmF0aW9uSWQiLCJkYXRhQ29udGFpbmVyIiwibnVtUm93cyIsInRvQmUiLCJlYWNoIiwibWl4ZWQiLCJrZXkiLCJhcnJvd0RhdGEiLCJzaGFwZSIsIkVycm9yIiwibGVmdCIsInJpZ2h0IiwiYWRkSm9pbiIsIm9wIiwiam9pbnMiLCJzZXRKb2luQ29uZmlnIiwicmlnaHREYXRhSWQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwicmlnaHRDb2x1bW5zIiwicnVuSm9pbiIsImFkZEZpbHRlciIsInNldEZpbHRlciIsImZpbHRlcnMiLCJkb21haW4iLCJmaWx0ZXJlZEluZGV4IiwiX2kiLCJfYXJyIiwibGVuZ3RoIiwiX2V4cG9ydE1hcFRvSFRNTCRtYXRjIiwiX3Byb2Nlc3NLZXBsZXJnbEpTT04iLCJfcmVsb2FkZWQkZ2V0Q29sdW1uRmkiLCJyZW1vdmVTb3VyY2VzIiwicmVtb3ZlRGF0YXNldCIsIk9iamVjdCIsImtleXMiLCJzYXZlZCIsInNhdmUiLCJ2aXNTdGF0ZSIsImpzb24iLCJKU09OIiwicGFyc2UiLCJlbWJlZGRlZCIsIm1hdGNoIiwicGFyc2VkIiwiZmluZCIsImRhdGFzZXQiLCJyZWxvYWRlZCIsImdldENvbHVtbkZpbHRlclByb3BzIiwiZmxhdHRlbkRhdGEiLCJpbmRleCIsIl9hcnJvdyRnZXRDaGlsZCIsImdldENoaWxkIiwiZ2V0IiwidmFsdWVBdCIsInRlY2huaXF1ZSIsImRlY2VtYmVyIiwiamFudWFyeSIsImNvbmNhdCIsInRvTWF0Y2hPYmplY3QiLCJmb3JtYXQiLCJ0aW1lcyIsInRpbWUiLCJyZXN1bHQiLCJleHBlY3RlZCIsImdldFBsYWluSW5kZXgiLCJpIiwicm93QXNBcnJheSIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsInB0cyIsIl9pMiIsIl9hcnIyIiwibG5nIiwicG9seWdvbkRhdGEiLCJwb2ludCIsInBvaW50RGF0YSIsImxlZnRHZW8iLCJraW5kIiwicmlnaHRHZW8iLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiY29vcmRpbmF0ZXMiLCJyZWFsIiwibGF0RmllbGQiLCJsbmdGaWVsZCIsIl9kZXJpdmVkTWV0YSRkZXJpdmVkRCIsIl9zYXZlZCRjb25maWckY29uZmlnJCIsIm1hcFN0YXRlIiwibWFwU3R5bGUiLCJ1aVN0YXRlIiwiZGVyaXZlZCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiLCJtZXRhZGF0YUtleSIsIngiLCJtdWx0aSIsInBvaW50VHlwZSIsIkZpeGVkU2l6ZUxpc3QiLCJGaWVsZCIsIkZsb2F0NjQiLCJsaXN0IiwiTGlzdCIsIm5hdGl2ZVNvdXJjZSIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX25hdGl2ZVNvdXJjZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUwIiwiZW5jb2RpbmciLCJpbnB1dCIsImRlY29kZWQiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQzIiwiX3lpZWxkJHByb2Nlc3NGaWxlRGF0NCIsImZpbGUiLCJfYXJnczAiLCJ3cmFwIiwiX2NhbGxlZTAkIiwiX2NvbnRleHQwIiwicHJldiIsIm5leHQiLCJ1bmRlZmluZWQiLCJfIiwiZ2VvbWV0cnkiLCJzY2hlbWEiLCJzZXQiLCJ0YWJsZUZyb21JUEMiLCJ0YWJsZVRvSVBDIiwiY29udGVudCIsImZpbGVOYW1lIiwiYmF0Y2hlcyIsImZpbGVDYWNoZSIsInNlbnQiLCJfc2xpY2VkVG9BcnJheSIsImltcG9ydERhdGEiLCJhYnJ1cHQiLCJzdG9wIiwic291cmNlIiwidmFsdWVzIiwidG9Mb3dlckNhc2UiLCJqb2luIiwiX2RlZmluZVByb3BlcnR5IiwiZmVhdHVyZXMiLCJmaWVsZEluZGV4IiwicHJvcHMiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJ0b0JlR3JlYXRlclRoYW4iLCJjb2x1bW5zIiwiZmllbGRJZHgiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJmb3JtYXRMYXllckRhdGEiLCJyYXdGaW5nZXJwcmludCIsImNvbHVtbiIsImdldENvbHVtbiIsImJ5dGVzIiwib2Zmc2V0IiwibnVsbENvdW50IiwiYnVmZmVycyIsImIiLCJmcm9tIiwiVWludDhBcnJheSIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiY2hpbGRyZW4iLCJjaHVua3MiLCJzbGljZSIsInN0cmluZ2lmeSIsImVudHJpZXMiLCJhc3NlcnRVbmNoYW5nZWQiLCJiZWZvcmUiLCJhZnRlciIsImZvckVhY2giLCJjaHVuayIsInJvdW5kdHJpcCIsInYxIiwibG9hZGVkIiwibG9hZCIsIl9yZWYiLCJfY2FsbGVlIiwiX2pvaW4iLCJfaTMiLCJfYXJyMyIsImNvbnRyb2wiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZiIsImNvbnN0cnVjdG9yIiwidmFsdWVBY2Nlc3NvciIsImZpbHRlciIsInByb3BlcnRpZXMiLCJfeDUiLCJfcmVmMiIsIl9jYWxsZWUyIiwiYmVmb3JlTGVmdCIsImJlZm9yZVJpZ2h0IiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJfc3RlcCR2YWx1ZSIsImV4cGVjdGVkUm93cyIsImxlZnRGZWF0dXJlcyIsInJpZ2h0RmVhdHVyZXMiLCJfam9pbjIiLCJfc3RhdGUiLCJfaTQiLCJfYXJyNCIsImVtcHR5IiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJzIiwibiIsImRvbmUiLCJ0b0JlTnVsbCIsImVyciIsImUiLCJ0MCIsInQxIiwidDIiLCJ0MyIsIl94NiIsIl9yZWYzIiwiX2NhbGxlZTMiLCJkaW1lbnNpb25zIiwiX2pvaW4zIiwiX2k1IiwiX2FycjUiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJfeDciLCJfY2FsbGVlNCIsIl9qb2luNCIsIl9pNiIsIl9hcnI2IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiTmFOIiwiX3JlZjUiLCJfY2FsbGVlNSIsImRlcHRoIiwiX2pvaW41IiwiX2k3IiwiX2FycjciLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJOdW1iZXIiLCJfeDgiLCJfeDkiLCJfeDAiLCJJbmZpbml0eSIsIlN0cnVjdCIsInkiLCJfcmVmNiIsIl9jYWxsZWU2IiwiX2pvaW42IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwibGVmdENvbHVtbnMiLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl9yZWY3IiwiX2NhbGxlZTciLCJvcmlnaW5hbCIsInJ1biIsIl9qb2luNyIsIl9zdGF0ZTIiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJCaW5hcnkiLCJVdGY4IiwiZmVhdHVyZSIsIl94MTIiLCJjb2xzIiwiX2pvaW44IiwiX2NhbGxlZTgiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQiLCJfeWllbGQkcHJvY2Vzc0ZpbGVEYXQyIiwicmVzdG9yZWQiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJfY2FsbGVlOSIsInJlYWQiLCJmaXJzdCIsInJlcGxhY2VtZW50Iiwic2Vjb25kIiwiX2NhbGxlZTkkIiwiX2NvbnRleHQ5IiwiamVzdCIsInNweU9uIiwibW9jayIsImNhbGxzIiwiX3JlZjAiLCJfcmVmMSIsIm1vY2tSZXN0b3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzZXQtb3BzLXVwZGF0ZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1xuICBhcnJvd1NjaGVtYVRvRmllbGRzLFxuICBwcm9jZXNzQXJyb3dUYWJsZSxcbiAgcHJvY2Vzc0NzdkRhdGEsXG4gIHByb2Nlc3NGaWxlRGF0YSxcbiAgcHJvY2Vzc0dlb2pzb24sXG4gIHByb2Nlc3NLZXBsZXJnbEpTT05cbn0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7Y29udmVydEdlb21ldHJ5VG9XS0J9IGZyb20gJ0Bsb2FkZXJzLmdsL2dpcyc7XG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IEdlb0pzb25MYXllciBmcm9tICcuLi8uLi9sYXllcnMvc3JjL2dlb2pzb24tbGF5ZXIvZ2VvanNvbi1sYXllcic7XG5pbXBvcnQge2RhdGFzZXRTY2hlbWEsIFZFUlNJT05TfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSAnLi4vLi4vcHJvY2Vzc29ycy9zcmMvZXhwb3J0L2RhdGFzZXQtdG8tZ2VvanNvbic7XG5pbXBvcnQge0ludDY0LCBUYWJsZSwgdmVjdG9yRnJvbUFycmF5fSBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtleHBvcnRNYXBUb0hUTUwsIGV4cG9ydFRvSnNvblN0cmluZywgdmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IFNjaGVtYU1hbmFnZXIsIHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7ZHJhaW5UYXNrc0ZvclRlc3RpbmcsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlc30gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICdub2RlLWZldGNoJztcblxuaW1wb3J0IHZpc1N0YXRlUmVkdWNlciBmcm9tICcuL3Zpcy1zdGF0ZSc7XG5pbXBvcnQge0lOSVRJQUxfVklTX1NUQVRFfSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5cbmNvbnN0IHJlZHVjZVZpc1N0YXRlID0gdmlzU3RhdGVSZWR1Y2VyIGFzIChzdGF0ZTogVmlzU3RhdGUsIGFjdGlvbjogdW5rbm93bikgPT4gVmlzU3RhdGU7XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZShpZDogc3RyaW5nLCBmaWVsZHM6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ31bXSwgcm93czogYW55W11bXSkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkLCBsYWJlbDogaWQsIHR5cGU6ICdsb2NhbCd9LFxuICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgfSk7XG4gIHRhYmxlLnVwZGF0ZVNjaGVtYSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGFuYWx5emVyVHlwZTogZmllbGQudHlwZVxuICAgIH0pKSxcbiAgICByb3dzXG4gIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZTogVmlzU3RhdGUpIHtcbiAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICByZXR1cm4gdGFza3MucmVkdWNlKChuZXh0U3RhdGUsIHRhc2spID0+IHtcbiAgICBpZiAoIVN0cmluZyh0YXNrLmxhYmVsIHx8ICcnKS5pbmNsdWRlcygnQ1JFQVRFX1RBQkxFX1RBU0snKSkge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gKEFycmF5LmlzQXJyYXkodGFzay5wYXlsb2FkKSA/IHRhc2sucGF5bG9hZCA6IFt0YXNrLnBheWxvYWRdKS5tYXAocGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7aW5mbzogcGF5bG9hZC5pbmZvLCBjb2xvcjogcGF5bG9hZC5jb2xvciwgLi4ucGF5bG9hZC5vcHRzfSk7XG4gICAgICB0YWJsZS51cGRhdGVTY2hlbWEocGF5bG9hZC5kYXRhKTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVkdWNlVmlzU3RhdGUobmV4dFN0YXRlLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXModGFzaywgdGFibGVzKSk7XG4gIH0sIHN0YXRlKTtcbn1cblxuZGVzY3JpYmUoJ2RhdGFzZXQgb3BzIHZpcy1zdGF0ZScsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxSZXNwb25zZSA9IGdsb2JhbFRoaXMuUmVzcG9uc2U7XG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IFJlc3BvbnNlIGFzIGFueTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBnbG9iYWxUaGlzLlJlc3BvbnNlID0gb3JpZ2luYWxSZXNwb25zZTtcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuR3JvdXBCeSBhZGRzIGEgZGVyaXZlZCBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWyd3ZXN0JywgMTBdLFxuICAgICAgICBbJ3dlc3QnLCAyMF0sXG4gICAgICAgIFsnZWFzdCcsIDQwXVxuICAgICAgXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3BJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLmlkO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3BJZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdElkID0gc3RhdGUuZ3JvdXBCeXNbMF0ucmVzdWx0SWQ7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3BJZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5cykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbcmVzdWx0SWRdLm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdncm91cEJ5JyxcbiAgICAgIHNvdXJjZURhdGFJZHM6IFsnY2l0aWVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3BJZFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIHRlc3QuZWFjaChbZmFsc2UsIHRydWVdKShcbiAgICAnam9pbmVkIEJpZ0ludHMgZmlsdGVyIGFuZCBzYXZlIGFmdGVyIHNvdXJjZSByZW1vdmFsIChtaXhlZDogJXMpJyxcbiAgICBtaXhlZCA9PiB7XG4gICAgICBjb25zdCBhcnJvdyA9IG5ldyBUYWJsZSh7XG4gICAgICAgIGtleTogdmVjdG9yRnJvbUFycmF5KFsnYScsICdiJywgbnVsbF0pLFxuICAgICAgICBwb3A6IHZlY3RvckZyb21BcnJheShbMTBuLCAyMG4sIG51bGxdLCBuZXcgSW50NjQoKSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXJyb3dEYXRhID0gcHJvY2Vzc0Fycm93VGFibGUoe3NoYXBlOiAnYXJyb3ctdGFibGUnLCBkYXRhOiBhcnJvd30pO1xuICAgICAgaWYgKCFhcnJvd0RhdGEpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBcnJvdyBmaXh0dXJlJyk7XG4gICAgICBjb25zdCBsZWZ0ID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6ICdsZWZ0J30sIGNvbG9yOiBbMCwgMCwgMF19KS51cGRhdGVTY2hlbWEoXG4gICAgICAgIG1peGVkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpZWxkczogYXJyb3dEYXRhLmZpZWxkcyxcbiAgICAgICAgICAgICAgcm93czogW1xuICAgICAgICAgICAgICAgIFsnYScsIDEwbl0sXG4gICAgICAgICAgICAgICAgWydiJywgMjBdLFxuICAgICAgICAgICAgICAgIFtudWxsLCAwLjVdXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGFycm93RGF0YVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdyaWdodCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2EnXSwgWydiJ11dKTtcbiAgICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7bGVmdCwgcmlnaHR9fTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRKb2luKCdsZWZ0JykpO1xuICAgICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0Sm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIHJpZ2h0RGF0YUlkOiAncmlnaHQnLFxuICAgICAgICAgIGxlZnRGaWVsZDogJ2tleScsXG4gICAgICAgICAgcmlnaHRGaWVsZDogJ2tleScsXG4gICAgICAgICAgcmlnaHRDb2x1bW5zOiBbXVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuSm9pbihvcC5pZCkpKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRGaWx0ZXIob3AucmVzdWx0SWQpKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgJ25hbWUnLCAncG9wJykpO1xuICAgICAgZXhwZWN0KHN0YXRlLmZpbHRlcnNbMF0uZG9tYWluKS50b0VxdWFsKFsxMCwgMjBdKTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXIoMCwgJ2dwdScsIGZhbHNlKSk7XG4gICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyKDAsICd2YWx1ZScsIFsxNSwgMjBdKSk7XG4gICAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdLmZpbHRlcmVkSW5kZXgpLnRvRXF1YWwoWzFdKTtcblxuICAgICAgZm9yIChjb25zdCByZW1vdmVTb3VyY2VzIG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgICAgaWYgKHJlbW92ZVNvdXJjZXMpIHtcbiAgICAgICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnbGVmdCcpKTtcbiAgICAgICAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncmlnaHQnKSk7XG4gICAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9FcXVhbChbb3AucmVzdWx0SWRdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7dmlzU3RhdGU6IHN0YXRlfSk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGV4cG9ydFRvSnNvblN0cmluZyhzYXZlZCkpO1xuICAgICAgICBjb25zdCBlbWJlZGRlZCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgZXhwb3J0TWFwVG9IVE1MKHNhdmVkKS5tYXRjaCgvY29uc3QgZGF0YXNldHMgPSAoLiopOy8pPy5bMV0gfHwgJydcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KGVtYmVkZGVkKS50b0VxdWFsKGpzb24uZGF0YXNldHMpO1xuICAgICAgICBjb25zdCBwYXJzZWQ6IFByb3RvRGF0YXNldCB8IHVuZGVmaW5lZCA9IHByb2Nlc3NLZXBsZXJnbEpTT04oanNvbik/LmRhdGFzZXRzPy5maW5kKFxuICAgICAgICAgIGRhdGFzZXQgPT4gZGF0YXNldC5pbmZvLmlkID09PSBvcC5yZXN1bHRJZFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2ZWQgZGF0YXNldCBhZnRlciByZWxvYWQnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHZhbGlkYXRlSW5wdXREYXRhKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZlZCBkYXRhc2V0IGFmdGVyIHJlbG9hZCcpO1xuICAgICAgICBjb25zdCByZWxvYWRlZCA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgICAgICAgaW5mbzogcGFyc2VkLmluZm8sXG4gICAgICAgICAgbWV0YWRhdGE6IHBhcnNlZC5tZXRhZGF0YSxcbiAgICAgICAgICBjb2xvcjogWzAsIDAsIDBdXG4gICAgICAgIH0pLnVwZGF0ZVNjaGVtYShkYXRhKTtcbiAgICAgICAgZXhwZWN0KHJlbG9hZGVkLmdldENvbHVtbkZpbHRlclByb3BzKCdwb3AnKT8uZG9tYWluKS50b0VxdWFsKFsxMCwgMjBdKTtcbiAgICAgICAgZXhwZWN0KHJlbG9hZGVkLmRhdGFDb250YWluZXIuZmxhdHRlbkRhdGEoKSkudG9FcXVhbChbXG4gICAgICAgICAgWydhJywgMTBdLFxuICAgICAgICAgIFsnYicsIDIwXSxcbiAgICAgICAgICBbbnVsbCwgbnVsbF1cbiAgICAgICAgXSk7XG4gICAgICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5mbGF0dGVuRGF0YSgpKS50b0VxdWFsKFtcbiAgICAgICAgICBbJ2EnLCAxMG5dLFxuICAgICAgICAgIFsnYicsIDIwbl0sXG4gICAgICAgICAgW251bGwsIG51bGxdXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgZXhwZWN0KFswLCAxLCAyXS5tYXAoaW5kZXggPT4gYXJyb3cuZ2V0Q2hpbGQoJ3BvcCcpPy5nZXQoaW5kZXgpKSkudG9FcXVhbChbMTBuLCAyMG4sIG51bGxdKTtcbiAgICAgIGV4cGVjdChbMCwgMSwgMl0ubWFwKGluZGV4ID0+IGxlZnQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KGluZGV4LCAxKSkpLnRvRXF1YWwoXG4gICAgICAgIG1peGVkID8gWzEwbiwgMjAsIDAuNV0gOiBbMTBuLCAyMG4sIG51bGxdXG4gICAgICApO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0LmVhY2goWydtaW5pbXVtJywgJ21heGltdW0nXSBhcyBjb25zdCkoXG4gICAgJ3J1bkdyb3VwQnkgc2VsZWN0cyBjaHJvbm9sb2dpY2FsICVzIGZyb20gcmVjb2duaXplZCBDU1YgdGltZXN0YW1wcycsXG4gICAgdGVjaG5pcXVlID0+IHtcbiAgICAgIGNvbnN0IGRlY2VtYmVyID0gJzEyLzMxLzIwMjUgMTA6MDA6MDAnO1xuICAgICAgY29uc3QgamFudWFyeSA9ICcwMS8wMS8yMDI2IDEwOjAwOjAwJztcbiAgICAgIGNvbnN0IGRhdGEgPSBwcm9jZXNzQ3N2RGF0YShcbiAgICAgICAgYGdyb3VwLHRpbWVcXG53ZXN0LCR7ZGVjZW1iZXJ9XFxud2VzdCwke2phbnVhcnl9XFxuZWFzdCwke2phbnVhcnl9XFxuZWFzdCwke2RlY2VtYmVyfVxcbm1pc3NpbmcsYFxuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdDU1YgaW1wb3J0IGZhaWxlZCcpO1xuICAgICAgZXhwZWN0KGRhdGEuZmllbGRzWzFdKS50b01hdGNoT2JqZWN0KHt0eXBlOiAndGltZXN0YW1wJywgZm9ybWF0OiAnTS9EL1lZWVkgSDptOnMnfSk7XG4gICAgICBjb25zdCB0aW1lcyA9IG1ha2VUYWJsZSgndGltZXMnLCBbXSwgW10pO1xuICAgICAgdGltZXMudXBkYXRlU2NoZW1hKGRhdGEpO1xuICAgICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHt0aW1lc319O1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3RpbWVzJykpO1xuICAgICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIGZpZWxkTmFtZTogJ2dyb3VwJyxcbiAgICAgICAgICBhZ2dyZWdhdGlvbnM6IHt0aW1lOiB0ZWNobmlxdWV9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3MocmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0ZWNobmlxdWUgPT09ICdtaW5pbXVtJyA/IGRlY2VtYmVyIDogamFudWFyeTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzdWx0LmRhdGFDb250YWluZXIuZ2V0UGxhaW5JbmRleCgpLm1hcChpID0+IHJlc3VsdC5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoaSkpXG4gICAgICApLnRvRXF1YWwoW1xuICAgICAgICBbJ3dlc3QnLCBleHBlY3RlZF0sXG4gICAgICAgIFsnZWFzdCcsIGV4cGVjdGVkXSxcbiAgICAgICAgWydtaXNzaW5nJywgbnVsbF1cbiAgICAgIF0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5maWVsZHNbMV0pLnRvTWF0Y2hPYmplY3Qoe3R5cGU6ICd0aW1lc3RhbXAnLCBmb3JtYXQ6IGRhdGEuZmllbGRzWzFdLmZvcm1hdH0pO1xuICAgICAgZXhwZWN0KHRpbWVzLmRhdGFDb250YWluZXIudmFsdWVBdCgwLCAxKSkudG9CZShkZWNlbWJlcik7XG4gICAgICBleHBlY3QodGltZXMuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDEsIDEpKS50b0JlKGphbnVhcnkpO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0KCdkZWxldGUgcGFyZW50IGtlZXBzIGRlcml2ZWQgY2hpbGQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1snd2VzdCcsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRHcm91cEJ5Q29uZmlnKG9wLmlkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpKS50b0hhdmVMZW5ndGgoMik7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuY2l0aWVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5cykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdhZGRHcm91cEJ5IHVzZXMgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbe25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sXG4gICAgICBbWyd3ZXN0J11dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLnJlc3VsdExhYmVsKS50b01hdGNoKC9eZ3JvdXAtYnktXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdhZGRKb2luIHVzZXMgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKCdjaXRpZXMnLCBbe25hbWU6ICdpZCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSwgW1snMSddXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkSm9pbignY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmpvaW4tZGF0YXNldC1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NldFNwYXRpYWxKb2luQ29uZmlnIHVwZGF0ZXMgdGhlIHByZWRpY2F0ZScsICgpID0+IHtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZSgncG9seXMnLCBbe25hbWU6ICdnZW9tJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb259XSwgW10pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnaW50ZXJzZWN0cycpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5yZXN1bHRMYWJlbCkudG9CZShgc3BhdGlhbC1qb2luLSR7c3RhdGUuam9pbnNbMF0ucmVzdWx0SWR9YCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7cHJlZGljYXRlOiAnd2l0aGluJ30pXG4gICAgKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucHJlZGljYXRlKS50b0JlKCd3aXRoaW4nKTtcbiAgfSk7XG5cbiAgdGVzdCgnc3BhdGlhbCBqb2lucyBpbXBvcnRlZCBXS1QgYWZ0ZXIgcmVwZWF0ZWQgcnVucyBhbmQgc291cmNlIHJlbG9hZHMgd2l0aG91dCBjaGFuZ2luZyBpdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0gJ1BPTFlHT04gKCgtMTAgLTEwLCAxMCAtMTAsIDEwIDEwLCAtMTAgMTAsIC0xMCAtMTApKSc7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW10sIFtdKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoJ3B0cycsIFtdLCBbXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtwb2x5cywgcHRzfX07XG5cbiAgICBmb3IgKGNvbnN0IGxuZyBvZiBbMCwgMCwgMzBdKSB7XG4gICAgICBjb25zdCBwb2x5Z29uRGF0YSA9IHByb2Nlc3NDc3ZEYXRhKGBnZW9tXFxuXCIke3BvbHlnb259XCJgKTtcbiAgICAgIGNvbnN0IHBvaW50ID0gYFBPSU5UICgke2xuZ30gMClgO1xuICAgICAgY29uc3QgcG9pbnREYXRhID0gcHJvY2Vzc0NzdkRhdGEoYGdlb20sdmFsdWVcXG5cIiR7cG9pbnR9XCIsMTBgKTtcbiAgICAgIGlmICghcG9seWdvbkRhdGEgfHwgIXBvaW50RGF0YSkgdGhyb3cgbmV3IEVycm9yKCdXS1QgQ1NWIGltcG9ydCBmYWlsZWQnKTtcbiAgICAgIHBvbHlzLnVwZGF0ZVNjaGVtYShwb2x5Z29uRGF0YSk7XG4gICAgICBwdHMudXBkYXRlU2NoZW1hKHBvaW50RGF0YSk7XG4gICAgICBleHBlY3QocG9seXMuZmllbGRzWzBdLnR5cGUpLnRvQmUoQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24pO1xuICAgICAgZXhwZWN0KHB0cy5maWVsZHNbMF0udHlwZSkudG9CZShBTExfRklFTERfVFlQRVMuZ2VvanNvbik7XG5cbiAgICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgICAgcmlnaHRHZW86IHtraW5kOiAnZ2VvanNvbicsIGZpZWxkTmFtZTogJ2dlb20nfSxcbiAgICAgICAgICBhZ2dyZWdhdGlvbnM6IHt2YWx1ZTogJ3N1bSd9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blNwYXRpYWxKb2luKG9wLmlkKSk7XG4gICAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXS5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoMCkpLnRvRXF1YWwoW1xuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBsbmcgPT09IDAgPyAxIDogMCxcbiAgICAgICAgbG5nID09PSAwID8gMTAgOiBudWxsXG4gICAgICBdKTtcbiAgICAgIGV4cGVjdChwb2x5cy5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMCkpLnRvQmUocG9seWdvbik7XG4gICAgICBleHBlY3QocHRzLmRhdGFDb250YWluZXIudmFsdWVBdCgwLCAwKSkudG9CZShwb2ludCk7XG4gICAgfVxuICB9KTtcblxuICB0ZXN0KCdkZWxldGUgc3BhdGlhbCBqb2luIHNvdXJjZSBrZWVwcyByZXN1bHQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFtcbiAgICAgICAgICBbLTEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgLTEwXSxcbiAgICAgICAgICBbMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAxMF0sXG4gICAgICAgICAgWy0xMCwgLTEwXVxuICAgICAgICBdXG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZShcbiAgICAgICdwb2x5cycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAnbmFtZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgcG9seWdvbl1dXG4gICAgKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoXG4gICAgICAncHRzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1swLCAwLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzLCBwdHN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7XG4gICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgbGVmdEdlbzoge2tpbmQ6ICdnZW9qc29uJywgZmllbGROYW1lOiAnZ2VvbSd9LFxuICAgICAgICByaWdodEdlbzoge2tpbmQ6ICdsYXRsbmcnLCBsYXRGaWVsZDogJ2xhdCcsIGxuZ0ZpZWxkOiAnbG5nJ30sXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3ZhbHVlOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3BhdGlhbEpvaW4ob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ3B0cycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucHRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnBvbHlzKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdzYXZlL2xvYWQgcm91bmR0cmlwIGtlZXBzIHRoZSBkZXJpdmVkIGRhdGFzZXQgYW5kIGRyb3BzIHRoZSBmaW5pc2hlZCBncm91cCBieScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgMTBdXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3AuaWQsIHtcbiAgICAgICAgZmllbGROYW1lOiAncmVnaW9uJyxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7cG9wOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGNvbnN0IHNhdmVkID0gU2NoZW1hTWFuYWdlci5zYXZlKHtcbiAgICAgIHZpc1N0YXRlOiBzdGF0ZSxcbiAgICAgIG1hcFN0YXRlOiB7fSxcbiAgICAgIG1hcFN0eWxlOiB7fSxcbiAgICAgIHVpU3RhdGU6IHt9XG4gICAgfSk7XG4gICAgY29uc3QgZGVyaXZlZCA9IHNhdmVkLmRhdGFzZXRzLmZpbmQoZGF0YXNldCA9PiBkYXRhc2V0LmRhdGEuaWQgPT09IG9wLnJlc3VsdElkKTtcbiAgICBjb25zdCBkZXJpdmVkTWV0YSA9IGRlcml2ZWQ/LmRhdGEubWV0YWRhdGEgYXNcbiAgICAgIHwge2Rlcml2ZWREYXRhc2V0Pzoge3R5cGU/OiBzdHJpbmd9IHwgbnVsbH1cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGV4cGVjdChkZXJpdmVkTWV0YT8uZGVyaXZlZERhdGFzZXQ/LnR5cGUpLnRvQmUoJ2dyb3VwQnknKTtcbiAgICBleHBlY3Qoc2F2ZWQuY29uZmlnLmNvbmZpZy52aXNTdGF0ZS5ncm91cEJ5cyA/PyBbXSkudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnc3VpdGFiaWxpdHkgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICBmdW5jdGlvbiBzaXRlU3RhdGUoKTogVmlzU3RhdGUge1xuICAgIGNvbnN0IHNpdGVzID0gbWFrZVRhYmxlKFxuICAgICAgJ3NpdGVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnbGF0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2xuZycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdhY2Nlc3MnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn0sXG4gICAgICAgIHtuYW1lOiAnY29zdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWydhJywgMCwgMCwgMCwgMTAwXSxcbiAgICAgICAgWydiJywgMSwgMSwgNSwgMjAwXSxcbiAgICAgICAgWydjJywgMiwgMiwgMTAsIDMwMF1cbiAgICAgIF1cbiAgICApO1xuICAgIHJldHVybiB7Li4uSU5JVElBTF9WSVNfU1RBVEUsIGRhdGFzZXRzOiB7c2l0ZXN9fTtcbiAgfVxuXG4gIHRlc3QoJ2FkZFN1aXRhYmlsaXR5IHNlZWRzIG51bWVyaWMgd2VpZ2h0cyBhbmQgYSBzaG9ydCByYW5kb20gcmVzdWx0IG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcblxuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuICAgIGV4cGVjdChvcC53ZWlnaHRzKS50b0VxdWFsKHtsYXQ6IDEsIGxuZzogMSwgYWNjZXNzOiAxLCBjb3N0OiAxfSk7XG4gICAgZXhwZWN0KG9wLndlaWdodFN0YW5kYXJkaXphdGlvbikudG9CZSgnbm9ybWFsaXplJyk7XG4gICAgZXhwZWN0KG9wLmRhdGFTdGFuZGFyZGl6YXRpb24pLnRvQmUoJ3JhbmdlJyk7XG4gICAgZXhwZWN0KG9wLm91dHB1dEZpZWxkTmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgICBleHBlY3Qob3AucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15zdWl0YWJpbGl0eS1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ29wZW5pbmcgYSBzdWl0YWJpbGl0eSBvcCBjbG9zZXMgYW4gb3BlbiBncm91cCBieScsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3J1blN1aXRhYmlsaXR5IGFkZHMgYSBzY29yZWQgZGF0YXNldCBhbmQgYSBkZWZhdWx0IGxheWVyJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTdWl0YWJpbGl0eUNvbmZpZyhvcC5pZCwge3dlaWdodHM6IHthY2Nlc3M6IDEsIGNvc3Q6IDF9fSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHJlc3VsdC5tZXRhZGF0YS5kZXJpdmVkRGF0YXNldCkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnc3VpdGFiaWxpdHknLFxuICAgICAgc291cmNlRGF0YUlkczogWydzaXRlcyddLFxuICAgICAgb3BlcmF0aW9uSWQ6IG9wLmlkXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpKS50b0NvbnRhaW4oJ3Njb3JlJyk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChpdGVtID0+IGl0ZW0uY29uZmlnLmRhdGFJZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGV4cGVjdChsYXllcikudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChsYXllcj8uY29uZmlnLmNvbG9yRmllbGQ/Lm5hbWUpLnRvQmUoJ3Njb3JlJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3J1bm5pbmcgd2l0aG91dCBhIHdlaWdodGVkIGZpZWxkIHN1cmZhY2VzIGFuIGVycm9yIGluc3RlYWQgb2YgYSBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5zZXRTdWl0YWJpbGl0eUNvbmZpZyhvcC5pZCwge3dlaWdodHM6IHt9fSkpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXNbMF0uZXJyb3IpLnRvQmUoJ1NlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgdG8gc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0aW5nIHRoZSBzb3VyY2UgZGF0YXNldCBkcm9wcyB0aGUgb3AgYnV0IGtlZXBzIHRoZSBzY29yZWQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TdWl0YWJpbGl0eShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnNpdGVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3RoZSBvcCBjb25maWcgc3RheXMgb3V0IG9mIHNhdmVkIG1hcHMgd2hpbGUgdGhlIGRlcml2ZWQgZGF0YXNldCBwZXJzaXN0cycsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcblxuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlKS5ub3QudG9IYXZlUHJvcGVydHkoJ3N1aXRhYmlsaXRpZXMnKTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnc3VpdGFiaWxpdHknKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ25hdGl2ZSBHZW9BcnJvdyBhdHRyaWJ1dGUgam9pbnMnLCAoKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhS2V5ID0gJ0FSUk9XOmV4dGVuc2lvbjpuYW1lJztcbiAgY29uc3QgcG9pbnQgPSAoeDogbnVtYmVyKSA9PiAoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzOiBbeCwgeCArIDFdfSk7XG4gIGNvbnN0IG11bHRpID0gKHg6IG51bWJlcikgPT4gKHtcbiAgICB0eXBlOiAnTXVsdGlQb2ludCcsXG4gICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgIFt4LCB4ICsgMV0sXG4gICAgICBbeCArIDIsIHggKyAzXVxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IHBvaW50VHlwZSA9IG5ldyBhcnJvdy5GaXhlZFNpemVMaXN0KDIsIG5ldyBhcnJvdy5GaWVsZCgneHknLCBuZXcgYXJyb3cuRmxvYXQ2NCgpLCBmYWxzZSkpO1xuICBjb25zdCBsaXN0ID0gKHR5cGU6IGFycm93LkRhdGFUeXBlKSA9PiBuZXcgYXJyb3cuTGlzdChuZXcgYXJyb3cuRmllbGQoJ2l0ZW0nLCB0eXBlLCB0cnVlKSk7XG4gIGNvbnN0IG9yaWdpbmFsUmVzcG9uc2UgPSBnbG9iYWxUaGlzLlJlc3BvbnNlO1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGdsb2JhbFRoaXMuUmVzcG9uc2UgPSBSZXNwb25zZSBhcyBhbnk7XG4gIH0pO1xuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gIH0pO1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBuYXRpdmVTb3VyY2UoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBlbmNvZGluZzogc3RyaW5nLFxuICAgIHR5cGU6IGFycm93LkRhdGFUeXBlLFxuICAgIGNvb3JkaW5hdGVzOiBhbnlbXSxcbiAgICBrZXlzID0gY29vcmRpbmF0ZXMubWFwKChfLCBpKSA9PiBTdHJpbmcoaSkpXG4gICkge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IGFycm93LlRhYmxlKHtcbiAgICAgIGtleTogYXJyb3cudmVjdG9yRnJvbUFycmF5KGtleXMpLFxuICAgICAgZ2VvbWV0cnk6IGFycm93LnZlY3RvckZyb21BcnJheShjb29yZGluYXRlcywgdHlwZSlcbiAgICB9KTtcbiAgICBpbnB1dC5zY2hlbWEuZmllbGRzWzFdLm1ldGFkYXRhLnNldChtZXRhZGF0YUtleSwgZW5jb2RpbmcpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBhcnJvdy50YWJsZUZyb21JUEMoYXJyb3cudGFibGVUb0lQQyhpbnB1dCwgJ3N0cmVhbScpKTtcbiAgICBjb25zdCBbZmlsZV0gPSBhd2FpdCBwcm9jZXNzRmlsZURhdGEoe1xuICAgICAgY29udGVudDoge2ZpbGVOYW1lOiBgJHtpZH0uYXJyb3dgLCBkYXRhOiBkZWNvZGVkLmJhdGNoZXN9LFxuICAgICAgZmlsZUNhY2hlOiBbXVxuICAgIH0gYXMgYW55KTtcbiAgICBjb25zdCBkYXRhc2V0ID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQsIGxhYmVsOiBpZH0sIGNvbG9yOiBbMSwgMiwgM119KTtcbiAgICBhd2FpdCBkYXRhc2V0LmltcG9ydERhdGEoe2RhdGE6IGZpbGUuZGF0YSBhcyBhbnl9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNvdXJjZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGtpbmQ6ICdQb2ludCcgfCAnTXVsdGlQb2ludCcsXG4gICAga2V5cyA9IFsnYScsICdiJ10sXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSA9IFsxMCwgNDBdXG4gICkge1xuICAgIHJldHVybiBuYXRpdmVTb3VyY2UoXG4gICAgICBpZCxcbiAgICAgIGBnZW9hcnJvdy4ke2tpbmQudG9Mb3dlckNhc2UoKX1gLFxuICAgICAga2luZCA9PT0gJ1BvaW50JyA/IHBvaW50VHlwZSA6IGxpc3QocG9pbnRUeXBlKSxcbiAgICAgIHZhbHVlcy5tYXAoeCA9PiAoeCA9PT0gbnVsbCA/IG51bGwgOiAoa2luZCA9PT0gJ1BvaW50JyA/IHBvaW50KHgpIDogbXVsdGkoeCkpLmNvb3JkaW5hdGVzKSksXG4gICAgICBrZXlzXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGpvaW4obGVmdDogS2VwbGVyVGFibGUsIHJpZ2h0OiBLZXBsZXJUYWJsZSwgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pIHtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0gey4uLklOSVRJQUxfVklTX1NUQVRFLCBkYXRhc2V0czoge1tsZWZ0LmlkXTogbGVmdCwgW3JpZ2h0LmlkXTogcmlnaHR9fTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkSm9pbihsZWZ0LmlkKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0Sm9pbkNvbmZpZyhvcC5pZCwge1xuICAgICAgICByaWdodERhdGFJZDogcmlnaHQuaWQsXG4gICAgICAgIGxlZnRGaWVsZDogJ2tleScsXG4gICAgICAgIHJpZ2h0RmllbGQ6ICdrZXknLFxuICAgICAgICB0eXBlOiAnTEVGVCcsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Kb2luKG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuICAgIHJldHVybiB7c3RhdGUsIHJlc3VsdDogc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdLCByZXN1bHRJZDogb3AucmVzdWx0SWR9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmVhdHVyZXMoZGF0YXNldDogS2VwbGVyVGFibGUsIGZpZWxkSW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwcm9wcyA9IEdlb0pzb25MYXllci5maW5kRGVmYXVsdExheWVyUHJvcHMoZGF0YXNldCkucHJvcHM7XG4gICAgZXhwZWN0KHByb3BzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIGNvbnN0IGxheWVyID0gbmV3IEdlb0pzb25MYXllcih7XG4gICAgICAuLi5wcm9wc1swXSxcbiAgICAgIGRhdGFJZDogZGF0YXNldC5pZCxcbiAgICAgIC4uLihmaWVsZEluZGV4ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHtjb2x1bW5zOiB7Z2VvanNvbjoge3ZhbHVlOiBkYXRhc2V0LmZpZWxkc1tmaWVsZEluZGV4XS5uYW1lLCBmaWVsZElkeDogZmllbGRJbmRleH19fSlcbiAgICB9IGFzIGFueSk7XG4gICAgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnKGRhdGFzZXQpO1xuICAgIHJldHVybiAobGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKHtbZGF0YXNldC5pZF06IGRhdGFzZXR9LCB7fSkgYXMgYW55KS5kYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gcmF3RmluZ2VycHJpbnQoZGF0YXNldDogS2VwbGVyVGFibGUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSAoZGF0YXNldC5kYXRhQ29udGFpbmVyIGFzIGFueSkuZ2V0Q29sdW1uKDEpO1xuICAgIGNvbnN0IGJ5dGVzID0gKGRhdGE6IGFueSk6IGFueSA9PiAoe1xuICAgICAgdHlwZTogU3RyaW5nKGRhdGEudHlwZSksXG4gICAgICBvZmZzZXQ6IGRhdGEub2Zmc2V0LFxuICAgICAgbGVuZ3RoOiBkYXRhLmxlbmd0aCxcbiAgICAgIG51bGxDb3VudDogZGF0YS5udWxsQ291bnQsXG4gICAgICBidWZmZXJzOiBkYXRhLmJ1ZmZlcnMubWFwKChiOiBhbnkpID0+XG4gICAgICAgIGIgPyBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGIuYnVmZmVyLCBiLmJ5dGVPZmZzZXQsIGIuYnl0ZUxlbmd0aCkpIDogbnVsbFxuICAgICAgKSxcbiAgICAgIGNoaWxkcmVuOiBkYXRhLmNoaWxkcmVuLm1hcChieXRlcylcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgY2h1bmtzOiBjb2x1bW4uZGF0YS5zbGljZSgpLFxuICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoY29sdW1uLmRhdGEubWFwKGJ5dGVzKSksXG4gICAgICBtZXRhZGF0YTogQXJyYXkuZnJvbShkYXRhc2V0LmZpZWxkc1sxXS5tZXRhZGF0YSEuZW50cmllcygpKVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRVbmNoYW5nZWQoZGF0YXNldDogS2VwbGVyVGFibGUsIGJlZm9yZTogUmV0dXJuVHlwZTx0eXBlb2YgcmF3RmluZ2VycHJpbnQ+KSB7XG4gICAgY29uc3QgYWZ0ZXIgPSByYXdGaW5nZXJwcmludChkYXRhc2V0KTtcbiAgICBleHBlY3QoYWZ0ZXIuY29sdW1uKS50b0JlKGJlZm9yZS5jb2x1bW4pO1xuICAgIGFmdGVyLmNodW5rcy5mb3JFYWNoKChjaHVuazogYW55LCBpOiBudW1iZXIpID0+IGV4cGVjdChjaHVuaykudG9CZShiZWZvcmUuY2h1bmtzW2ldKSk7XG4gICAgZXhwZWN0KGFmdGVyLmNvbnRlbnQpLnRvQmUoYmVmb3JlLmNvbnRlbnQpO1xuICAgIGV4cGVjdChhZnRlci5tZXRhZGF0YSkudG9FcXVhbChiZWZvcmUubWV0YWRhdGEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcm91bmR0cmlwKGRhdGFzZXQ6IEtlcGxlclRhYmxlKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBkYXRhc2V0U2NoZW1hW1ZFUlNJT05TLnYxXS5zYXZlKGRhdGFzZXQpO1xuICAgIGNvbnN0IGxvYWRlZCA9IGRhdGFzZXRTY2hlbWFbVkVSU0lPTlMudjFdLmxvYWQoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzYXZlZCkpKTtcbiAgICByZXR1cm4gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6IGAke2RhdGFzZXQuaWR9LXJlbG9hZGB9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKFxuICAgICAgbG9hZGVkLmRhdGFcbiAgICApO1xuICB9XG5cbiAgdGVzdC5lYWNoKFsnUG9pbnQnLCAnTXVsdGlQb2ludCddIGFzIGNvbnN0KShcbiAgICAncHJlc2VydmVzIGltcG9ydGVkICVzIGdlb21ldHJ5IHRocm91Z2ggam9pbiBhY3Rpb25zLCBsYXllciBhY2Nlc3NvcnMsIGV4cG9ydCBhbmQgcmVsb2FkJyxcbiAgICBhc3luYyBraW5kID0+IHtcbiAgICAgIGNvbnN0IGxlZnQgPSBhd2FpdCBzb3VyY2UoJ25hdGl2ZScsIGtpbmQpO1xuICAgICAgY29uc3QgYmVmb3JlID0gcmF3RmluZ2VycHJpbnQobGVmdCk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZShcbiAgICAgICAgJ2xvb2t1cCcsXG4gICAgICAgIFtcbiAgICAgICAgICB7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfSxcbiAgICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ3JlYWwnfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgWydhJywgMV0sXG4gICAgICAgICAgWydiJywgMl1cbiAgICAgICAgXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gWzEwLCA0MF0ubWFwKHggPT4gKGtpbmQgPT09ICdQb2ludCcgPyBwb2ludCh4KSA6IG11bHRpKHgpKSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKGxlZnQuZGF0YUNvbnRhaW5lciwgbGVmdC5maWVsZHMpLmZlYXR1cmVzLm1hcChmID0+IGYuZ2VvbWV0cnkpXG4gICAgICApLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgY29uc3Qge3Jlc3VsdCwgc3RhdGV9ID0gam9pbihsZWZ0LCByaWdodCk7XG4gICAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lKS50b0JlKCdSb3dEYXRhQ29udGFpbmVyJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmRhdGFDb250YWluZXIubnVtUm93cygpKS50b0JlKDIpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5maWVsZHNbMV0pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgIGFuYWx5emVyVHlwZTogJ0dFT01FVFJZX0ZST01fU1RSSU5HJ1xuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0LmZpZWxkc1sxXS5tZXRhZGF0YSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KEpTT04ucGFyc2UocmVzdWx0LmZpZWxkc1sxXS52YWx1ZUFjY2Vzc29yKHtpbmRleDogMH0pKSkudG9FcXVhbChleHBlY3RlZFswXSk7XG4gICAgICBleHBlY3QocmVzdWx0LmZpZWxkc1szXS52YWx1ZUFjY2Vzc29yKHtpbmRleDogMX0pKS50b0JlKDIpO1xuICAgICAgZXhwZWN0KHN0YXRlLmxheWVycy5maWx0ZXIobGF5ZXIgPT4gbGF5ZXIuY29uZmlnLmRhdGFJZCA9PT0gcmVzdWx0LmlkKSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldCkubWFwKChmOiBhbnkpID0+IGYuZ2VvbWV0cnkpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKGRhdGFzZXQuZGF0YUNvbnRhaW5lciwgZGF0YXNldC5maWVsZHMpLmZlYXR1cmVzLm1hcChcbiAgICAgICAgICAgIGYgPT4gZi5nZW9tZXRyeVxuICAgICAgICAgIClcbiAgICAgICAgKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBwcm9jZXNzR2VvanNvbih7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgIGZlYXR1cmVzOiBleHBlY3RlZC5tYXAoKGdlb21ldHJ5LCBpKSA9PiAoe1xuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICBnZW9tZXRyeSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7a2V5OiBbJ2EnLCAnYiddW2ldfVxuICAgICAgICB9KSlcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgS2VwbGVyVGFibGUoe2luZm86IHtpZDogJ2dlb2pzb24nfSwgY29sb3I6IFsxLCAyLCAzXX0pLnVwZGF0ZVNjaGVtYShcbiAgICAgICAgZGF0YSFcbiAgICAgICk7XG4gICAgICBleHBlY3QoZmVhdHVyZXMoam9pbihjb250cm9sLCByaWdodCkucmVzdWx0KS5tYXAoKGY6IGFueSkgPT4gZi5nZW9tZXRyeSkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKGxlZnQsIGJlZm9yZSk7XG4gICAgfVxuICApO1xuXG4gIHRlc3QuZWFjaChbJ1BvaW50JywgJ011bHRpUG9pbnQnXSBhcyBjb25zdCkoXG4gICAgJ3ByZXNlcnZlcyAlcyBvbiBib3RoIHNpZGVzIHdpdGggZHVwbGljYXRlcywgbnVsbHMsIHVubWF0Y2hlZCByb3dzIGFuZCBlbXB0eSBqb2lucycsXG4gICAgYXN5bmMga2luZCA9PiB7XG4gICAgICBjb25zdCBsZWZ0ID0gYXdhaXQgc291cmNlKCdsZWZ0Jywga2luZCwgWydhJywgJ2InLCAnYycsIG51bGxdIGFzIGFueSwgWzEwLCBudWxsLCA0MCwgNzBdKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gYXdhaXQgc291cmNlKCdyaWdodCcsIGtpbmQsIFsnYScsICdhJywgJ2QnLCBudWxsXSBhcyBhbnksIFsyMCwgbnVsbCwgNTAsIDgwXSk7XG4gICAgICBjb25zdCBiZWZvcmVMZWZ0ID0gcmF3RmluZ2VycHJpbnQobGVmdCk7XG4gICAgICBjb25zdCBiZWZvcmVSaWdodCA9IHJhd0ZpbmdlcnByaW50KHJpZ2h0KTtcbiAgICAgIGZvciAoY29uc3QgW3R5cGUsIGV4cGVjdGVkUm93cywgbGVmdEZlYXR1cmVzLCByaWdodEZlYXR1cmVzXSBvZiBbXG4gICAgICAgIFsnTEVGVCcsIDUsIDQsIDFdLFxuICAgICAgICBbJ0lOTkVSJywgMiwgMiwgMV0sXG4gICAgICAgIFsnRlVMTCcsIDcsIDQsIDNdXG4gICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgIGNvbnN0IHtyZXN1bHQsIHN0YXRlfSA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlfSk7XG4gICAgICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgICAgICBleHBlY3QocmVzdWx0LmRhdGFDb250YWluZXIubnVtUm93cygpKS50b0JlKGV4cGVjdGVkUm93cyk7XG4gICAgICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBbcmVzdWx0LCByb3VuZHRyaXAocmVzdWx0KV0pIHtcbiAgICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldCwgMSkpLnRvSGF2ZUxlbmd0aChsZWZ0RmVhdHVyZXMpO1xuICAgICAgICAgIGV4cGVjdChmZWF0dXJlcyhkYXRhc2V0LCAzKSkudG9IYXZlTGVuZ3RoKHJpZ2h0RmVhdHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDEsIDMpKS50b0JlTnVsbCgpO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ0lOTkVSJykgZXhwZWN0KHJlc3VsdC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMiwgMSkpLnRvQmVOdWxsKCk7XG4gICAgICAgIGlmICh0eXBlID09PSAnRlVMTCcpIGV4cGVjdChyZXN1bHQuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDUsIDEpKS50b0JlTnVsbCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgZW1wdHkgPSBqb2luKGxlZnQsIGF3YWl0IHNvdXJjZSgnYWJzZW50Jywga2luZCwgWydub25lJ10sIFs5MF0pLCB7XG4gICAgICAgIHR5cGU6ICdJTk5FUidcbiAgICAgIH0pLnJlc3VsdDtcbiAgICAgIGV4cGVjdChlbXB0eS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgwKTtcbiAgICAgIGV4cGVjdChmZWF0dXJlcyhlbXB0eSwgMSkpLnRvRXF1YWwoW10pO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKGxlZnQsIGJlZm9yZUxlZnQpO1xuICAgICAgYXNzZXJ0VW5jaGFuZ2VkKHJpZ2h0LCBiZWZvcmVSaWdodCk7XG4gICAgfVxuICApO1xuXG4gIHRlc3QuZWFjaChbMywgNF0pKFxuICAgICdwcmVzZXJ2ZXMgcHJlY2lzaW9uIGFuZCBhbGwgJWkgbmF0aXZlIGNvb3JkaW5hdGUgb3JkaW5hdGVzJyxcbiAgICBhc3luYyBkaW1lbnNpb25zID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gWy0xMjIuNDEyMzQ1Njc4OTAxMjMsIDM3LjgxMjM0NTY3ODkwMTIzLCAxMjMuNDU2Nzg5MDEyMywgOTkuMTI1XS5zbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgZGltZW5zaW9uc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBuZXcgYXJyb3cuRml4ZWRTaXplTGlzdChcbiAgICAgICAgZGltZW5zaW9ucyxcbiAgICAgICAgbmV3IGFycm93LkZpZWxkKCdjb29yZGluYXRlJywgbmV3IGFycm93LkZsb2F0NjQoKSwgZmFsc2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZSgnbmF0aXZlJywgJ2dlb2Fycm93LnBvaW50JywgdHlwZSwgW2Nvb3JkaW5hdGVzXSk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddXSk7XG4gICAgICBjb25zdCB7cmVzdWx0fSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldClbMF0uZ2VvbWV0cnkpLnRvRXF1YWwoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzfSk7XG4gICAgICAgIGV4cGVjdChcbiAgICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihkYXRhc2V0LmRhdGFDb250YWluZXIsIGRhdGFzZXQuZmllbGRzKS5mZWF0dXJlc1swXS5nZW9tZXRyeVxuICAgICAgICApLnRvRXF1YWwoe3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzfSk7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIHRlc3QoJ3ByZXNlcnZlcyBlbXB0eSBuYXRpdmUgUG9pbnRzIHNlcGFyYXRlbHkgZnJvbSBudWxsIGdlb21ldHJ5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxlZnQgPSBhd2FpdCBuYXRpdmVTb3VyY2UoJ25hdGl2ZScsICdnZW9hcnJvdy5wb2ludCcsIHBvaW50VHlwZSwgW1xuICAgICAgWzEwLCAxMV0sXG4gICAgICBbTmFOLCBOYU5dLFxuICAgICAgbnVsbFxuICAgIF0pO1xuICAgIGNvbnN0IGJlZm9yZSA9IHJhd0ZpbmdlcnByaW50KGxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWycwJ10sIFsnMSddLCBbJzInXV0pO1xuICAgIGNvbnN0IHtyZXN1bHQsIHN0YXRlfSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW3BvaW50KDEwKSwge3R5cGU6ICdQb2ludCcsIGNvb3JkaW5hdGVzOiBbXX0sIG51bGxdO1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBbcmVzdWx0LCByb3VuZHRyaXAocmVzdWx0KV0pIHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZGF0YXNldFRvRmVhdHVyZUNvbGxlY3Rpb24oZGF0YXNldC5kYXRhQ29udGFpbmVyLCBkYXRhc2V0LmZpZWxkcykuZmVhdHVyZXMubWFwKFxuICAgICAgICAgIGYgPT4gZi5nZW9tZXRyeVxuICAgICAgICApXG4gICAgICApLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgZXhwZWN0KGZlYXR1cmVzKGRhdGFzZXQpLm1hcCgoZjogYW55KSA9PiBmLmdlb21ldHJ5KSkudG9FcXVhbChleHBlY3RlZC5zbGljZSgwLCAyKSk7XG4gICAgfVxuICAgIGFzc2VydFVuY2hhbmdlZChsZWZ0LCBiZWZvcmUpO1xuICB9KTtcblxuICB0ZXN0LmVhY2goW1xuICAgIFtcbiAgICAgICdMaW5lU3RyaW5nJyxcbiAgICAgIDEsXG4gICAgICBbXG4gICAgICAgIFsxMCwgMTFdLFxuICAgICAgICBbMTIsIDEzXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ1BvbHlnb24nLFxuICAgICAgMixcbiAgICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgIFsxMCwgMTFdLFxuICAgICAgICAgIFsxMiwgMTFdLFxuICAgICAgICAgIFsxMiwgMTNdLFxuICAgICAgICAgIFsxMCwgMTFdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICBdLFxuICAgIFtcbiAgICAgICdNdWx0aVBvaW50JyxcbiAgICAgIDEsXG4gICAgICBbXG4gICAgICAgIFsxMCwgMTFdLFxuICAgICAgICBbMTIsIDEzXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ011bHRpTGluZVN0cmluZycsXG4gICAgICAyLFxuICAgICAgW1xuICAgICAgICBbXG4gICAgICAgICAgWzEwLCAxMV0sXG4gICAgICAgICAgWzEyLCAxM11cbiAgICAgICAgXVxuICAgICAgXVxuICAgIF0sXG4gICAgW1xuICAgICAgJ011bHRpUG9seWdvbicsXG4gICAgICAzLFxuICAgICAgW1xuICAgICAgICBbXG4gICAgICAgICAgW1xuICAgICAgICAgICAgWzEwLCAxMV0sXG4gICAgICAgICAgICBbMTIsIDExXSxcbiAgICAgICAgICAgIFsxMiwgMTNdLFxuICAgICAgICAgICAgWzEwLCAxMV1cbiAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICBdXG4gIF0pKCdyZXRhaW5zICVzIGNvb3JkaW5hdGVzIGFuZCBlbXB0eSBnZW9tZXRyaWVzJywgYXN5bmMgKGtpbmQsIGRlcHRoLCBjb29yZGluYXRlcykgPT4ge1xuICAgIGxldCB0eXBlOiBhcnJvdy5EYXRhVHlwZSA9IHBvaW50VHlwZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE51bWJlcihkZXB0aCk7IGkrKykgdHlwZSA9IGxpc3QodHlwZSk7XG4gICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZSgnbmF0aXZlJywgYGdlb2Fycm93LiR7U3RyaW5nKGtpbmQpLnRvTG93ZXJDYXNlKCl9YCwgdHlwZSwgW1xuICAgICAgY29vcmRpbmF0ZXMsXG4gICAgICBbXSxcbiAgICAgIG51bGxcbiAgICBdKTtcbiAgICBjb25zdCBiZWZvcmUgPSByYXdGaW5nZXJwcmludChsZWZ0KTtcbiAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddLCBbJzEnXSwgWycyJ11dKTtcbiAgICBjb25zdCB7cmVzdWx0LCBzdGF0ZX0gPSBqb2luKGxlZnQsIHJpZ2h0KTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFt7dHlwZToga2luZCwgY29vcmRpbmF0ZXN9LCB7dHlwZToga2luZCwgY29vcmRpbmF0ZXM6IFtdfSwgbnVsbF07XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIFtyZXN1bHQsIHJvdW5kdHJpcChyZXN1bHQpXSkge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihkYXRhc2V0LmRhdGFDb250YWluZXIsIGRhdGFzZXQuZmllbGRzKS5mZWF0dXJlcy5tYXAoXG4gICAgICAgICAgZiA9PiBmLmdlb21ldHJ5XG4gICAgICAgIClcbiAgICAgICkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICBleHBlY3QoZmVhdHVyZXMoZGF0YXNldClbMF0uZ2VvbWV0cnkpLnRvRXF1YWwoZXhwZWN0ZWRbMF0pO1xuICAgIH1cbiAgICBhc3NlcnRVbmNoYW5nZWQobGVmdCwgYmVmb3JlKTtcbiAgfSk7XG5cbiAgdGVzdC5lYWNoKFtcbiAgICBbJ2dlb2Fycm93LnBvaW50JywgcG9pbnRUeXBlLCBbWzEwLCBJbmZpbml0eV1dXSxcbiAgICBbJ2dlb2Fycm93LnBvaW50JywgcG9pbnRUeXBlLCBbWzEwLCBOYU5dXV0sXG4gICAgW1xuICAgICAgJ2dlb2Fycm93LnBvaW50JyxcbiAgICAgIG5ldyBhcnJvdy5TdHJ1Y3QoW1xuICAgICAgICBuZXcgYXJyb3cuRmllbGQoJ3gnLCBuZXcgYXJyb3cuRmxvYXQ2NCgpLCBmYWxzZSksXG4gICAgICAgIG5ldyBhcnJvdy5GaWVsZCgneScsIG5ldyBhcnJvdy5GbG9hdDY0KCksIGZhbHNlKVxuICAgICAgXSksXG4gICAgICBbe3g6IDEwLCB5OiAxMX1dXG4gICAgXSxcbiAgICBbXG4gICAgICAnZ2VvYXJyb3cucG9pbnQnLFxuICAgICAgbmV3IGFycm93LkZpeGVkU2l6ZUxpc3QoMSwgbmV3IGFycm93LkZpZWxkKCd4JywgbmV3IGFycm93LkZsb2F0NjQoKSwgZmFsc2UpKSxcbiAgICAgIFtbMTBdXVxuICAgIF0sXG4gICAgWydnZW9hcnJvdy5tdWx0aXBvaW50JywgbGlzdChwb2ludFR5cGUpLCBbW1sxMCwgMTFdLCBudWxsXV1dLFxuICAgIFsnZ2VvYXJyb3cudW5rbm93bicsIHBvaW50VHlwZSwgW1sxMCwgMTFdXV1cbiAgXSkoXG4gICAgJ3N1cmZhY2VzIGludmFsaWQgb3IgdW5zdXBwb3J0ZWQgJXMgaW5zdGVhZCBvZiBjcmVhdGluZyBjb3JydXB0IG91dHB1dCcsXG4gICAgYXN5bmMgKGVuY29kaW5nLCB0eXBlLCBjb29yZGluYXRlcykgPT4ge1xuICAgICAgY29uc3QgbGVmdCA9IGF3YWl0IG5hdGl2ZVNvdXJjZShcbiAgICAgICAgJ25hdGl2ZScsXG4gICAgICAgIGVuY29kaW5nIGFzIHN0cmluZyxcbiAgICAgICAgdHlwZSBhcyBhcnJvdy5EYXRhVHlwZSxcbiAgICAgICAgY29vcmRpbmF0ZXMgYXMgYW55W11cbiAgICAgICk7XG4gICAgICBjb25zdCByaWdodCA9IG1ha2VUYWJsZSgnbG9va3VwJywgW3tuYW1lOiAna2V5JywgdHlwZTogJ3N0cmluZyd9XSwgW1snMCddXSk7XG4gICAgICBjb25zdCBiZWZvcmUgPSByYXdGaW5nZXJwcmludChsZWZ0KTtcbiAgICAgIGNvbnN0IHtzdGF0ZSwgcmVzdWx0fSA9IGpvaW4obGVmdCwgcmlnaHQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLmVycm9yKS50b01hdGNoKC9nZW9tZXRyeS4qcm93IDEvaSk7XG4gICAgICBhc3NlcnRVbmNoYW5nZWQobGVmdCwgYmVmb3JlKTtcbiAgICAgIC8vIE9taXR0ZWQgZ2VvbWV0cnkgYW5kIG5vbm1hdGNoaW5nIElOTkVSIHJvd3MgbXVzdCBub3QgYmUgY29udmVydGVkIGVhZ2VybHkuXG4gICAgICBleHBlY3Qoam9pbihsZWZ0LCByaWdodCwge2xlZnRDb2x1bW5zOiBbJ2tleSddfSkucmVzdWx0LmRhdGFDb250YWluZXIucm93QXNBcnJheSgwKSkudG9FcXVhbChbXG4gICAgICAgICcwJyxcbiAgICAgICAgJzAnXG4gICAgICBdKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgam9pbihsZWZ0LCBtYWtlVGFibGUoJ2Fic2VudCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2Fic2VudCddXSksIHtcbiAgICAgICAgICB0eXBlOiAnSU5ORVInXG4gICAgICAgIH0pLnJlc3VsdC5kYXRhQ29udGFpbmVyLm51bVJvd3MoKVxuICAgICAgKS50b0JlKDApO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0LmVhY2goWyd3a2InLCAnd2t0J10gYXMgY29uc3QpKFxuICAgICdwcmVzZXJ2ZXMgJXMgZ2VvbWV0cnkgdGhyb3VnaCBjaGFpbmVkIGF0dHJpYnV0ZSBqb2lucycsXG4gICAgYXN5bmMgZW5jb2RpbmcgPT4ge1xuICAgICAgY29uc3QgZ2VvbWV0cnkgPSB7dHlwZTogJ1BvaW50JyBhcyBjb25zdCwgY29vcmRpbmF0ZXM6IFsxMCwgMTFdfTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgZW5jb2RpbmcgPT09ICd3a2InID8gbmV3IFVpbnQ4QXJyYXkoY29udmVydEdlb21ldHJ5VG9XS0IoZ2VvbWV0cnkpKSA6ICdQT0lOVCAoMTAgMTEpJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYXdhaXQgbmF0aXZlU291cmNlKFxuICAgICAgICAnc291cmNlJyxcbiAgICAgICAgYGdlb2Fycm93LiR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd3a2InID8gbmV3IGFycm93LkJpbmFyeSgpIDogbmV3IGFycm93LlV0ZjgoKSxcbiAgICAgICAgW3ZhbHVlLCBudWxsXSxcbiAgICAgICAgWydhJywgJ2InXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYiddXSk7XG4gICAgICBsZXQgbGVmdCA9IG9yaWdpbmFsO1xuICAgICAgZm9yIChsZXQgcnVuID0gMDsgcnVuIDwgMjsgcnVuKyspIHtcbiAgICAgICAgY29uc3Qge3N0YXRlLCByZXN1bHR9ID0gam9pbihsZWZ0LCByaWdodCwge3JpZ2h0Q29sdW1uczogW119KTtcbiAgICAgICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgICAgIGV4cGVjdChcbiAgICAgICAgICBkYXRhc2V0VG9GZWF0dXJlQ29sbGVjdGlvbihyZXN1bHQuZGF0YUNvbnRhaW5lciwgcmVzdWx0LmZpZWxkcykuZmVhdHVyZXMubWFwKFxuICAgICAgICAgICAgZmVhdHVyZSA9PiBmZWF0dXJlLmdlb21ldHJ5XG4gICAgICAgICAgKVxuICAgICAgICApLnRvRXF1YWwoW2dlb21ldHJ5LCBudWxsXSk7XG4gICAgICAgIGV4cGVjdChmZWF0dXJlcyhyZXN1bHQpLm1hcCgoZmVhdHVyZTogYW55KSA9PiBmZWF0dXJlLmdlb21ldHJ5KSkudG9FcXVhbChbZ2VvbWV0cnldKTtcbiAgICAgICAgbGVmdCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGV4cGVjdChvcmlnaW5hbC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMSkpLnRvRXF1YWwodmFsdWUpO1xuICAgICAgZXhwZWN0KG9yaWdpbmFsLmRhdGFDb250YWluZXIudmFsdWVBdCgxLCAxKSkudG9CZU51bGwoKTtcbiAgICB9XG4gICk7XG5cbiAgdGVzdCgnam9pbnMgdW5hbm5vdGF0ZWQgV0tCIGlkZW50aWZpZWQgYXMgR0VPTUVUUlknLCAoKSA9PiB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSB7dHlwZTogJ1BvaW50JyBhcyBjb25zdCwgY29vcmRpbmF0ZXM6IFsxMCwgMTFdfTtcbiAgICBjb25zdCB2YWx1ZXMgPSBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoXG4gICAgICBbbmV3IFVpbnQ4QXJyYXkoY29udmVydEdlb21ldHJ5VG9XS0IoZ2VvbWV0cnkpKSwgbnVsbF0sXG4gICAgICBuZXcgYXJyb3cuQmluYXJ5KClcbiAgICApO1xuICAgIGNvbnN0IGtleXMgPSBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoWydhJywgJ2InXSk7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgYXJyb3cuVGFibGUoe2tleToga2V5cywgZ2VvbWV0cnk6IHZhbHVlc30pO1xuICAgIGNvbnN0IGxlZnQgPSBuZXcgS2VwbGVyVGFibGUoe2luZm86IHtpZDogJ3NvdXJjZSd9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogYXJyb3dTY2hlbWFUb0ZpZWxkcyhpbnB1dCwge2dlb21ldHJ5OiAnR0VPTUVUUlknfSksXG4gICAgICBjb2xzOiBba2V5cywgdmFsdWVzXSxcbiAgICAgIHJvd3M6IFtdXG4gICAgfSk7XG4gICAgY29uc3QgcmlnaHQgPSBtYWtlVGFibGUoJ2xvb2t1cCcsIFt7bmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnfV0sIFtbJ2EnXSwgWydiJ11dKTtcbiAgICBjb25zdCB7c3RhdGUsIHJlc3VsdH0gPSBqb2luKGxlZnQsIHJpZ2h0LCB7cmlnaHRDb2x1bW5zOiBbXX0pO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChcbiAgICAgIGRhdGFzZXRUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3VsdC5kYXRhQ29udGFpbmVyLCByZXN1bHQuZmllbGRzKS5mZWF0dXJlcy5tYXAoXG4gICAgICAgIGZlYXR1cmUgPT4gZmVhdHVyZS5nZW9tZXRyeVxuICAgICAgKVxuICAgICkudG9FcXVhbChbZ2VvbWV0cnksIG51bGxdKTtcbiAgICBleHBlY3QoZmVhdHVyZXMocmVzdWx0KS5tYXAoKGZlYXR1cmU6IGFueSkgPT4gZmVhdHVyZS5nZW9tZXRyeSkpLnRvRXF1YWwoW2dlb21ldHJ5XSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2pvaW5zIG9yZGluYXJ5IEFycm93IGF0dHJpYnV0ZXMgYWZ0ZXIgSlNPTiBzYXZlL3JlbG9hZCB3aXRob3V0IGNoYW5naW5nIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBhcnJvdy5UYWJsZSh7XG4gICAgICBrZXk6IGFycm93LnZlY3RvckZyb21BcnJheShbJ2EnLCAnYiddKSxcbiAgICAgIHZhbHVlOiBhcnJvdy52ZWN0b3JGcm9tQXJyYXkoWzEuMjUsIDIuNV0pXG4gICAgfSk7XG4gICAgY29uc3QgW2ZpbGVdID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgIGNvbnRlbnQ6IHtmaWxlTmFtZTogJ29yZGluYXJ5LmFycm93JywgZGF0YTogaW5wdXQuYmF0Y2hlc30sXG4gICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgfSBhcyBhbnkpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiB7aWQ6ICdvcmRpbmFyeSd9LCBjb2xvcjogWzEsIDIsIDNdfSkudXBkYXRlU2NoZW1hKFxuICAgICAgZmlsZS5kYXRhIGFzIGFueVxuICAgICk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSByb3VuZHRyaXAob3JpZ2luYWwpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYiddXSk7XG4gICAgZXhwZWN0KGpvaW4ocmVzdG9yZWQsIHJpZ2h0KS5yZXN1bHQuZGF0YUNvbnRhaW5lci5mbGF0dGVuRGF0YSgpKS50b0VxdWFsKFtcbiAgICAgIFsnYScsIDEuMjUsICdhJ10sXG4gICAgICBbJ2InLCAyLjUsICdiJ11cbiAgICBdKTtcbiAgfSk7XG5cbiAgdGVzdCgncmVhZHMgZ2VvbWV0cnkgb25jZSBwZXIgZW1pdHRlZCBzb3VyY2Ugcm93IGFuZCBkb2VzIG5vdCByZXRhaW4gYSBzdGFsZSBjYWNoZSBhY3Jvc3Mgam9pbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVmdCA9IGF3YWl0IHNvdXJjZSgnbGVmdCcsICdQb2ludCcpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFrZVRhYmxlKCdsb29rdXAnLCBbe25hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJ31dLCBbWydhJ10sIFsnYSddLCBbJ2EnXV0pO1xuICAgIGNvbnN0IHJlYWQgPSBqZXN0LnNweU9uKGxlZnQuZGF0YUNvbnRhaW5lciwgJ3ZhbHVlQXQnKTtcbiAgICBjb25zdCBmaXJzdCA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlOiAnSU5ORVInfSkucmVzdWx0O1xuICAgIGV4cGVjdChmaXJzdC5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgzKTtcbiAgICBleHBlY3QocmVhZC5tb2NrLmNhbGxzLmZpbHRlcigoWywgZmllbGRJbmRleF0pID0+IGZpZWxkSW5kZXggPT09IDEpKS50b0VxdWFsKFtbMCwgMV1dKTtcbiAgICByZWFkLm1vY2tSZXN0b3JlKCk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBhd2FpdCBzb3VyY2UoJ3JlcGxhY2VtZW50JywgJ1BvaW50JywgWydhJywgJ2InXSwgWzUwLCA2MF0pO1xuICAgIGxlZnQudXBkYXRlU2NoZW1hKHtcbiAgICAgIGZpZWxkczogcmVwbGFjZW1lbnQuZmllbGRzLFxuICAgICAgcm93czogW10sXG4gICAgICBjb2xzOiBbXG4gICAgICAgIChyZXBsYWNlbWVudC5kYXRhQ29udGFpbmVyIGFzIGFueSkuZ2V0Q29sdW1uKDApLFxuICAgICAgICAocmVwbGFjZW1lbnQuZGF0YUNvbnRhaW5lciBhcyBhbnkpLmdldENvbHVtbigxKVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHNlY29uZCA9IGpvaW4obGVmdCwgcmlnaHQsIHt0eXBlOiAnSU5ORVInfSkucmVzdWx0O1xuICAgIGV4cGVjdChKU09OLnBhcnNlKHNlY29uZC5kYXRhQ29udGFpbmVyLnZhbHVlQXQoMCwgMSkpKS50b0VxdWFsKHBvaW50KDUwKSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoZmlyc3QuZGF0YUNvbnRhaW5lci52YWx1ZUF0KDAsIDEpKSkudG9FcXVhbChwb2ludCgxMCkpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVDLFNBQ0VDLG1CQUFtQixFQUNuQkMsaUJBQWlCLEVBQ2pCQyxjQUFjLEVBQ2RDLGVBQWUsRUFDZkMsY0FBYyxFQUNkQyxtQkFBbUIsUUFDZCx1QkFBdUI7QUFDOUIsU0FBUUMsb0JBQW9CLFFBQU8saUJBQWlCO0FBQ3BELE9BQU8sS0FBS0MsS0FBSyxNQUFNLGNBQWM7QUFDckMsT0FBT0MsWUFBWSxNQUFNLDhDQUE4QztBQUN2RSxTQUFRQyxhQUFhLEVBQUVDLFFBQVEsUUFBTyxvQkFBb0I7QUFDMUQsU0FBUUMsMEJBQTBCLFFBQU8sZ0RBQWdEO0FBQ3pGLFNBQVFDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxlQUFlLFFBQU8sY0FBYztBQUUxRCxTQUFRQyxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxpQkFBaUIsUUFBTyxrQkFBa0I7QUFDdkYsT0FBT0MsYUFBYSxNQUFrQixvQkFBb0I7QUFDMUQsU0FBUUMsb0JBQW9CLEVBQUVDLHFCQUFxQixRQUFPLGtCQUFrQjtBQUM1RSxTQUFRQyxRQUFRLFFBQU8sWUFBWTtBQUVuQyxPQUFPQyxlQUFlLE1BQU0sYUFBYTtBQUN6QyxTQUFRQyxpQkFBaUIsUUFBTyxzQkFBc0I7QUFFdEQsSUFBTUMsY0FBYyxHQUFHRixlQUFpRTtBQUV4RixTQUFTRyxTQUFTQSxDQUFDQyxFQUFVLEVBQUVDLE1BQXNDLEVBQUVDLElBQWEsRUFBRTtFQUNwRixJQUFNQyxLQUFLLEdBQUcsSUFBSTlCLFdBQVcsQ0FBQztJQUM1QitCLElBQUksRUFBRTtNQUFDSixFQUFFLEVBQUZBLEVB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