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