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

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 (59) hide show
  1. package/lib/__tests__/actions-button.test.js +332 -0
  2. package/lib/__tests__/axes.test.js +746 -0
  3. package/lib/__tests__/chart-setup.test.js +796 -0
  4. package/lib/__tests__/chart-type.test.js +25 -0
  5. package/lib/__tests__/chart.test.js +103 -0
  6. package/lib/__tests__/grid.test.js +39 -0
  7. package/lib/__tests__/key-legend.test.js +235 -0
  8. package/lib/__tests__/mark-label.test.js +46 -0
  9. package/lib/__tests__/tool-menu.test.js +627 -0
  10. package/lib/__tests__/utils.js +56 -0
  11. package/lib/__tests__/utils.test.js +186 -0
  12. package/lib/actions-button.js +1 -1
  13. package/lib/axes.js +1 -1
  14. package/lib/bars/__tests__/bar.test.js +53 -0
  15. package/lib/bars/__tests__/histogram.test.js +53 -0
  16. package/lib/bars/__tests__/utils.js +50 -0
  17. package/lib/bars/bar.js +1 -1
  18. package/lib/bars/common/__tests__/bars.test.js +76 -0
  19. package/lib/bars/common/__tests__/utils.js +50 -0
  20. package/lib/bars/common/bars.js +1 -1
  21. package/lib/bars/common/correct-check-icon.js +1 -1
  22. package/lib/bars/histogram.js +1 -1
  23. package/lib/chart-setup.js +1 -1
  24. package/lib/chart-type.js +1 -1
  25. package/lib/chart-types.js +1 -1
  26. package/lib/chart.js +1 -1
  27. package/lib/common/__tests__/correctness-indicators.test.js +887 -0
  28. package/lib/common/__tests__/drag-handle.test.js +73 -0
  29. package/lib/common/__tests__/utils.js +50 -0
  30. package/lib/common/correctness-indicators.js +1 -1
  31. package/lib/common/drag-handle.js +1 -1
  32. package/lib/common/drag-icon.js +1 -1
  33. package/lib/common/styles.js +1 -1
  34. package/lib/grid.js +1 -1
  35. package/lib/index.js +1 -1
  36. package/lib/key-legend.js +1 -1
  37. package/lib/line/__tests__/line-cross.test.js +617 -0
  38. package/lib/line/__tests__/line-dot.test.js +47 -0
  39. package/lib/line/__tests__/utils.js +56 -0
  40. package/lib/line/common/__tests__/drag-handle.test.js +73 -0
  41. package/lib/line/common/__tests__/line.test.js +92 -0
  42. package/lib/line/common/__tests__/utils.js +50 -0
  43. package/lib/line/common/drag-handle.js +1 -1
  44. package/lib/line/common/line.js +1 -1
  45. package/lib/line/line-cross.js +1 -1
  46. package/lib/line/line-dot.js +1 -1
  47. package/lib/mark-label.js +1 -1
  48. package/lib/plot/__tests__/dot.test.js +513 -0
  49. package/lib/plot/__tests__/line.test.js +566 -0
  50. package/lib/plot/__tests__/utils.js +50 -0
  51. package/lib/plot/common/__tests__/plot.test.js +79 -0
  52. package/lib/plot/common/__tests__/utils.js +50 -0
  53. package/lib/plot/common/plot.js +1 -1
  54. package/lib/plot/dot.js +1 -1
  55. package/lib/plot/line.js +1 -1
  56. package/lib/tool-menu.js +1 -1
  57. package/lib/utils.js +1 -1
  58. package/package.json +8 -11
  59. package/LICENSE.md +0 -5
@@ -0,0 +1,566 @@
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 _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
7
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _testUtils = require("@pie-lib/test-utils");
10
+ var _styles = require("@mui/material/styles");
11
+ var _line = _interopRequireWildcard(require("../line"));
12
+ var _utils = require("./utils");
13
+ var _excluded = ["data", "x", "y"];
14
+ 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); }
15
+ 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; }
16
+ 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; }
17
+ jest.mock('@mui/icons-material/Check', function () {
18
+ return function Check(props) {
19
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
20
+ "data-testid": "check-icon"
21
+ }, props));
22
+ };
23
+ });
24
+ jest.mock('@visx/shape', function () {
25
+ return {
26
+ LinePath: function LinePath(_ref) {
27
+ var data = _ref.data,
28
+ x = _ref.x,
29
+ y = _ref.y,
30
+ rest = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
31
+ return /*#__PURE__*/_react["default"].createElement("path", (0, _extends2["default"])({
32
+ d: data.map(function (d, i) {
33
+ return "".concat(i === 0 ? 'M' : 'L').concat(x(d), ",").concat(y(d));
34
+ }).join(' ')
35
+ }, rest));
36
+ }
37
+ };
38
+ });
39
+ jest.mock('@visx/group', function () {
40
+ return {
41
+ Group: function Group(_ref2) {
42
+ var children = _ref2.children;
43
+ return /*#__PURE__*/_react["default"].createElement("g", {
44
+ className: "visx-group"
45
+ }, children);
46
+ }
47
+ };
48
+ });
49
+ var theme;
50
+ beforeAll(function () {
51
+ theme = (0, _styles.createTheme)();
52
+ });
53
+ describe('LinePlot', function () {
54
+ var renderComponent = function renderComponent(extras) {
55
+ var defaults = {
56
+ classes: {},
57
+ className: 'className',
58
+ graphProps: (0, _utils.graphProps)(),
59
+ xBand: function xBand() {
60
+ return {
61
+ bandwidth: function bandwidth() {}
62
+ };
63
+ }
64
+ };
65
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
66
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
67
+ theme: theme
68
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_line.LinePlot, props))));
69
+ };
70
+ describe('rendering', function () {
71
+ it('renders line plot', function () {
72
+ var _renderComponent = renderComponent(),
73
+ container = _renderComponent.container;
74
+ expect(container.firstChild).toBeInTheDocument();
75
+ });
76
+ it('renders without graphProps', function () {
77
+ var _renderComponent2 = renderComponent({
78
+ graphProps: undefined
79
+ }),
80
+ container = _renderComponent2.container;
81
+ expect(container.firstChild).toBeInTheDocument();
82
+ });
83
+ it('renders with data array', function () {
84
+ var data = [{
85
+ value: 1,
86
+ label: 'A'
87
+ }, {
88
+ value: 2,
89
+ label: 'B'
90
+ }, {
91
+ value: 3,
92
+ label: 'C'
93
+ }];
94
+ var _renderComponent3 = renderComponent({
95
+ data: data
96
+ }),
97
+ container = _renderComponent3.container;
98
+ expect(container.firstChild).toBeInTheDocument();
99
+ });
100
+ it('renders with empty data array', function () {
101
+ var _renderComponent4 = renderComponent({
102
+ data: []
103
+ }),
104
+ container = _renderComponent4.container;
105
+ expect(container.firstChild).toBeInTheDocument();
106
+ });
107
+ it('renders with null data', function () {
108
+ var _renderComponent5 = renderComponent({
109
+ data: null
110
+ }),
111
+ container = _renderComponent5.container;
112
+ expect(container.firstChild).toBeInTheDocument();
113
+ });
114
+ it('renders with undefined data', function () {
115
+ var _renderComponent6 = renderComponent({
116
+ data: undefined
117
+ }),
118
+ container = _renderComponent6.container;
119
+ expect(container.firstChild).toBeInTheDocument();
120
+ });
121
+ it('renders with custom className', function () {
122
+ var _renderComponent7 = renderComponent({
123
+ className: 'custom-line-plot'
124
+ }),
125
+ container = _renderComponent7.container;
126
+ expect(container.firstChild).toBeInTheDocument();
127
+ });
128
+ it('renders with onChange handler', function () {
129
+ var onChange = jest.fn();
130
+ var _renderComponent8 = renderComponent({
131
+ onChange: onChange
132
+ }),
133
+ container = _renderComponent8.container;
134
+ expect(container.firstChild).toBeInTheDocument();
135
+ });
136
+ it('renders in defineChart mode', function () {
137
+ var _renderComponent9 = renderComponent({
138
+ defineChart: true
139
+ }),
140
+ container = _renderComponent9.container;
141
+ expect(container.firstChild).toBeInTheDocument();
142
+ });
143
+ it('renders with correctData', function () {
144
+ var data = [{
145
+ value: 2,
146
+ label: 'A'
147
+ }];
148
+ var correctData = [{
149
+ value: 3,
150
+ label: 'A'
151
+ }];
152
+ var _renderComponent0 = renderComponent({
153
+ data: data,
154
+ correctData: correctData
155
+ }),
156
+ container = _renderComponent0.container;
157
+ expect(container.firstChild).toBeInTheDocument();
158
+ });
159
+ });
160
+ describe('graphProps handling', function () {
161
+ it('handles graphProps with missing scale', function () {
162
+ var props = (0, _utils.graphProps)();
163
+ delete props.scale;
164
+ var _renderComponent1 = renderComponent({
165
+ graphProps: props
166
+ }),
167
+ container = _renderComponent1.container;
168
+ expect(container.firstChild).toBeInTheDocument();
169
+ });
170
+ it('handles graphProps with missing size', function () {
171
+ var props = (0, _utils.graphProps)();
172
+ delete props.size;
173
+ var _renderComponent10 = renderComponent({
174
+ graphProps: props
175
+ }),
176
+ container = _renderComponent10.container;
177
+ expect(container.firstChild).toBeInTheDocument();
178
+ });
179
+ it('handles graphProps with empty scale object', function () {
180
+ var props = (0, _utils.graphProps)();
181
+ props.scale = {};
182
+ var _renderComponent11 = renderComponent({
183
+ graphProps: props
184
+ }),
185
+ container = _renderComponent11.container;
186
+ expect(container.firstChild).toBeInTheDocument();
187
+ });
188
+ it('handles graphProps with empty size object', function () {
189
+ var props = (0, _utils.graphProps)();
190
+ props.size = {};
191
+ var _renderComponent12 = renderComponent({
192
+ graphProps: props
193
+ }),
194
+ container = _renderComponent12.container;
195
+ expect(container.firstChild).toBeInTheDocument();
196
+ });
197
+ });
198
+ describe('data variations', function () {
199
+ it('renders with single data point', function () {
200
+ var data = [{
201
+ value: 1,
202
+ label: 'A'
203
+ }];
204
+ var _renderComponent13 = renderComponent({
205
+ data: data
206
+ }),
207
+ container = _renderComponent13.container;
208
+ expect(container.firstChild).toBeInTheDocument();
209
+ });
210
+ it('renders with multiple data points', function () {
211
+ var data = [{
212
+ value: 1,
213
+ label: 'A'
214
+ }, {
215
+ value: 2,
216
+ label: 'B'
217
+ }, {
218
+ value: 3,
219
+ label: 'C'
220
+ }, {
221
+ value: 4,
222
+ label: 'D'
223
+ }];
224
+ var _renderComponent14 = renderComponent({
225
+ data: data
226
+ }),
227
+ container = _renderComponent14.container;
228
+ expect(container.firstChild).toBeInTheDocument();
229
+ });
230
+ it('renders with zero values', function () {
231
+ var data = [{
232
+ value: 0,
233
+ label: 'A'
234
+ }, {
235
+ value: 0,
236
+ label: 'B'
237
+ }];
238
+ var _renderComponent15 = renderComponent({
239
+ data: data
240
+ }),
241
+ container = _renderComponent15.container;
242
+ expect(container.firstChild).toBeInTheDocument();
243
+ });
244
+ it('renders with mixed values', function () {
245
+ var data = [{
246
+ value: 0,
247
+ label: 'A'
248
+ }, {
249
+ value: 5,
250
+ label: 'B'
251
+ }, {
252
+ value: 1,
253
+ label: 'C'
254
+ }];
255
+ var _renderComponent16 = renderComponent({
256
+ data: data
257
+ }),
258
+ container = _renderComponent16.container;
259
+ expect(container.firstChild).toBeInTheDocument();
260
+ });
261
+ it('renders with large values', function () {
262
+ var data = [{
263
+ value: 100,
264
+ label: 'A'
265
+ }, {
266
+ value: 200,
267
+ label: 'B'
268
+ }];
269
+ var _renderComponent17 = renderComponent({
270
+ data: data
271
+ }),
272
+ container = _renderComponent17.container;
273
+ expect(container.firstChild).toBeInTheDocument();
274
+ });
275
+ it('renders with correctness data', function () {
276
+ var data = [{
277
+ value: 2,
278
+ label: 'A',
279
+ correctness: {
280
+ value: 'correct',
281
+ label: 'Correct'
282
+ }
283
+ }, {
284
+ value: 3,
285
+ label: 'B',
286
+ correctness: {
287
+ value: 'correct',
288
+ label: 'Correct'
289
+ }
290
+ }];
291
+ var _renderComponent18 = renderComponent({
292
+ data: data
293
+ }),
294
+ container = _renderComponent18.container;
295
+ expect(container.firstChild).toBeInTheDocument();
296
+ });
297
+ it('renders with incorrect correctness and correctData', function () {
298
+ var data = [{
299
+ value: 2,
300
+ label: 'A',
301
+ correctness: {
302
+ value: 'incorrect',
303
+ label: 'Incorrect'
304
+ }
305
+ }, {
306
+ value: 3,
307
+ label: 'B',
308
+ correctness: {
309
+ value: 'incorrect',
310
+ label: 'Incorrect'
311
+ }
312
+ }];
313
+ var correctData = [{
314
+ value: 3,
315
+ label: 'A'
316
+ }, {
317
+ value: 4,
318
+ label: 'B'
319
+ }];
320
+ var _renderComponent19 = renderComponent({
321
+ data: data,
322
+ correctData: correctData
323
+ }),
324
+ container = _renderComponent19.container;
325
+ expect(container.firstChild).toBeInTheDocument();
326
+ });
327
+ it('renders with interactive data points', function () {
328
+ var data = [{
329
+ value: 2,
330
+ label: 'A',
331
+ interactive: true
332
+ }, {
333
+ value: 3,
334
+ label: 'B',
335
+ interactive: false
336
+ }];
337
+ var _renderComponent20 = renderComponent({
338
+ data: data
339
+ }),
340
+ container = _renderComponent20.container;
341
+ expect(container.firstChild).toBeInTheDocument();
342
+ });
343
+ });
344
+ describe('callbacks', function () {
345
+ it('passes onChange handler to Plot component', function () {
346
+ var onChange = jest.fn();
347
+ var data = [{
348
+ value: 1,
349
+ label: 'A'
350
+ }];
351
+ var _renderComponent21 = renderComponent({
352
+ data: data,
353
+ onChange: onChange
354
+ }),
355
+ container = _renderComponent21.container;
356
+ expect(container.firstChild).toBeInTheDocument();
357
+ });
358
+ it('handles onChangeCategory callback', function () {
359
+ var onChangeCategory = jest.fn();
360
+ var data = [{
361
+ value: 1,
362
+ label: 'A'
363
+ }];
364
+ var _renderComponent22 = renderComponent({
365
+ data: data,
366
+ onChangeCategory: onChangeCategory
367
+ }),
368
+ container = _renderComponent22.container;
369
+ expect(container.firstChild).toBeInTheDocument();
370
+ });
371
+ });
372
+ describe('component', function () {
373
+ it('returns correct chart object', function () {
374
+ var chart = (0, _line["default"])();
375
+ expect(chart).toEqual({
376
+ type: 'linePlot',
377
+ Component: _line.LinePlot,
378
+ name: 'Line Plot'
379
+ });
380
+ });
381
+ it('returns object with Component that can be rendered', function () {
382
+ var chart = (0, _line["default"])();
383
+ var Component = chart.Component;
384
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Component, {
385
+ graphProps: (0, _utils.graphProps)()
386
+ })),
387
+ container = _render.container;
388
+ expect(container.firstChild).toBeInTheDocument();
389
+ });
390
+ });
391
+ });
392
+ describe('CustomBarElement (Line)', function () {
393
+ var renderLinePlot = function renderLinePlot(props) {
394
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
395
+ theme: theme
396
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_line.LinePlot, props))));
397
+ };
398
+ it('renders line elements', function () {
399
+ var data = [{
400
+ value: 1,
401
+ label: 'A'
402
+ }];
403
+ var _renderLinePlot = renderLinePlot({
404
+ data: data,
405
+ graphProps: (0, _utils.graphProps)()
406
+ }),
407
+ container = _renderLinePlot.container;
408
+ expect(container).toBeInTheDocument();
409
+ });
410
+ it('renders with dottedOverline prop', function () {
411
+ var data = [{
412
+ value: 2,
413
+ label: 'A',
414
+ correctness: {
415
+ value: 'incorrect'
416
+ }
417
+ }];
418
+ var correctData = [{
419
+ value: 3,
420
+ label: 'A'
421
+ }];
422
+ var _renderLinePlot2 = renderLinePlot({
423
+ data: data,
424
+ graphProps: (0, _utils.graphProps)(),
425
+ correctData: correctData
426
+ }),
427
+ container = _renderLinePlot2.container;
428
+ expect(container).toBeInTheDocument();
429
+ });
430
+ it('renders without dottedOverline prop', function () {
431
+ var data = [{
432
+ value: 2,
433
+ label: 'A'
434
+ }];
435
+ var _renderLinePlot3 = renderLinePlot({
436
+ data: data,
437
+ graphProps: (0, _utils.graphProps)()
438
+ }),
439
+ container = _renderLinePlot3.container;
440
+ expect(container).toBeInTheDocument();
441
+ });
442
+ it('renders two LinePath elements for X shape when not dotted', function () {
443
+ var data = [{
444
+ value: 3,
445
+ label: 'A'
446
+ }];
447
+ var _renderLinePlot4 = renderLinePlot({
448
+ data: data,
449
+ graphProps: (0, _utils.graphProps)()
450
+ }),
451
+ container = _renderLinePlot4.container;
452
+ expect(container).toBeInTheDocument();
453
+ });
454
+ it('renders rect with dashed stroke when dottedOverline is true', function () {
455
+ var data = [{
456
+ value: 2,
457
+ label: 'A',
458
+ correctness: {
459
+ value: 'incorrect'
460
+ }
461
+ }];
462
+ var correctData = [{
463
+ value: 3,
464
+ label: 'A'
465
+ }];
466
+ var _renderLinePlot5 = renderLinePlot({
467
+ data: data,
468
+ graphProps: (0, _utils.graphProps)(),
469
+ correctData: correctData
470
+ }),
471
+ container = _renderLinePlot5.container;
472
+ expect(container).toBeInTheDocument();
473
+ });
474
+ it('calculates correct line positions', function () {
475
+ var data = [{
476
+ value: 2,
477
+ label: 'A'
478
+ }];
479
+ var _renderLinePlot6 = renderLinePlot({
480
+ data: data,
481
+ graphProps: (0, _utils.graphProps)()
482
+ }),
483
+ container = _renderLinePlot6.container;
484
+ expect(container).toBeInTheDocument();
485
+ });
486
+ it('handles zero pointDiameter', function () {
487
+ var props = (0, _utils.graphProps)();
488
+ props.size = {
489
+ width: 0,
490
+ height: 0
491
+ };
492
+ var data = [{
493
+ value: 1,
494
+ label: 'A'
495
+ }];
496
+ var _renderLinePlot7 = renderLinePlot({
497
+ data: data,
498
+ graphProps: props
499
+ }),
500
+ container = _renderLinePlot7.container;
501
+ expect(container).toBeInTheDocument();
502
+ });
503
+ it('handles large pointDiameter values', function () {
504
+ var props = (0, _utils.graphProps)();
505
+ props.size = {
506
+ width: 1000,
507
+ height: 1000
508
+ };
509
+ var data = [{
510
+ value: 1,
511
+ label: 'A'
512
+ }];
513
+ var _renderLinePlot8 = renderLinePlot({
514
+ data: data,
515
+ graphProps: props
516
+ }),
517
+ container = _renderLinePlot8.container;
518
+ expect(container).toBeInTheDocument();
519
+ });
520
+ it('applies correct strokeWidth based on pointDiameter', function () {
521
+ var data = [{
522
+ value: 2,
523
+ label: 'A'
524
+ }];
525
+ var _renderLinePlot9 = renderLinePlot({
526
+ data: data,
527
+ graphProps: (0, _utils.graphProps)()
528
+ }),
529
+ container = _renderLinePlot9.container;
530
+ // strokeWidth should be pointDiameter / 5
531
+ expect(container).toBeInTheDocument();
532
+ });
533
+ it('renders Group component wrapping LinePaths', function () {
534
+ var data = [{
535
+ value: 1,
536
+ label: 'A'
537
+ }];
538
+ var _renderLinePlot0 = renderLinePlot({
539
+ data: data,
540
+ graphProps: (0, _utils.graphProps)()
541
+ }),
542
+ container = _renderLinePlot0.container;
543
+ expect(container).toBeInTheDocument();
544
+ });
545
+ it('handles rect with extra padding when dotted', function () {
546
+ var data = [{
547
+ value: 2,
548
+ label: 'A',
549
+ correctness: {
550
+ value: 'incorrect'
551
+ }
552
+ }];
553
+ var correctData = [{
554
+ value: 3,
555
+ label: 'A'
556
+ }];
557
+ var _renderLinePlot1 = renderLinePlot({
558
+ data: data,
559
+ graphProps: (0, _utils.graphProps)(),
560
+ correctData: correctData
561
+ }),
562
+ container = _renderLinePlot1.container;
563
+ expect(container).toBeInTheDocument();
564
+ });
565
+ });
566
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfc3R5bGVzIiwiX2xpbmUiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91dGlscyIsIl9leGNsdWRlZCIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJqZXN0IiwibW9jayIsIkNoZWNrIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiTGluZVBhdGgiLCJfcmVmIiwiZGF0YSIsIngiLCJ5IiwicmVzdCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJkIiwibWFwIiwiY29uY2F0Iiwiam9pbiIsIkdyb3VwIiwiX3JlZjIiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsInRoZW1lIiwiYmVmb3JlQWxsIiwiY3JlYXRlVGhlbWUiLCJkZXNjcmliZSIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsImRlZmF1bHRzIiwiY2xhc3NlcyIsImdyYXBoUHJvcHMiLCJ4QmFuZCIsImJhbmR3aWR0aCIsInJlbmRlciIsIlRoZW1lUHJvdmlkZXIiLCJMaW5lUGxvdCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwidW5kZWZpbmVkIiwidmFsdWUiLCJsYWJlbCIsIl9yZW5kZXJDb21wb25lbnQzIiwiX3JlbmRlckNvbXBvbmVudDQiLCJfcmVuZGVyQ29tcG9uZW50NSIsIl9yZW5kZXJDb21wb25lbnQ2IiwiX3JlbmRlckNvbXBvbmVudDciLCJvbkNoYW5nZSIsImZuIiwiX3JlbmRlckNvbXBvbmVudDgiLCJfcmVuZGVyQ29tcG9uZW50OSIsImRlZmluZUNoYXJ0IiwiY29ycmVjdERhdGEiLCJfcmVuZGVyQ29tcG9uZW50MCIsInNjYWxlIiwiX3JlbmRlckNvbXBvbmVudDEiLCJzaXplIiwiX3JlbmRlckNvbXBvbmVudDEwIiwiX3JlbmRlckNvbXBvbmVudDExIiwiX3JlbmRlckNvbXBvbmVudDEyIiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwiX3JlbmRlckNvbXBvbmVudDE2IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50MTgiLCJfcmVuZGVyQ29tcG9uZW50MTkiLCJpbnRlcmFjdGl2ZSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9yZW5kZXJDb21wb25lbnQyMSIsIm9uQ2hhbmdlQ2F0ZWdvcnkiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJjaGFydCIsIkxpbmUiLCJ0b0VxdWFsIiwidHlwZSIsIkNvbXBvbmVudCIsIm5hbWUiLCJfcmVuZGVyIiwicmVuZGVyTGluZVBsb3QiLCJfcmVuZGVyTGluZVBsb3QiLCJfcmVuZGVyTGluZVBsb3QyIiwiX3JlbmRlckxpbmVQbG90MyIsIl9yZW5kZXJMaW5lUGxvdDQiLCJfcmVuZGVyTGluZVBsb3Q1IiwiX3JlbmRlckxpbmVQbG90NiIsIndpZHRoIiwiaGVpZ2h0IiwiX3JlbmRlckxpbmVQbG90NyIsIl9yZW5kZXJMaW5lUGxvdDgiLCJfcmVuZGVyTGluZVBsb3Q5IiwiX3JlbmRlckxpbmVQbG90MCIsIl9yZW5kZXJMaW5lUGxvdDEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGxvdC9fX3Rlc3RzX18vbGluZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVUaGVtZSwgVGhlbWVQcm92aWRlciB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCBMaW5lLCB7IExpbmVQbG90IH0gZnJvbSAnLi4vbGluZSc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmplc3QubW9jaygnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVjaycsICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIENoZWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJjaGVjay1pY29uXCIgey4uLnByb3BzfSAvPjtcbiAgfTtcbn0pO1xuXG5qZXN0Lm1vY2soJ0B2aXN4L3NoYXBlJywgKCkgPT4gKHtcbiAgTGluZVBhdGg6ICh7IGRhdGEsIHgsIHksIC4uLnJlc3QgfSkgPT4gKFxuICAgIDxwYXRoIGQ9e2RhdGEubWFwKChkLCBpKSA9PiBgJHtpID09PSAwID8gJ00nIDogJ0wnfSR7eChkKX0sJHt5KGQpfWApLmpvaW4oJyAnKX0gey4uLnJlc3R9IC8+XG4gICksXG59KSk7XG5cbmplc3QubW9jaygnQHZpc3gvZ3JvdXAnLCAoKSA9PiAoe1xuICBHcm91cDogKHsgY2hpbGRyZW4gfSkgPT4gPGcgY2xhc3NOYW1lPVwidmlzeC1ncm91cFwiPntjaGlsZHJlbn08L2c+LFxufSkpO1xuXG5sZXQgdGhlbWU7XG5cbmJlZm9yZUFsbCgoKSA9PiB7XG4gIHRoZW1lID0gY3JlYXRlVGhlbWUoKTtcbn0pO1xuXG5kZXNjcmliZSgnTGluZVBsb3QnLCAoKSA9PiB7XG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIHhCYW5kOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmFuZHdpZHRoOiAoKSA9PiB7fSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxMaW5lUGxvdCB7Li4ucHJvcHN9IC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9UaGVtZVByb3ZpZGVyPixcbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgbGluZSBwbG90JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBncmFwaFByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdyYXBoUHJvcHM6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZGF0YSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgIHsgdmFsdWU6IDEsIGxhYmVsOiAnQScgfSxcbiAgICAgICAgeyB2YWx1ZTogMiwgbGFiZWw6ICdCJyB9LFxuICAgICAgICB7IHZhbHVlOiAzLCBsYWJlbDogJ0MnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IGRhdGEgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YTogW10gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG51bGwgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkYXRhOiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCB1bmRlZmluZWQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkYXRhOiB1bmRlZmluZWQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGN1c3RvbSBjbGFzc05hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2xhc3NOYW1lOiAnY3VzdG9tLWxpbmUtcGxvdCcgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG9uQ2hhbmdlIGhhbmRsZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBvbkNoYW5nZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGluIGRlZmluZUNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGVmaW5lQ2hhcnQ6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3REYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IFt7IHZhbHVlOiAyLCBsYWJlbDogJ0EnIH1dO1xuICAgICAgY29uc3QgY29ycmVjdERhdGEgPSBbeyB2YWx1ZTogMywgbGFiZWw6ICdBJyB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkYXRhLCBjb3JyZWN0RGF0YSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dyYXBoUHJvcHMgaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgZ3JhcGhQcm9wcyB3aXRoIG1pc3Npbmcgc2NhbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IGdyYXBoUHJvcHMoKTtcbiAgICAgIGRlbGV0ZSBwcm9wcy5zY2FsZTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBwcm9wcyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGdyYXBoUHJvcHMgd2l0aCBtaXNzaW5nIHNpemUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IGdyYXBoUHJvcHMoKTtcbiAgICAgIGRlbGV0ZSBwcm9wcy5zaXplO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdyYXBoUHJvcHM6IHByb3BzIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZ3JhcGhQcm9wcyB3aXRoIGVtcHR5IHNjYWxlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0gZ3JhcGhQcm9wcygpO1xuICAgICAgcHJvcHMuc2NhbGUgPSB7fTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBwcm9wcyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGdyYXBoUHJvcHMgd2l0aCBlbXB0eSBzaXplIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0gZ3JhcGhQcm9wcygpO1xuICAgICAgcHJvcHMuc2l6ZSA9IHt9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdyYXBoUHJvcHM6IHByb3BzIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGF0YSB2YXJpYXRpb25zJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggc2luZ2xlIGRhdGEgcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAnQScgfV07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbXVsdGlwbGUgZGF0YSBwb2ludHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gW1xuICAgICAgICB7IHZhbHVlOiAxLCBsYWJlbDogJ0EnIH0sXG4gICAgICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQicgfSxcbiAgICAgICAgeyB2YWx1ZTogMywgbGFiZWw6ICdDJyB9LFxuICAgICAgICB7IHZhbHVlOiA0LCBsYWJlbDogJ0QnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHplcm8gdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IFtcbiAgICAgICAgeyB2YWx1ZTogMCwgbGFiZWw6ICdBJyB9LFxuICAgICAgICB7IHZhbHVlOiAwLCBsYWJlbDogJ0InIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1peGVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgIHsgdmFsdWU6IDAsIGxhYmVsOiAnQScgfSxcbiAgICAgICAgeyB2YWx1ZTogNSwgbGFiZWw6ICdCJyB9LFxuICAgICAgICB7IHZhbHVlOiAxLCBsYWJlbDogJ0MnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhcmdlIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgIHsgdmFsdWU6IDEwMCwgbGFiZWw6ICdBJyB9LFxuICAgICAgICB7IHZhbHVlOiAyMDAsIGxhYmVsOiAnQicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQScsIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSB9LFxuICAgICAgICB7IHZhbHVlOiAzLCBsYWJlbDogJ0InLCBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0NvcnJlY3QnIH0gfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggaW5jb3JyZWN0IGNvcnJlY3RuZXNzIGFuZCBjb3JyZWN0RGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQScsIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdJbmNvcnJlY3QnIH0gfSxcbiAgICAgICAgeyB2YWx1ZTogMywgbGFiZWw6ICdCJywgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ0luY29ycmVjdCcgfSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvcnJlY3REYXRhID0gW1xuICAgICAgICB7IHZhbHVlOiAzLCBsYWJlbDogJ0EnIH0sXG4gICAgICAgIHsgdmFsdWU6IDQsIGxhYmVsOiAnQicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YSwgY29ycmVjdERhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGludGVyYWN0aXZlIGRhdGEgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IFtcbiAgICAgICAgeyB2YWx1ZTogMiwgbGFiZWw6ICdBJywgaW50ZXJhY3RpdmU6IHRydWUgfSxcbiAgICAgICAgeyB2YWx1ZTogMywgbGFiZWw6ICdCJywgaW50ZXJhY3RpdmU6IGZhbHNlIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYWxsYmFja3MnLCAoKSA9PiB7XG4gICAgaXQoJ3Bhc3NlcyBvbkNoYW5nZSBoYW5kbGVyIHRvIFBsb3QgY29tcG9uZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAnQScgfV07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGF0YSwgb25DaGFuZ2UgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBvbkNoYW5nZUNhdGVnb3J5IGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VDYXRlZ29yeSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBbeyB2YWx1ZTogMSwgbGFiZWw6ICdBJyB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkYXRhLCBvbkNoYW5nZUNhdGVnb3J5IH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgY2hhcnQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hhcnQgPSBMaW5lKCk7XG5cbiAgICAgIGV4cGVjdChjaGFydCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdsaW5lUGxvdCcsXG4gICAgICAgIENvbXBvbmVudDogTGluZVBsb3QsXG4gICAgICAgIG5hbWU6ICdMaW5lIFBsb3QnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBvYmplY3Qgd2l0aCBDb21wb25lbnQgdGhhdCBjYW4gYmUgcmVuZGVyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFydCA9IExpbmUoKTtcbiAgICAgIGNvbnN0IHsgQ29tcG9uZW50IH0gPSBjaGFydDtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q29tcG9uZW50IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQ3VzdG9tQmFyRWxlbWVudCAoTGluZSknLCAoKSA9PiB7XG4gIGNvbnN0IHJlbmRlckxpbmVQbG90ID0gKHByb3BzKSA9PlxuICAgIHJlbmRlcihcbiAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxzdmc+XG4gICAgICAgICAgPExpbmVQbG90IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG5cbiAgaXQoJ3JlbmRlcnMgbGluZSBlbGVtZW50cycsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAnQScgfV07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckxpbmVQbG90KHtcbiAgICAgIGRhdGEsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aCBkb3R0ZWRPdmVybGluZSBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBbeyB2YWx1ZTogMiwgbGFiZWw6ICdBJywgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnIH0gfV07XG4gICAgY29uc3QgY29ycmVjdERhdGEgPSBbeyB2YWx1ZTogMywgbGFiZWw6ICdBJyB9XTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyTGluZVBsb3Qoe1xuICAgICAgZGF0YSxcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIGNvcnJlY3REYXRhLFxuICAgIH0pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgZG90dGVkT3ZlcmxpbmUgcHJvcCcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDIsIGxhYmVsOiAnQScgfV07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckxpbmVQbG90KHtcbiAgICAgIGRhdGEsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgdHdvIExpbmVQYXRoIGVsZW1lbnRzIGZvciBYIHNoYXBlIHdoZW4gbm90IGRvdHRlZCcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDMsIGxhYmVsOiAnQScgfV07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckxpbmVQbG90KHtcbiAgICAgIGRhdGEsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgcmVjdCB3aXRoIGRhc2hlZCBzdHJva2Ugd2hlbiBkb3R0ZWRPdmVybGluZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBbeyB2YWx1ZTogMiwgbGFiZWw6ICdBJywgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnIH0gfV07XG4gICAgY29uc3QgY29ycmVjdERhdGEgPSBbeyB2YWx1ZTogMywgbGFiZWw6ICdBJyB9XTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyTGluZVBsb3Qoe1xuICAgICAgZGF0YSxcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIGNvcnJlY3REYXRhLFxuICAgIH0pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxjdWxhdGVzIGNvcnJlY3QgbGluZSBwb3NpdGlvbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFt7IHZhbHVlOiAyLCBsYWJlbDogJ0EnIH1dO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJMaW5lUGxvdCh7XG4gICAgICBkYXRhLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgIH0pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIHplcm8gcG9pbnREaWFtZXRlcicsICgpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IGdyYXBoUHJvcHMoKTtcbiAgICBwcm9wcy5zaXplID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgY29uc3QgZGF0YSA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ0EnIH1dO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJMaW5lUGxvdCh7XG4gICAgICBkYXRhLFxuICAgICAgZ3JhcGhQcm9wczogcHJvcHMsXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgbGFyZ2UgcG9pbnREaWFtZXRlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSBncmFwaFByb3BzKCk7XG4gICAgcHJvcHMuc2l6ZSA9IHsgd2lkdGg6IDEwMDAsIGhlaWdodDogMTAwMCB9O1xuICAgIGNvbnN0IGRhdGEgPSBbeyB2YWx1ZTogMSwgbGFiZWw6ICdBJyB9XTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyTGluZVBsb3Qoe1xuICAgICAgZGF0YSxcbiAgICAgIGdyYXBoUHJvcHM6IHByb3BzLFxuICAgIH0pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGNvcnJlY3Qgc3Ryb2tlV2lkdGggYmFzZWQgb24gcG9pbnREaWFtZXRlcicsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDIsIGxhYmVsOiAnQScgfV07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckxpbmVQbG90KHtcbiAgICAgIGRhdGEsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfSk7XG4gICAgLy8gc3Ryb2tlV2lkdGggc2hvdWxkIGJlIHBvaW50RGlhbWV0ZXIgLyA1XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgR3JvdXAgY29tcG9uZW50IHdyYXBwaW5nIExpbmVQYXRocycsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAnQScgfV07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckxpbmVQbG90KHtcbiAgICAgIGRhdGEsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgcmVjdCB3aXRoIGV4dHJhIHBhZGRpbmcgd2hlbiBkb3R0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFt7IHZhbHVlOiAyLCBsYWJlbDogJ0EnLCBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcgfSB9XTtcbiAgICBjb25zdCBjb3JyZWN0RGF0YSA9IFt7IHZhbHVlOiAzLCBsYWJlbDogJ0EnIH1dO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJMaW5lUGxvdCh7XG4gICAgICBkYXRhLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgICAgY29ycmVjdERhdGEsXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFxQyxJQUFBTSxTQUFBO0FBQUEsU0FBQUYsd0JBQUFHLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFMLHVCQUFBLFlBQUFBLHdCQUFBRyxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsbUJBQUFULENBQUEsaUJBQUFBLENBQUEsZ0JBQUFVLE9BQUEsQ0FBQVYsQ0FBQSwwQkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFB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