@pie-lib/charting 6.2.0-next.2 → 6.2.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +26 -36
  2. package/LICENSE.md +5 -0
  3. package/lib/actions-button.js +1 -1
  4. package/lib/axes.js +1 -1
  5. package/lib/bars/bar.js +1 -1
  6. package/lib/bars/common/bars.js +1 -1
  7. package/lib/bars/common/correct-check-icon.js +1 -1
  8. package/lib/bars/histogram.js +1 -1
  9. package/lib/chart-setup.js +1 -1
  10. package/lib/chart-type.js +1 -1
  11. package/lib/chart-types.js +1 -1
  12. package/lib/chart.js +1 -1
  13. package/lib/common/correctness-indicators.js +1 -1
  14. package/lib/common/drag-handle.js +1 -1
  15. package/lib/common/drag-icon.js +1 -1
  16. package/lib/common/styles.js +1 -1
  17. package/lib/grid.js +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/key-legend.js +1 -1
  20. package/lib/line/common/drag-handle.js +1 -1
  21. package/lib/line/common/line.js +1 -1
  22. package/lib/line/line-cross.js +1 -1
  23. package/lib/line/line-dot.js +1 -1
  24. package/lib/mark-label.js +1 -1
  25. package/lib/plot/common/plot.js +1 -1
  26. package/lib/plot/dot.js +1 -1
  27. package/lib/plot/line.js +1 -1
  28. package/lib/tool-menu.js +1 -1
  29. package/lib/utils.js +1 -1
  30. package/package.json +3 -3
  31. package/lib/__tests__/actions-button.test.js +0 -332
  32. package/lib/__tests__/axes.test.js +0 -746
  33. package/lib/__tests__/chart-setup.test.js +0 -796
  34. package/lib/__tests__/chart-type.test.js +0 -25
  35. package/lib/__tests__/chart.test.js +0 -103
  36. package/lib/__tests__/grid.test.js +0 -39
  37. package/lib/__tests__/key-legend.test.js +0 -235
  38. package/lib/__tests__/mark-label.test.js +0 -46
  39. package/lib/__tests__/tool-menu.test.js +0 -627
  40. package/lib/__tests__/utils.js +0 -56
  41. package/lib/__tests__/utils.test.js +0 -186
  42. package/lib/bars/__tests__/bar.test.js +0 -53
  43. package/lib/bars/__tests__/histogram.test.js +0 -53
  44. package/lib/bars/__tests__/utils.js +0 -50
  45. package/lib/bars/common/__tests__/bars.test.js +0 -76
  46. package/lib/bars/common/__tests__/utils.js +0 -50
  47. package/lib/common/__tests__/correctness-indicators.test.js +0 -887
  48. package/lib/common/__tests__/drag-handle.test.js +0 -73
  49. package/lib/common/__tests__/utils.js +0 -50
  50. package/lib/line/__tests__/line-cross.test.js +0 -617
  51. package/lib/line/__tests__/line-dot.test.js +0 -47
  52. package/lib/line/__tests__/utils.js +0 -56
  53. package/lib/line/common/__tests__/drag-handle.test.js +0 -73
  54. package/lib/line/common/__tests__/line.test.js +0 -92
  55. package/lib/line/common/__tests__/utils.js +0 -50
  56. package/lib/plot/__tests__/dot.test.js +0 -513
  57. package/lib/plot/__tests__/line.test.js +0 -566
  58. package/lib/plot/__tests__/utils.js +0 -50
  59. package/lib/plot/common/__tests__/plot.test.js +0 -79
  60. package/lib/plot/common/__tests__/utils.js +0 -50
@@ -1,746 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
8
- var _react = _interopRequireDefault(require("react"));
9
- var _testUtils = require("@pie-lib/test-utils");
10
- var _styles = require("@mui/material/styles");
11
- var _axes = _interopRequireWildcard(require("../axes"));
12
- var _utils = require("./utils");
13
- var _excluded = ["children"],
14
- _excluded2 = ["children", "tickValues"];
15
- 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); }
16
- 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; }
17
- 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; }
18
- jest.mock('@visx/axis', function () {
19
- return {
20
- AxisLeft: function AxisLeft(_ref) {
21
- var children = _ref.children,
22
- props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
23
- return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
24
- "data-testid": "axis-left"
25
- }, props), typeof children === 'function' ? children({
26
- formattedValue: '5'
27
- }) : children);
28
- },
29
- AxisBottom: function AxisBottom(_ref2) {
30
- var children = _ref2.children,
31
- tickValues = _ref2.tickValues,
32
- props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
33
- return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
34
- "data-testid": "axis-bottom"
35
- }, props), typeof children === 'function' ? (tickValues || ['0-A', '1-B', '2-C']).map(function (v, i) {
36
- return children({
37
- formattedValue: v,
38
- index: i
39
- });
40
- }) : children);
41
- }
42
- };
43
- });
44
- jest.mock('../mark-label', function () {
45
- return function MarkLabel(_ref3) {
46
- var mark = _ref3.mark,
47
- disabled = _ref3.disabled,
48
- _onChange = _ref3.onChange,
49
- error = _ref3.error,
50
- autoFocus = _ref3.autoFocus,
51
- inputRef = _ref3.inputRef,
52
- correctnessIndicator = _ref3.correctnessIndicator;
53
- return /*#__PURE__*/_react["default"].createElement("div", {
54
- "data-testid": "mark-label"
55
- }, /*#__PURE__*/_react["default"].createElement("input", {
56
- "data-testid": "mark-label-input",
57
- ref: inputRef,
58
- value: (mark === null || mark === void 0 ? void 0 : mark.label) || '',
59
- disabled: disabled,
60
- onChange: function onChange(e) {
61
- return _onChange && _onChange(e.target.value);
62
- },
63
- autoFocus: autoFocus
64
- }), error && /*#__PURE__*/_react["default"].createElement("span", {
65
- "data-testid": "mark-label-error"
66
- }, error), correctnessIndicator);
67
- };
68
- });
69
- jest.mock('@pie-lib/config-ui', function () {
70
- return {
71
- AlertDialog: function AlertDialog(_ref4) {
72
- var open = _ref4.open,
73
- title = _ref4.title,
74
- text = _ref4.text,
75
- onClose = _ref4.onClose,
76
- onConfirm = _ref4.onConfirm;
77
- return open ? /*#__PURE__*/_react["default"].createElement("div", {
78
- "data-testid": "alert-dialog"
79
- }, /*#__PURE__*/_react["default"].createElement("h2", null, title), /*#__PURE__*/_react["default"].createElement("p", null, text), /*#__PURE__*/_react["default"].createElement("button", {
80
- "data-testid": "alert-cancel",
81
- onClick: onClose
82
- }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
83
- "data-testid": "alert-confirm",
84
- onClick: onConfirm
85
- }, "Confirm")) : null;
86
- }
87
- };
88
- });
89
- jest.mock('../common/correctness-indicators', function () {
90
- return {
91
- TickCorrectnessIndicator: function TickCorrectnessIndicator(_ref5) {
92
- var correctness = _ref5.correctness,
93
- interactive = _ref5.interactive;
94
- return correctness && interactive ? /*#__PURE__*/_react["default"].createElement("div", {
95
- "data-testid": "tick-correctness-indicator"
96
- }, correctness.value === 'correct' ? '✓' : '✗') : null;
97
- }
98
- };
99
- });
100
- jest.mock('@pie-lib/math-rendering', function () {
101
- return {
102
- renderMath: jest.fn(function (text) {
103
- return text;
104
- })
105
- };
106
- });
107
- var theme = (0, _styles.createTheme)();
108
- describe('ChartAxes', function () {
109
- var renderComponent = function renderComponent(extras) {
110
- var defaults = {
111
- classes: {},
112
- className: 'className',
113
- graphProps: (0, _utils.graphProps)(),
114
- xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
115
- categories: []
116
- };
117
- var props = _objectSpread(_objectSpread({}, defaults), extras);
118
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
119
- theme: theme
120
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes["default"], props))));
121
- };
122
- describe('rendering', function () {
123
- it('renders axes container', function () {
124
- var _renderComponent = renderComponent(),
125
- container = _renderComponent.container;
126
- expect(container.firstChild).toBeInTheDocument();
127
- });
128
- it('renders SVG with axes group', function () {
129
- var _renderComponent2 = renderComponent(),
130
- container = _renderComponent2.container;
131
- var svg = container.querySelector('svg');
132
- expect(svg).toBeInTheDocument();
133
- var axesGroup = container.querySelector('g');
134
- expect(axesGroup).toBeInTheDocument();
135
- });
136
- it('renders axes elements', function () {
137
- var _renderComponent3 = renderComponent(),
138
- container = _renderComponent3.container;
139
- var groups = container.querySelectorAll('g');
140
- expect(groups.length).toBeGreaterThan(0);
141
- });
142
- });
143
- describe('edge cases', function () {
144
- it('handles missing xBand', function () {
145
- var _renderComponent4 = renderComponent({
146
- xBand: undefined
147
- }),
148
- container = _renderComponent4.container;
149
- expect(container).toBeInTheDocument();
150
- });
151
- it('handles empty categories', function () {
152
- var _renderComponent5 = renderComponent({
153
- categories: []
154
- }),
155
- container = _renderComponent5.container;
156
- expect(container).toBeInTheDocument();
157
- });
158
- it('handles null categories', function () {
159
- var _renderComponent6 = renderComponent({
160
- categories: null
161
- }),
162
- container = _renderComponent6.container;
163
- expect(container).toBeInTheDocument();
164
- });
165
- });
166
- });
167
- describe('RawChartAxes', function () {
168
- var renderComponent = function renderComponent(extras) {
169
- var defaults = {
170
- classes: {},
171
- className: 'className',
172
- graphProps: (0, _utils.graphProps)(),
173
- xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
174
- categories: []
175
- };
176
- var props = _objectSpread(_objectSpread({}, defaults), extras);
177
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
178
- theme: theme
179
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.RawChartAxes, props))));
180
- };
181
- describe('rendering', function () {
182
- it('renders raw axes container', function () {
183
- var _renderComponent7 = renderComponent(),
184
- container = _renderComponent7.container;
185
- expect(container.firstChild).toBeInTheDocument();
186
- });
187
- it('renders SVG with axes group', function () {
188
- var _renderComponent8 = renderComponent(),
189
- container = _renderComponent8.container;
190
- var svg = container.querySelector('svg');
191
- expect(svg).toBeInTheDocument();
192
- var axesGroup = container.querySelector('g');
193
- expect(axesGroup).toBeInTheDocument();
194
- });
195
- it('renders both axes when leftAxis is true', function () {
196
- var _renderComponent9 = renderComponent({
197
- leftAxis: true
198
- }),
199
- getByTestId = _renderComponent9.getByTestId;
200
- expect(getByTestId('axis-left')).toBeInTheDocument();
201
- expect(getByTestId('axis-bottom')).toBeInTheDocument();
202
- });
203
- it('renders only bottom axis when leftAxis is false', function () {
204
- var _renderComponent0 = renderComponent({
205
- leftAxis: false
206
- }),
207
- queryByTestId = _renderComponent0.queryByTestId,
208
- getByTestId = _renderComponent0.getByTestId;
209
- expect(queryByTestId('axis-left')).not.toBeInTheDocument();
210
- expect(getByTestId('axis-bottom')).toBeInTheDocument();
211
- });
212
- });
213
- });
214
- describe('TickComponent', function () {
215
- var defaultCategories = [{
216
- value: 1,
217
- label: 'Category A',
218
- editable: true,
219
- interactive: true
220
- }, {
221
- value: 2,
222
- label: 'Category B',
223
- editable: true,
224
- interactive: true
225
- }];
226
- var renderComponent = function renderComponent(extras) {
227
- var defaults = {
228
- graphProps: (0, _utils.graphProps)(),
229
- xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
230
- categories: defaultCategories,
231
- formattedValue: '0-Category A',
232
- bandWidth: 100,
233
- barWidth: 100,
234
- x: 50,
235
- y: 50,
236
- top: 0,
237
- onChangeCategory: jest.fn()
238
- };
239
- var props = _objectSpread(_objectSpread({}, defaults), extras);
240
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
241
- theme: theme
242
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, props))));
243
- };
244
- describe('rendering', function () {
245
- it('renders tick component', function () {
246
- var _renderComponent1 = renderComponent(),
247
- container = _renderComponent1.container;
248
- var svg = container.querySelector('svg');
249
- expect(svg).toBeInTheDocument();
250
- expect(container.querySelector('g')).toBeInTheDocument();
251
- });
252
- it('renders with categories', function () {
253
- var _renderComponent10 = renderComponent({
254
- formattedValue: '0-test',
255
- categories: [{
256
- value: 1,
257
- label: 'test',
258
- editable: false,
259
- interactive: false
260
- }]
261
- }),
262
- container = _renderComponent10.container;
263
- var svg = container.querySelector('svg');
264
- expect(svg).toBeInTheDocument();
265
- expect(container.querySelector('g')).toBeInTheDocument();
266
- });
267
- it('renders MarkLabel component', function () {
268
- var _renderComponent11 = renderComponent(),
269
- getAllByTestId = _renderComponent11.getAllByTestId;
270
- var markLabels = getAllByTestId('mark-label');
271
- expect(markLabels.length).toBeGreaterThan(0);
272
- });
273
- it('renders foreignObject for labels', function () {
274
- var _renderComponent12 = renderComponent(),
275
- container = _renderComponent12.container;
276
- var foreignObject = container.querySelector('foreignObject');
277
- expect(foreignObject).toBeInTheDocument();
278
- });
279
- it('does not render when formattedValue is null', function () {
280
- var _renderComponent13 = renderComponent({
281
- formattedValue: null
282
- }),
283
- container = _renderComponent13.container;
284
- var foreignObject = container.querySelector('foreignObject');
285
- expect(foreignObject).not.toBeInTheDocument();
286
- });
287
- it('does not render when formattedValue is undefined', function () {
288
- var _renderComponent14 = renderComponent({
289
- formattedValue: undefined
290
- }),
291
- container = _renderComponent14.container;
292
- var foreignObject = container.querySelector('foreignObject');
293
- expect(foreignObject).not.toBeInTheDocument();
294
- });
295
- it('renders hidden label for longest category', function () {
296
- var _renderComponent15 = renderComponent(),
297
- getAllByTestId = _renderComponent15.getAllByTestId;
298
- var markLabels = getAllByTestId('mark-label');
299
- expect(markLabels.length).toBeGreaterThan(0);
300
- });
301
- });
302
- describe('category label editing', function () {
303
- it('allows editing category label', function () {
304
- var onChangeCategory = jest.fn();
305
- var _renderComponent16 = renderComponent({
306
- onChangeCategory: onChangeCategory
307
- }),
308
- getAllByTestId = _renderComponent16.getAllByTestId;
309
- var inputs = getAllByTestId('mark-label-input');
310
- var input = inputs[inputs.length - 1];
311
- _testUtils.fireEvent.change(input, {
312
- target: {
313
- value: 'New Label'
314
- }
315
- });
316
- expect(onChangeCategory).toHaveBeenCalled();
317
- });
318
- it('calls changeCategory with correct parameters', function () {
319
- var onChangeCategory = jest.fn();
320
- var _renderComponent17 = renderComponent({
321
- onChangeCategory: onChangeCategory
322
- }),
323
- getAllByTestId = _renderComponent17.getAllByTestId;
324
- var inputs = getAllByTestId('mark-label-input');
325
- var input = inputs[inputs.length - 1];
326
- _testUtils.fireEvent.change(input, {
327
- target: {
328
- value: 'Updated'
329
- }
330
- });
331
- expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
332
- label: 'Updated'
333
- }));
334
- });
335
- it('disables editing when editable is false', function () {
336
- var categories = [{
337
- value: 1,
338
- label: 'test',
339
- editable: false,
340
- interactive: true
341
- }];
342
- var _renderComponent18 = renderComponent({
343
- categories: categories,
344
- formattedValue: '0-test'
345
- }),
346
- getAllByTestId = _renderComponent18.getAllByTestId;
347
- var inputs = getAllByTestId('mark-label-input');
348
- var input = inputs[inputs.length - 1];
349
- expect(input).toBeDisabled();
350
- });
351
- it('enables editing in define chart mode', function () {
352
- var categories = [{
353
- value: 1,
354
- label: 'test',
355
- editable: true,
356
- interactive: true
357
- }];
358
- var _renderComponent19 = renderComponent({
359
- categories: categories,
360
- formattedValue: '0-test',
361
- defineChart: true
362
- }),
363
- getAllByTestId = _renderComponent19.getAllByTestId;
364
- var inputs = getAllByTestId('mark-label-input');
365
- var input = inputs[inputs.length - 1];
366
- expect(input).not.toBeDisabled();
367
- });
368
- it('respects editable property when not in define chart mode', function () {
369
- var categories = [{
370
- value: 1,
371
- label: 'test',
372
- editable: true,
373
- interactive: true
374
- }];
375
- var _renderComponent20 = renderComponent({
376
- categories: categories,
377
- formattedValue: '0-test',
378
- defineChart: false
379
- }),
380
- getAllByTestId = _renderComponent20.getAllByTestId;
381
- var inputs = getAllByTestId('mark-label-input');
382
- var input = inputs[inputs.length - 1];
383
- expect(input).not.toBeDisabled();
384
- });
385
- });
386
- describe('interactive checkbox', function () {
387
- it('shows warning when disabling interactive with correct answer', function () {
388
- var categories = [{
389
- value: 1,
390
- label: 'test',
391
- editable: true,
392
- interactive: true,
393
- correctness: {
394
- value: 'correct'
395
- }
396
- }];
397
- var component = new _axes.TickComponent({
398
- categories: categories,
399
- onChangeCategory: jest.fn()
400
- });
401
- component.setState = jest.fn();
402
- component.changeInteractive(0, false);
403
- expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
404
- dialog: expect.objectContaining({
405
- open: true,
406
- title: 'Warning'
407
- })
408
- }));
409
- });
410
- it('changes interactive without warning when enabling', function () {
411
- var onChangeCategory = jest.fn();
412
- var categories = [{
413
- value: 1,
414
- label: 'test',
415
- editable: true,
416
- interactive: false
417
- }];
418
- var component = new _axes.TickComponent({
419
- categories: categories,
420
- onChangeCategory: onChangeCategory
421
- });
422
- component.changeInteractive(0, true);
423
- expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
424
- interactive: true
425
- }));
426
- });
427
- });
428
- describe('editable checkbox', function () {
429
- it('shows warning when disabling editable with correct answer name', function () {
430
- var categories = [{
431
- value: 1,
432
- label: 'test',
433
- editable: true,
434
- interactive: true,
435
- correctness: {
436
- value: 'correct'
437
- }
438
- }];
439
- var component = new _axes.TickComponent({
440
- categories: categories,
441
- onChangeCategory: jest.fn()
442
- });
443
- component.setState = jest.fn();
444
- component.changeEditable(0, false);
445
- expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
446
- dialog: expect.objectContaining({
447
- open: true,
448
- title: 'Warning'
449
- })
450
- }));
451
- });
452
- it('changes editable without warning when enabling', function () {
453
- var onChangeCategory = jest.fn();
454
- var categories = [{
455
- value: 1,
456
- label: 'test',
457
- editable: false,
458
- interactive: true
459
- }];
460
- var component = new _axes.TickComponent({
461
- categories: categories,
462
- onChangeCategory: onChangeCategory
463
- });
464
- component.changeEditable(0, true);
465
- expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
466
- editable: true
467
- }));
468
- });
469
- });
470
- describe('splitText method', function () {
471
- it('splits text into chunks', function () {
472
- var component = new _axes.TickComponent({
473
- categories: []
474
- });
475
- var result = component.splitText('This is a long text', 10);
476
- expect(result.length).toBeGreaterThan(1);
477
- });
478
- it('splits at word boundaries', function () {
479
- var component = new _axes.TickComponent({
480
- categories: []
481
- });
482
- var result = component.splitText('Hello world test', 11);
483
- expect(result[0]).toBe('Hello world');
484
- });
485
- it('handles text shorter than max', function () {
486
- var component = new _axes.TickComponent({
487
- categories: []
488
- });
489
- var result = component.splitText('Short', 20);
490
- expect(result).toEqual(['Short']);
491
- });
492
- it('handles empty text', function () {
493
- var component = new _axes.TickComponent({
494
- categories: []
495
- });
496
- var result = component.splitText('', 10);
497
- expect(result).toEqual([]);
498
- });
499
- it('handles null text', function () {
500
- var component = new _axes.TickComponent({
501
- categories: []
502
- });
503
- var result = component.splitText(null, 10);
504
- expect(result).toEqual([]);
505
- });
506
- it('forces split when no spaces', function () {
507
- var component = new _axes.TickComponent({
508
- categories: []
509
- });
510
- var result = component.splitText('verylongwordwithoutspaces', 10);
511
- expect(result.length).toBeGreaterThan(1);
512
- expect(result[0].length).toBeLessThanOrEqual(10);
513
- });
514
- });
515
- describe('correctness display', function () {
516
- it('renders correctness indicator when showCorrectness is true', function () {
517
- var categories = [{
518
- value: 1,
519
- label: 'test',
520
- editable: true,
521
- interactive: true,
522
- correctness: {
523
- value: 'correct',
524
- label: 'Correct!'
525
- }
526
- }];
527
- var _renderComponent21 = renderComponent({
528
- categories: categories,
529
- formattedValue: '0-test',
530
- showCorrectness: true
531
- }),
532
- getByTestId = _renderComponent21.getByTestId;
533
- expect(getByTestId('tick-correctness-indicator')).toBeInTheDocument();
534
- });
535
- it('does not render correctness indicator when showCorrectness is false', function () {
536
- var categories = [{
537
- value: 1,
538
- label: 'test',
539
- editable: true,
540
- interactive: true,
541
- correctness: {
542
- value: 'correct',
543
- label: 'Correct!'
544
- }
545
- }];
546
- var _renderComponent22 = renderComponent({
547
- categories: categories,
548
- formattedValue: '0-test',
549
- showCorrectness: false
550
- }),
551
- queryByTestId = _renderComponent22.queryByTestId;
552
- expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
553
- });
554
- it('does not render correctness indicator when not interactive', function () {
555
- var categories = [{
556
- value: 1,
557
- label: 'test',
558
- editable: true,
559
- interactive: false,
560
- correctness: {
561
- value: 'correct',
562
- label: 'Correct!'
563
- }
564
- }];
565
- var _renderComponent23 = renderComponent({
566
- categories: categories,
567
- formattedValue: '0-test',
568
- showCorrectness: true
569
- }),
570
- queryByTestId = _renderComponent23.queryByTestId;
571
- expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
572
- });
573
- });
574
- describe('error display', function () {
575
- it('renders error message for first category', function () {
576
- var error = {
577
- 0: 'Error message'
578
- };
579
- var _renderComponent24 = renderComponent({
580
- error: error,
581
- formattedValue: '0-test'
582
- }),
583
- getByTestId = _renderComponent24.getByTestId;
584
- expect(getByTestId('mark-label-error')).toBeInTheDocument();
585
- });
586
- it('renders distinct error messages', function () {
587
- var error = {
588
- 0: 'Error 1',
589
- 1: 'Error 1',
590
- 2: 'Error 2'
591
- };
592
- var _renderComponent25 = renderComponent({
593
- error: error,
594
- formattedValue: '0-test'
595
- }),
596
- container = _renderComponent25.container;
597
- var errorText = container.querySelector('text');
598
- expect(errorText).toBeInTheDocument();
599
- });
600
- it('does not render error when no error prop', function () {
601
- var _renderComponent26 = renderComponent({
602
- error: null
603
- }),
604
- queryByTestId = _renderComponent26.queryByTestId;
605
- expect(queryByTestId('mark-label-error')).not.toBeInTheDocument();
606
- });
607
- });
608
- describe('autoFocus handling', function () {
609
- it('handles autoFocus prop', function () {
610
- var onAutoFocusUsed = jest.fn();
611
- var _renderComponent27 = renderComponent({
612
- autoFocus: false,
613
- onAutoFocusUsed: onAutoFocusUsed
614
- }),
615
- rerender = _renderComponent27.rerender;
616
- rerender(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
617
- theme: theme
618
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, {
619
- graphProps: (0, _utils.graphProps)(),
620
- xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
621
- categories: defaultCategories,
622
- formattedValue: '0-Category A',
623
- bandWidth: 100,
624
- barWidth: 100,
625
- x: 50,
626
- y: 50,
627
- top: 0,
628
- onChangeCategory: jest.fn(),
629
- autoFocus: true,
630
- onAutoFocusUsed: onAutoFocusUsed
631
- }))));
632
- expect(onAutoFocusUsed).toHaveBeenCalled();
633
- });
634
- });
635
- describe('define chart mode', function () {
636
- it('renders interactive checkboxes when changeInteractiveEnabled', function () {
637
- var chartingOptions = {
638
- changeInteractive: {
639
- authoringLabel: 'Allow students to change'
640
- }
641
- };
642
- var _renderComponent28 = renderComponent({
643
- defineChart: true,
644
- chartingOptions: chartingOptions,
645
- changeInteractiveEnabled: true,
646
- formattedValue: '0-test'
647
- }),
648
- container = _renderComponent28.container;
649
- var text = container.querySelector('text');
650
- expect(text).toBeInTheDocument();
651
- });
652
- it('renders editable checkboxes when changeEditableEnabled', function () {
653
- var chartingOptions = {
654
- changeEditable: {
655
- authoringLabel: 'Allow label editing'
656
- }
657
- };
658
- var _renderComponent29 = renderComponent({
659
- defineChart: true,
660
- chartingOptions: chartingOptions,
661
- changeEditableEnabled: true,
662
- formattedValue: '0-test'
663
- }),
664
- container = _renderComponent29.container;
665
- var text = container.querySelector('text');
666
- expect(text).toBeInTheDocument();
667
- });
668
- it('splits long authoring labels', function () {
669
- var chartingOptions = {
670
- changeInteractive: {
671
- authoringLabel: 'This is a very long label that needs to be split'
672
- }
673
- };
674
- var _renderComponent30 = renderComponent({
675
- defineChart: true,
676
- chartingOptions: chartingOptions,
677
- changeInteractiveEnabled: true,
678
- formattedValue: '0-test'
679
- }),
680
- container = _renderComponent30.container;
681
- var tspans = container.querySelectorAll('tspan');
682
- expect(tspans.length).toBeGreaterThan(1);
683
- });
684
- });
685
- describe('edge cases', function () {
686
- it('handles missing category', function () {
687
- var _renderComponent31 = renderComponent({
688
- categories: [],
689
- formattedValue: '0-missing'
690
- }),
691
- container = _renderComponent31.container;
692
- expect(container).toBeInTheDocument();
693
- });
694
- it('handles invalid formattedValue format', function () {
695
- var _renderComponent32 = renderComponent({
696
- formattedValue: 'invalid'
697
- }),
698
- container = _renderComponent32.container;
699
- expect(container).toBeInTheDocument();
700
- });
701
- it('handles missing graphProps', function () {
702
- var _renderComponent33 = renderComponent({
703
- graphProps: null
704
- }),
705
- container = _renderComponent33.container;
706
- expect(container).toBeInTheDocument();
707
- });
708
- it('handles zero barWidth', function () {
709
- var _renderComponent34 = renderComponent({
710
- barWidth: 0
711
- }),
712
- container = _renderComponent34.container;
713
- expect(container).toBeInTheDocument();
714
- });
715
- it('handles negative coordinates', function () {
716
- var _renderComponent35 = renderComponent({
717
- x: -10,
718
- y: -20
719
- }),
720
- container = _renderComponent35.container;
721
- expect(container).toBeInTheDocument();
722
- });
723
- });
724
- describe('componentDidUpdate', function () {
725
- it('calls onAutoFocusUsed when autoFocus changes to true', function () {
726
- var onAutoFocusUsed = jest.fn();
727
- var component = new _axes.TickComponent({
728
- autoFocus: false,
729
- onAutoFocusUsed: onAutoFocusUsed
730
- });
731
- component.componentDidUpdate({
732
- autoFocus: false
733
- });
734
- expect(onAutoFocusUsed).not.toHaveBeenCalled();
735
- component.props = {
736
- autoFocus: true,
737
- onAutoFocusUsed: onAutoFocusUsed
738
- };
739
- component.componentDidUpdate({
740
- autoFocus: false
741
- });
742
- expect(onAutoFocusUsed).toHaveBeenCalled();
743
- });
744
- });
745
- });
746
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfc3R5bGVzIiwiX2F4ZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91dGlscyIsIl9leGNsdWRlZCIsIl9leGNsdWRlZDIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiamVzdCIsIm1vY2siLCJBeGlzTGVmdCIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJmb3JtYXR0ZWRWYWx1ZSIsIkF4aXNCb3R0b20iLCJfcmVmMiIsInRpY2tWYWx1ZXMiLCJtYXAiLCJ2IiwiaW5kZXgiLCJNYXJrTGFiZWwiLCJfcmVmMyIsIm1hcmsiLCJkaXNhYmxlZCIsIm9uQ2hhbmdlIiwiZXJyb3IiLCJhdXRvRm9jdXMiLCJpbnB1dFJlZiIsImNvcnJlY3RuZXNzSW5kaWNhdG9yIiwicmVmIiwidmFsdWUiLCJsYWJlbCIsInRhcmdldCIsIkFsZXJ0RGlhbG9nIiwiX3JlZjQiLCJvcGVuIiwidGl0bGUiLCJ0ZXh0Iiwib25DbG9zZSIsIm9uQ29uZmlybSIsIm9uQ2xpY2siLCJUaWNrQ29ycmVjdG5lc3NJbmRpY2F0b3IiLCJfcmVmNSIsImNvcnJlY3RuZXNzIiwiaW50ZXJhY3RpdmUiLCJyZW5kZXJNYXRoIiwiZm4iLCJ0aGVtZSIsImNyZWF0ZVRoZW1lIiwiZGVzY3JpYmUiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJncmFwaFByb3BzIiwieEJhbmQiLCJjcmVhdGVCYW5kU2NhbGUiLCJjYXRlZ29yaWVzIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwic3ZnIiwicXVlcnlTZWxlY3RvciIsImF4ZXNHcm91cCIsIl9yZW5kZXJDb21wb25lbnQzIiwiZ3JvdXBzIiwicXVlcnlTZWxlY3RvckFsbCIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXJDb21wb25lbnQ0IiwidW5kZWZpbmVkIiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsIlJhd0NoYXJ0QXhlcyIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJfcmVuZGVyQ29tcG9uZW50OSIsImxlZnRBeGlzIiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyQ29tcG9uZW50MCIsInF1ZXJ5QnlUZXN0SWQiLCJub3QiLCJkZWZhdWx0Q2F0ZWdvcmllcyIsImVkaXRhYmxlIiwiYmFuZFdpZHRoIiwiYmFyV2lkdGgiLCJ4IiwieSIsInRvcCIsIm9uQ2hhbmdlQ2F0ZWdvcnkiLCJUaWNrQ29tcG9uZW50IiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJnZXRBbGxCeVRlc3RJZCIsIm1hcmtMYWJlbHMiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJmb3JlaWduT2JqZWN0IiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwiX3JlbmRlckNvbXBvbmVudDE2IiwiaW5wdXRzIiwiaW5wdXQiLCJmaXJlRXZlbnQiLCJjaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlckNvbXBvbmVudDE3IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwiX3JlbmRlckNvbXBvbmVudDE4IiwidG9CZURpc2FibGVkIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiZGVmaW5lQ2hhcnQiLCJfcmVuZGVyQ29tcG9uZW50MjAiLCJjb21wb25lbnQiLCJzZXRTdGF0ZSIsImNoYW5nZUludGVyYWN0aXZlIiwiZGlhbG9nIiwiY2hhbmdlRWRpdGFibGUiLCJyZXN1bHQiLCJzcGxpdFRleHQiLCJ0b0JlIiwidG9FcXVhbCIsInRvQmVMZXNzVGhhbk9yRXF1YWwiLCJfcmVuZGVyQ29tcG9uZW50MjEiLCJzaG93Q29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJfcmVuZGVyQ29tcG9uZW50MjMiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJlcnJvclRleHQiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJvbkF1dG9Gb2N1c1VzZWQiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJyZXJlbmRlciIsImNoYXJ0aW5nT3B0aW9ucyIsImF1dGhvcmluZ0xhYmVsIiwiX3JlbmRlckNvbXBvbmVudDI4IiwiY2hhbmdlSW50ZXJhY3RpdmVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDI5IiwiY2hhbmdlRWRpdGFibGVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDMwIiwidHNwYW5zIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiX3JlbmRlckNvbXBvbmVudDMyIiwiX3JlbmRlckNvbXBvbmVudDMzIiwiX3JlbmRlckNvbXBvbmVudDM0IiwiX3JlbmRlckNvbXBvbmVudDM1IiwiY29tcG9uZW50RGlkVXBkYXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9heGVzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJlRXZlbnQsIHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVGhlbWUsIFRoZW1lUHJvdmlkZXIgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgQ2hhcnRBeGVzLCB7IFJhd0NoYXJ0QXhlcywgVGlja0NvbXBvbmVudCB9IGZyb20gJy4uL2F4ZXMnO1xuaW1wb3J0IHsgY3JlYXRlQmFuZFNjYWxlLCBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmplc3QubW9jaygnQHZpc3gvYXhpcycsICgpID0+ICh7XG4gIEF4aXNMZWZ0OiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfSkgPT4gKFxuICAgIDxnIGRhdGEtdGVzdGlkPVwiYXhpcy1sZWZ0XCIgey4uLnByb3BzfT5cbiAgICAgIHt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbih7IGZvcm1hdHRlZFZhbHVlOiAnNScgfSkgOiBjaGlsZHJlbn1cbiAgICA8L2c+XG4gICksXG4gIEF4aXNCb3R0b206ICh7IGNoaWxkcmVuLCB0aWNrVmFsdWVzLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGcgZGF0YS10ZXN0aWQ9XCJheGlzLWJvdHRvbVwiIHsuLi5wcm9wc30+XG4gICAgICB7dHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHRpY2tWYWx1ZXMgfHwgWycwLUEnLCAnMS1CJywgJzItQyddKS5tYXAoKHYsIGkpID0+IGNoaWxkcmVuKHsgZm9ybWF0dGVkVmFsdWU6IHYsIGluZGV4OiBpIH0pKVxuICAgICAgICA6IGNoaWxkcmVufVxuICAgIDwvZz5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9tYXJrLWxhYmVsJywgKCkgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gTWFya0xhYmVsKHsgbWFyaywgZGlzYWJsZWQsIG9uQ2hhbmdlLCBlcnJvciwgYXV0b0ZvY3VzLCBpbnB1dFJlZiwgY29ycmVjdG5lc3NJbmRpY2F0b3IgfSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1hcmstbGFiZWwtaW5wdXRcIlxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgdmFsdWU9e21hcms/LmxhYmVsIHx8ICcnfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlICYmIG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cbiAgICAgICAgLz5cbiAgICAgICAge2Vycm9yICYmIDxzcGFuIGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbC1lcnJvclwiPntlcnJvcn08L3NwYW4+fVxuICAgICAgICB7Y29ycmVjdG5lc3NJbmRpY2F0b3J9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgQWxlcnREaWFsb2c6ICh7IG9wZW4sIHRpdGxlLCB0ZXh0LCBvbkNsb3NlLCBvbkNvbmZpcm0gfSkgPT5cbiAgICBvcGVuID8gKFxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAgICA8aDI+e3RpdGxlfTwvaDI+XG4gICAgICAgIDxwPnt0ZXh0fTwvcD5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNhbmNlbFwiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNvbmZpcm1cIiBvbkNsaWNrPXtvbkNvbmZpcm19PlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApIDogbnVsbCxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9jb21tb24vY29ycmVjdG5lc3MtaW5kaWNhdG9ycycsICgpID0+ICh7XG4gIFRpY2tDb3JyZWN0bmVzc0luZGljYXRvcjogKHsgY29ycmVjdG5lc3MsIGludGVyYWN0aXZlIH0pID0+XG4gICAgY29ycmVjdG5lc3MgJiYgaW50ZXJhY3RpdmUgPyAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidGljay1jb3JyZWN0bmVzcy1pbmRpY2F0b3JcIj57Y29ycmVjdG5lc3MudmFsdWUgPT09ICdjb3JyZWN0JyA/ICfinJMnIDogJ+Kclyd9PC9kaXY+XG4gICAgKSA6IG51bGwsXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICByZW5kZXJNYXRoOiBqZXN0LmZuKCh0ZXh0KSA9PiB0ZXh0KSxcbn0pKTtcblxuY29uc3QgdGhlbWUgPSBjcmVhdGVUaGVtZSgpO1xuXG5kZXNjcmliZSgnQ2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGF4ZXMgY29udGFpbmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgU1ZHIHdpdGggYXhlcyBncm91cCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBjb25zdCBheGVzR3JvdXAgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGF4ZXNHcm91cCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGF4ZXMgZWxlbWVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBncm91cHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnZycpO1xuICAgICAgZXhwZWN0KGdyb3Vwcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyB4QmFuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4QmFuZDogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IGNhdGVnb3JpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbnVsbCBjYXRlZ29yaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNhdGVnb3JpZXM6IG51bGwgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnUmF3Q2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxSYXdDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHJhdyBheGVzIGNvbnRhaW5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIFNWRyB3aXRoIGF4ZXMgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBzdmcgPSBjb250YWluZXIucXVlcnlTZWxlY3Rvcignc3ZnJyk7XG4gICAgICBleHBlY3Qoc3ZnKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgY29uc3QgYXhlc0dyb3VwID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChheGVzR3JvdXApLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBib3RoIGF4ZXMgd2hlbiBsZWZ0QXhpcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IHRydWUgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdheGlzLWJvdHRvbScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgb25seSBib3R0b20gYXhpcyB3aGVuIGxlZnRBeGlzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnYXhpcy1ib3R0b20nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RpY2tDb21wb25lbnQnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRDYXRlZ29yaWVzID0gW1xuICAgIHsgdmFsdWU6IDEsIGxhYmVsOiAnQ2F0ZWdvcnkgQScsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQ2F0ZWdvcnkgQicsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIHhCYW5kOiBjcmVhdGVCYW5kU2NhbGUoWydhJywgJ2InLCAnYyddLCBbMCwgNDAwXSksXG4gICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC1DYXRlZ29yeSBBJyxcbiAgICAgIGJhbmRXaWR0aDogMTAwLFxuICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgIHg6IDUwLFxuICAgICAgeTogNTAsXG4gICAgICB0b3A6IDAsXG4gICAgICBvbkNoYW5nZUNhdGVnb3J5OiBqZXN0LmZuKCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxUaWNrQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB0aWNrIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY2F0ZWdvcmllcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGNhdGVnb3JpZXM6IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiBmYWxzZSB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgZXhwZWN0KHN2ZykudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgTWFya0xhYmVsIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgY29uc3QgbWFya0xhYmVscyA9IGdldEFsbEJ5VGVzdElkKCdtYXJrLWxhYmVsJyk7XG4gICAgICBleHBlY3QobWFya0xhYmVscy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGZvcmVpZ25PYmplY3QgZm9yIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gZm9ybWF0dGVkVmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogbnVsbCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciB3aGVuIGZvcm1hdHRlZFZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBoaWRkZW4gbGFiZWwgZm9yIGxvbmdlc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IG1hcmtMYWJlbHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbCcpO1xuICAgICAgZXhwZWN0KG1hcmtMYWJlbHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYXRlZ29yeSBsYWJlbCBlZGl0aW5nJywgKCkgPT4ge1xuICAgIGl0KCdhbGxvd3MgZWRpdGluZyBjYXRlZ29yeSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlQ2F0ZWdvcnkgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoeyBvbkNoYW5nZUNhdGVnb3J5IH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdOZXcgTGFiZWwnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZUNhdGVnb3J5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgY2hhbmdlQ2F0ZWdvcnkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DaGFuZ2VDYXRlZ29yeSB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnVXBkYXRlZCcgfSB9KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgbGFiZWw6ICdVcGRhdGVkJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgZWRpdGluZyB3aGVuIGVkaXRhYmxlIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllcywgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0JlRGlzYWJsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmFibGVzIGVkaXRpbmcgaW4gZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAndGVzdCcsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9XTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgZGVmaW5lQ2hhcnQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGV4cGVjdChpbnB1dCkubm90LnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Jlc3BlY3RzIGVkaXRhYmxlIHByb3BlcnR5IHdoZW4gbm90IGluIGRlZmluZSBjaGFydCBtb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IHRydWUgfV07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGRlZmluZUNoYXJ0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS5ub3QudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlcmFjdGl2ZSBjaGVja2JveCcsICgpID0+IHtcbiAgICBpdCgnc2hvd3Mgd2FybmluZyB3aGVuIGRpc2FibGluZyBpbnRlcmFjdGl2ZSB3aXRoIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgaW50ZXJhY3RpdmUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IGZhbHNlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaW50ZXJhY3RpdmU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRpdGFibGUgY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3dzIHdhcm5pbmcgd2hlbiBkaXNhYmxpbmcgZWRpdGFibGUgd2l0aCBjb3JyZWN0IGFuc3dlciBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgZWRpdGFibGUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgZWRpdGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3BsaXRUZXh0IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgnc3BsaXRzIHRleHQgaW50byBjaHVua3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnVGhpcyBpcyBhIGxvbmcgdGV4dCcsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzcGxpdHMgYXQgd29yZCBib3VuZGFyaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ0hlbGxvIHdvcmxkIHRlc3QnLCAxMSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ0hlbGxvIHdvcmxkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB0ZXh0IHNob3J0ZXIgdGhhbiBtYXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnU2hvcnQnLCAyMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWydTaG9ydCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IHRleHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnJywgMTApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG51bGwgdGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wb25lbnQuc3BsaXRUZXh0KG51bGwsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yY2VzIHNwbGl0IHdoZW4gbm8gc3BhY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ3Zlcnlsb25nd29yZHdpdGhvdXRzcGFjZXMnLCAxMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgICBleHBlY3QocmVzdWx0WzBdLmxlbmd0aCkudG9CZUxlc3NUaGFuT3JFcXVhbCgxMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0bmVzcyBkaXNwbGF5JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICBsYWJlbDogJ3Rlc3QnLFxuICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCEnIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBjb3JyZWN0bmVzcyBpbmRpY2F0b3Igd2hlbiBub3QgaW50ZXJhY3RpdmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgbGFiZWw6ICd0ZXN0JyxcbiAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgc2hvd0NvcnJlY3RuZXNzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCd0aWNrLWNvcnJlY3RuZXNzLWluZGljYXRvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIGRpc3BsYXknLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZXJyb3IgbWVzc2FnZSBmb3IgZmlyc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIG1lc3NhZ2UnIH07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBlcnJvcixcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZGlzdGluY3QgZXJyb3IgbWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIDEnLCAxOiAnRXJyb3IgMScsIDI6ICdFcnJvciAyJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGVycm9yLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKTtcbiAgICAgIGV4cGVjdChlcnJvclRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGVycm9yIHdoZW4gbm8gZXJyb3IgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZXJyb3I6IG51bGwgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F1dG9Gb2N1cyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBhdXRvRm9jdXMgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQXV0b0ZvY3VzVXNlZCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgIG9uQXV0b0ZvY3VzVXNlZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgICA8c3ZnPlxuICAgICAgICAgICAgPFRpY2tDb21wb25lbnRcbiAgICAgICAgICAgICAgey4uLntcbiAgICAgICAgICAgICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICAgICAgICAgICAgeEJhbmQ6IGNyZWF0ZUJhbmRTY2FsZShbJ2EnLCAnYicsICdjJ10sIFswLCA0MDBdKSxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtQ2F0ZWdvcnkgQScsXG4gICAgICAgICAgICAgICAgYmFuZFdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgICAgICAgICAgICB4OiA1MCxcbiAgICAgICAgICAgICAgICB5OiA1MCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KG9uQXV0b0ZvY3VzVXNlZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgaW50ZXJhY3RpdmUgY2hlY2tib3hlcyB3aGVuIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdBbGxvdyBzdHVkZW50cyB0byBjaGFuZ2UnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlZGl0YWJsZSBjaGVja2JveGVzIHdoZW4gY2hhbmdlRWRpdGFibGVFbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hhcnRpbmdPcHRpb25zID0ge1xuICAgICAgICBjaGFuZ2VFZGl0YWJsZTogeyBhdXRob3JpbmdMYWJlbDogJ0FsbG93IGxhYmVsIGVkaXRpbmcnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUVkaXRhYmxlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3BsaXRzIGxvbmcgYXV0aG9yaW5nIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdUaGlzIGlzIGEgdmVyeSBsb25nIGxhYmVsIHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRzcGFucyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0c3BhbicpO1xuICAgICAgZXhwZWN0KHRzcGFucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyBjYXRlZ29yeScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzOiBbXSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLW1pc3NpbmcnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgaW52YWxpZCBmb3JtYXR0ZWRWYWx1ZSBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICdpbnZhbGlkJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1pc3NpbmcgZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBncmFwaFByb3BzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgemVybyBiYXJXaWR0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBiYXJXaWR0aDogMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHg6IC0xMCxcbiAgICAgICAgeTogLTIwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tcG9uZW50RGlkVXBkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkF1dG9Gb2N1c1VzZWQgd2hlbiBhdXRvRm9jdXMgY2hhbmdlcyB0byB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25BdXRvRm9jdXNVc2VkID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZFVwZGF0ZSh7IGF1dG9Gb2N1czogZmFsc2UgfSk7XG4gICAgICBleHBlY3Qob25BdXRvRm9jdXNVc2VkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBjb21wb25lbnQucHJvcHMgPSB7IGF1dG9Gb2N1czogdHJ1ZSwgb25BdXRvRm9jdXNVc2VkIH07XG4gICAgICBjb21wb25lbnQuY29tcG9uZW50RGlkVXBkYXRlKHsgYXV0b0ZvY3VzOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChvbkF1dG9Gb2N1c1VzZWQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFzRCxJQUFBTSxTQUFBO0VBQUFDLFVBQUE7QUFBQSxTQUFBSCx3QkFBQUksQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFB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