@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4

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 (114) hide show
  1. package/CHANGELOG.md +18 -30
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,828 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
- var _index = require("../index");
7
- var _utils = require("../../../utils");
8
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (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; }
10
- jest.mock('../../../utils', function () {
11
- return {
12
- equalPoints: jest.fn(),
13
- sameAxes: jest.fn()
14
- };
15
- });
16
- jest.mock('debug', function () {
17
- return jest.fn(function () {
18
- return jest.fn();
19
- });
20
- });
21
- describe('exponential tool', function () {
22
- var exponentialTool;
23
- beforeEach(function () {
24
- jest.clearAllMocks();
25
- exponentialTool = (0, _index.tool)();
26
- });
27
- describe('tool configuration', function () {
28
- it('creates a tool object', function () {
29
- expect(exponentialTool).toBeDefined();
30
- expect((0, _typeof2["default"])(exponentialTool)).toBe('object');
31
- });
32
- it('has type exponential', function () {
33
- expect(exponentialTool.type).toBe('exponential');
34
- });
35
- it('has a Component', function () {
36
- expect(exponentialTool.Component).toBeDefined();
37
- });
38
- it('has complete function', function () {
39
- expect((0, _typeof2["default"])(exponentialTool.complete)).toBe('function');
40
- });
41
- it('has addPoint function', function () {
42
- expect((0, _typeof2["default"])(exponentialTool.addPoint)).toBe('function');
43
- });
44
- it('does not have hover function', function () {
45
- expect(exponentialTool.hover).toBeUndefined();
46
- });
47
- });
48
- describe('complete', function () {
49
- it('marks exponential as complete', function () {
50
- var data = {
51
- x: 5,
52
- y: 10
53
- };
54
- var mark = {
55
- type: 'exponential',
56
- root: {
57
- x: 0,
58
- y: 1
59
- },
60
- edge: {
61
- x: 5,
62
- y: 10
63
- },
64
- building: true,
65
- closed: false
66
- };
67
- var result = exponentialTool.complete(data, mark);
68
- expect(result).toEqual(_objectSpread(_objectSpread({}, mark), {}, {
69
- building: false,
70
- closed: true
71
- }));
72
- });
73
- it('sets building to false', function () {
74
- var mark = {
75
- type: 'exponential',
76
- root: {
77
- x: 0,
78
- y: 1
79
- },
80
- building: true
81
- };
82
- var result = exponentialTool.complete({}, mark);
83
- expect(result.building).toBe(false);
84
- });
85
- it('sets closed to true', function () {
86
- var mark = {
87
- type: 'exponential',
88
- root: {
89
- x: 0,
90
- y: 1
91
- },
92
- closed: false
93
- };
94
- var result = exponentialTool.complete({}, mark);
95
- expect(result.closed).toBe(true);
96
- });
97
- it('preserves mark properties', function () {
98
- var mark = {
99
- type: 'exponential',
100
- root: {
101
- x: 0,
102
- y: 1
103
- },
104
- edge: {
105
- x: 5,
106
- y: 10
107
- },
108
- label: 'Exp A',
109
- correctness: {
110
- value: 'correct'
111
- }
112
- };
113
- var result = exponentialTool.complete({}, mark);
114
- expect(result.label).toBe('Exp A');
115
- expect(result.correctness).toEqual({
116
- value: 'correct'
117
- });
118
- expect(result.root).toEqual(mark.root);
119
- expect(result.edge).toEqual(mark.edge);
120
- });
121
- it('does not mutate original mark', function () {
122
- var mark = {
123
- type: 'exponential',
124
- root: {
125
- x: 0,
126
- y: 1
127
- },
128
- building: true,
129
- closed: false
130
- };
131
- var originalMark = _objectSpread({}, mark);
132
- exponentialTool.complete({}, mark);
133
- expect(mark).toEqual(originalMark);
134
- });
135
- });
136
- describe('addPoint', function () {
137
- describe('first point (creating root)', function () {
138
- it('creates new exponential mark when no mark exists', function () {
139
- var point = {
140
- x: 0,
141
- y: 5
142
- };
143
- var mark = null;
144
- _utils.equalPoints.mockReturnValue(false);
145
- _utils.sameAxes.mockReturnValue(false);
146
- var result = exponentialTool.addPoint(point, mark);
147
- expect(result).toEqual({
148
- type: 'exponential',
149
- root: point,
150
- edge: undefined,
151
- closed: false,
152
- building: true
153
- });
154
- });
155
- it('creates mark with building true', function () {
156
- var point = {
157
- x: 2,
158
- y: 3
159
- };
160
- _utils.equalPoints.mockReturnValue(false);
161
- _utils.sameAxes.mockReturnValue(false);
162
- var result = exponentialTool.addPoint(point, null);
163
- expect(result.building).toBe(true);
164
- });
165
- it('creates mark with closed false', function () {
166
- var point = {
167
- x: 2,
168
- y: 3
169
- };
170
- _utils.equalPoints.mockReturnValue(false);
171
- _utils.sameAxes.mockReturnValue(false);
172
- var result = exponentialTool.addPoint(point, null);
173
- expect(result.closed).toBe(false);
174
- });
175
- it('creates mark with undefined edge', function () {
176
- var point = {
177
- x: 2,
178
- y: 3
179
- };
180
- _utils.equalPoints.mockReturnValue(false);
181
- _utils.sameAxes.mockReturnValue(false);
182
- var result = exponentialTool.addPoint(point, null);
183
- expect(result.edge).toBeUndefined();
184
- });
185
- it('works with positive coordinates', function () {
186
- var point = {
187
- x: 5,
188
- y: 10
189
- };
190
- _utils.equalPoints.mockReturnValue(false);
191
- _utils.sameAxes.mockReturnValue(false);
192
- var result = exponentialTool.addPoint(point, null);
193
- expect(result.root).toEqual(point);
194
- });
195
- it('works with negative y coordinate', function () {
196
- var point = {
197
- x: 5,
198
- y: -10
199
- };
200
- _utils.equalPoints.mockReturnValue(false);
201
- _utils.sameAxes.mockReturnValue(false);
202
- var result = exponentialTool.addPoint(point, null);
203
- expect(result.root).toEqual(point);
204
- });
205
- it('works with decimal coordinates', function () {
206
- var point = {
207
- x: 3.5,
208
- y: 7.25
209
- };
210
- _utils.equalPoints.mockReturnValue(false);
211
- _utils.sameAxes.mockReturnValue(false);
212
- var result = exponentialTool.addPoint(point, null);
213
- expect(result.root).toEqual(point);
214
- });
215
- });
216
- describe('second point (completing exponential)', function () {
217
- it('completes exponential when adding edge point', function () {
218
- var root = {
219
- x: 0,
220
- y: 1
221
- };
222
- var edge = {
223
- x: 5,
224
- y: 10
225
- };
226
- var mark = {
227
- type: 'exponential',
228
- root: root,
229
- edge: undefined,
230
- closed: false,
231
- building: true
232
- };
233
- _utils.equalPoints.mockReturnValue(false);
234
- _utils.sameAxes.mockReturnValue(false);
235
- var result = exponentialTool.addPoint(edge, mark);
236
- expect(result).toEqual(_objectSpread(_objectSpread({}, mark), {}, {
237
- edge: edge,
238
- closed: true,
239
- building: false
240
- }));
241
- });
242
- it('sets building to false', function () {
243
- var mark = {
244
- type: 'exponential',
245
- root: {
246
- x: 0,
247
- y: 1
248
- },
249
- building: true
250
- };
251
- var point = {
252
- x: 5,
253
- y: 10
254
- };
255
- _utils.equalPoints.mockReturnValue(false);
256
- _utils.sameAxes.mockReturnValue(false);
257
- var result = exponentialTool.addPoint(point, mark);
258
- expect(result.building).toBe(false);
259
- });
260
- it('sets closed to true', function () {
261
- var mark = {
262
- type: 'exponential',
263
- root: {
264
- x: 0,
265
- y: 1
266
- },
267
- closed: false
268
- };
269
- var point = {
270
- x: 5,
271
- y: 10
272
- };
273
- _utils.equalPoints.mockReturnValue(false);
274
- _utils.sameAxes.mockReturnValue(false);
275
- var result = exponentialTool.addPoint(point, mark);
276
- expect(result.closed).toBe(true);
277
- });
278
- it('preserves root when adding edge', function () {
279
- var root = {
280
- x: 1,
281
- y: 2
282
- };
283
- var mark = {
284
- type: 'exponential',
285
- root: root,
286
- building: true
287
- };
288
- var edge = {
289
- x: 5,
290
- y: 8
291
- };
292
- _utils.equalPoints.mockReturnValue(false);
293
- _utils.sameAxes.mockReturnValue(false);
294
- var result = exponentialTool.addPoint(edge, mark);
295
- expect(result.root).toEqual(root);
296
- expect(result.edge).toEqual(edge);
297
- });
298
- it('preserves mark properties', function () {
299
- var mark = {
300
- type: 'exponential',
301
- root: {
302
- x: 0,
303
- y: 1
304
- },
305
- label: 'Exp 1',
306
- correctness: {
307
- value: 'correct'
308
- }
309
- };
310
- var point = {
311
- x: 5,
312
- y: 10
313
- };
314
- _utils.equalPoints.mockReturnValue(false);
315
- _utils.sameAxes.mockReturnValue(false);
316
- var result = exponentialTool.addPoint(point, mark);
317
- expect(result.label).toBe('Exp 1');
318
- expect(result.correctness).toEqual({
319
- value: 'correct'
320
- });
321
- });
322
- });
323
- describe('same point handling', function () {
324
- it('returns same mark when clicking equal point', function () {
325
- var point = {
326
- x: 5,
327
- y: 10
328
- };
329
- var mark = {
330
- type: 'exponential',
331
- root: point,
332
- building: true
333
- };
334
- _utils.equalPoints.mockReturnValue(true);
335
- _utils.sameAxes.mockReturnValue(false);
336
- var result = exponentialTool.addPoint(point, mark);
337
- expect(result).toBe(mark);
338
- });
339
- it('returns same mark when clicking point on same axis', function () {
340
- var mark = {
341
- type: 'exponential',
342
- root: {
343
- x: 5,
344
- y: 10
345
- },
346
- building: true
347
- };
348
- var point = {
349
- x: 8,
350
- y: 10
351
- }; // same y
352
- _utils.equalPoints.mockReturnValue(false);
353
- _utils.sameAxes.mockReturnValue(true);
354
- var result = exponentialTool.addPoint(point, mark);
355
- expect(result).toBe(mark);
356
- });
357
- it('calls equalPoints with correct arguments', function () {
358
- var point = {
359
- x: 5,
360
- y: 10
361
- };
362
- var mark = {
363
- type: 'exponential',
364
- root: {
365
- x: 5,
366
- y: 10
367
- },
368
- building: true
369
- };
370
- _utils.equalPoints.mockReturnValue(true);
371
- exponentialTool.addPoint(point, mark);
372
- expect(_utils.equalPoints).toHaveBeenCalledWith(mark.root, point);
373
- });
374
- it('calls sameAxes with correct arguments', function () {
375
- var point = {
376
- x: 8,
377
- y: 10
378
- };
379
- var mark = {
380
- type: 'exponential',
381
- root: {
382
- x: 5,
383
- y: 10
384
- },
385
- building: true
386
- };
387
- _utils.equalPoints.mockReturnValue(false);
388
- _utils.sameAxes.mockReturnValue(true);
389
- exponentialTool.addPoint(point, mark);
390
- expect(_utils.sameAxes).toHaveBeenCalledWith(mark.root, point);
391
- });
392
- });
393
- describe('opposite sign y-coordinates', function () {
394
- it('returns same mark when root and point have opposite sign y', function () {
395
- var mark = {
396
- type: 'exponential',
397
- root: {
398
- x: 0,
399
- y: 5
400
- },
401
- // positive y
402
- building: true
403
- };
404
- var point = {
405
- x: 5,
406
- y: -10
407
- }; // negative y
408
- _utils.equalPoints.mockReturnValue(false);
409
- _utils.sameAxes.mockReturnValue(false);
410
- var result = exponentialTool.addPoint(point, mark);
411
- expect(result).toBe(mark);
412
- });
413
- it('returns same mark when root is negative and point is positive', function () {
414
- var mark = {
415
- type: 'exponential',
416
- root: {
417
- x: 0,
418
- y: -5
419
- },
420
- // negative y
421
- building: true
422
- };
423
- var point = {
424
- x: 5,
425
- y: 10
426
- }; // positive y
427
- _utils.equalPoints.mockReturnValue(false);
428
- _utils.sameAxes.mockReturnValue(false);
429
- var result = exponentialTool.addPoint(point, mark);
430
- expect(result).toBe(mark);
431
- });
432
- it('allows points with same sign y (both positive)', function () {
433
- var mark = {
434
- type: 'exponential',
435
- root: {
436
- x: 0,
437
- y: 5
438
- },
439
- building: true
440
- };
441
- var point = {
442
- x: 5,
443
- y: 10
444
- };
445
- _utils.equalPoints.mockReturnValue(false);
446
- _utils.sameAxes.mockReturnValue(false);
447
- var result = exponentialTool.addPoint(point, mark);
448
- expect(result.edge).toEqual(point);
449
- expect(result.building).toBe(false);
450
- });
451
- it('allows points with same sign y (both negative)', function () {
452
- var mark = {
453
- type: 'exponential',
454
- root: {
455
- x: 0,
456
- y: -5
457
- },
458
- building: true
459
- };
460
- var point = {
461
- x: 5,
462
- y: -10
463
- };
464
- _utils.equalPoints.mockReturnValue(false);
465
- _utils.sameAxes.mockReturnValue(false);
466
- var result = exponentialTool.addPoint(point, mark);
467
- expect(result.edge).toEqual(point);
468
- expect(result.building).toBe(false);
469
- });
470
- });
471
- describe('zero y-coordinate handling', function () {
472
- it('returns same mark when point has y = 0', function () {
473
- var mark = {
474
- type: 'exponential',
475
- root: {
476
- x: 0,
477
- y: 5
478
- },
479
- building: true
480
- };
481
- var point = {
482
- x: 5,
483
- y: 0
484
- };
485
- _utils.equalPoints.mockReturnValue(false);
486
- _utils.sameAxes.mockReturnValue(false);
487
- var result = exponentialTool.addPoint(point, mark);
488
- expect(result).toBe(mark);
489
- });
490
- it('prevents adding point with zero y', function () {
491
- var point = {
492
- x: 5,
493
- y: 0
494
- };
495
- var mark = {
496
- type: 'exponential',
497
- root: {
498
- x: 1,
499
- y: 2
500
- },
501
- building: true
502
- };
503
- _utils.equalPoints.mockReturnValue(false);
504
- _utils.sameAxes.mockReturnValue(false);
505
- var result = exponentialTool.addPoint(point, mark);
506
- expect(result).toBe(mark);
507
- expect(result.edge).toBeUndefined();
508
- });
509
- it('prevents creating root with zero y', function () {
510
- var point = {
511
- x: 5,
512
- y: 0
513
- };
514
- _utils.equalPoints.mockReturnValue(false);
515
- _utils.sameAxes.mockReturnValue(false);
516
- var result = exponentialTool.addPoint(point, null);
517
- expect(result).toBeNull();
518
- });
519
- it('allows positive y values close to zero', function () {
520
- var point = {
521
- x: 5,
522
- y: 0.001
523
- };
524
- _utils.equalPoints.mockReturnValue(false);
525
- _utils.sameAxes.mockReturnValue(false);
526
- var result = exponentialTool.addPoint(point, null);
527
- expect(result.root).toEqual(point);
528
- });
529
- it('allows negative y values close to zero', function () {
530
- var point = {
531
- x: 5,
532
- y: -0.001
533
- };
534
- _utils.equalPoints.mockReturnValue(false);
535
- _utils.sameAxes.mockReturnValue(false);
536
- var result = exponentialTool.addPoint(point, null);
537
- expect(result.root).toEqual(point);
538
- });
539
- });
540
- describe('error handling', function () {
541
- it('throws error when mark has no root', function () {
542
- var mark = {
543
- type: 'exponential',
544
- building: true
545
- // root is missing
546
- };
547
- var point = {
548
- x: 5,
549
- y: 10
550
- };
551
- _utils.equalPoints.mockReturnValue(false);
552
- _utils.sameAxes.mockReturnValue(false);
553
- expect(function () {
554
- exponentialTool.addPoint(point, mark);
555
- }).toThrow(); // Will throw TypeError when accessing undefined.y
556
- });
557
- it('throws error when mark root is null', function () {
558
- var mark = {
559
- type: 'exponential',
560
- root: null,
561
- building: true
562
- };
563
- var point = {
564
- x: 5,
565
- y: 10
566
- };
567
- _utils.equalPoints.mockReturnValue(false);
568
- _utils.sameAxes.mockReturnValue(false);
569
- expect(function () {
570
- exponentialTool.addPoint(point, mark);
571
- }).toThrow(); // Will throw TypeError when accessing null.y
572
- });
573
- it('throws error when mark root is undefined', function () {
574
- var mark = {
575
- type: 'exponential',
576
- root: undefined,
577
- building: true
578
- };
579
- var point = {
580
- x: 5,
581
- y: 10
582
- };
583
- _utils.equalPoints.mockReturnValue(false);
584
- _utils.sameAxes.mockReturnValue(false);
585
- expect(function () {
586
- exponentialTool.addPoint(point, mark);
587
- }).toThrow(); // Will throw TypeError when accessing undefined.y
588
- });
589
- });
590
- describe('edge cases', function () {
591
- it('handles undefined mark on first click', function () {
592
- var point = {
593
- x: 5,
594
- y: 10
595
- };
596
- _utils.equalPoints.mockReturnValue(false);
597
- _utils.sameAxes.mockReturnValue(false);
598
- var result = exponentialTool.addPoint(point, undefined);
599
- expect(result.type).toBe('exponential');
600
- expect(result.root).toEqual(point);
601
- expect(result.building).toBe(true);
602
- });
603
- it('handles very large positive y', function () {
604
- var point = {
605
- x: 5,
606
- y: 10000
607
- };
608
- _utils.equalPoints.mockReturnValue(false);
609
- _utils.sameAxes.mockReturnValue(false);
610
- var result = exponentialTool.addPoint(point, null);
611
- expect(result.root).toEqual(point);
612
- });
613
- it('handles very large negative y', function () {
614
- var point = {
615
- x: 5,
616
- y: -10000
617
- };
618
- _utils.equalPoints.mockReturnValue(false);
619
- _utils.sameAxes.mockReturnValue(false);
620
- var result = exponentialTool.addPoint(point, null);
621
- expect(result.root).toEqual(point);
622
- });
623
- it('handles negative x coordinates', function () {
624
- var point = {
625
- x: -5,
626
- y: 10
627
- };
628
- _utils.equalPoints.mockReturnValue(false);
629
- _utils.sameAxes.mockReturnValue(false);
630
- var result = exponentialTool.addPoint(point, null);
631
- expect(result.root).toEqual(point);
632
- });
633
- it('handles mark with existing edge', function () {
634
- var mark = {
635
- type: 'exponential',
636
- root: {
637
- x: 0,
638
- y: 1
639
- },
640
- edge: {
641
- x: 3,
642
- y: 3
643
- },
644
- building: false,
645
- closed: true
646
- };
647
- var newEdge = {
648
- x: 5,
649
- y: 5
650
- };
651
- _utils.equalPoints.mockReturnValue(false);
652
- _utils.sameAxes.mockReturnValue(false);
653
- var result = exponentialTool.addPoint(newEdge, mark);
654
- expect(result.edge).toEqual(newEdge);
655
- expect(result.closed).toBe(true);
656
- expect(result.building).toBe(false);
657
- });
658
- });
659
- describe('immutability', function () {
660
- it('does not mutate original mark when adding edge', function () {
661
- var mark = {
662
- type: 'exponential',
663
- root: {
664
- x: 0,
665
- y: 1
666
- },
667
- building: true
668
- };
669
- var originalMark = _objectSpread({}, mark);
670
- var point = {
671
- x: 5,
672
- y: 10
673
- };
674
- _utils.equalPoints.mockReturnValue(false);
675
- _utils.sameAxes.mockReturnValue(false);
676
- var result = exponentialTool.addPoint(point, mark);
677
- expect(mark).toEqual(originalMark);
678
- expect(result).not.toBe(mark);
679
- });
680
- it('does not mutate original mark when returning same', function () {
681
- var mark = {
682
- type: 'exponential',
683
- root: {
684
- x: 5,
685
- y: 10
686
- },
687
- building: true
688
- };
689
- var point = {
690
- x: 5,
691
- y: 10
692
- };
693
- _utils.equalPoints.mockReturnValue(true);
694
- var result = exponentialTool.addPoint(point, mark);
695
- expect(result).toBe(mark);
696
- });
697
- });
698
- });
699
- describe('integration scenarios', function () {
700
- it('handles full exponential creation flow', function () {
701
- _utils.equalPoints.mockReturnValue(false);
702
- _utils.sameAxes.mockReturnValue(false);
703
-
704
- // First click - create root
705
- var firstPoint = {
706
- x: 0,
707
- y: 1
708
- };
709
- var mark1 = exponentialTool.addPoint(firstPoint, null);
710
- expect(mark1.root).toEqual(firstPoint);
711
- expect(mark1.building).toBe(true);
712
- expect(mark1.closed).toBe(false);
713
-
714
- // Second click - complete exponential
715
- var secondPoint = {
716
- x: 5,
717
- y: 10
718
- };
719
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
720
- expect(mark2.root).toEqual(firstPoint);
721
- expect(mark2.edge).toEqual(secondPoint);
722
- expect(mark2.building).toBe(false);
723
- expect(mark2.closed).toBe(true);
724
-
725
- // Complete
726
- var mark3 = exponentialTool.complete({}, mark2);
727
- expect(mark3.building).toBe(false);
728
- expect(mark3.closed).toBe(true);
729
- });
730
- it('handles rejected second point (zero y)', function () {
731
- _utils.equalPoints.mockReturnValue(false);
732
- _utils.sameAxes.mockReturnValue(false);
733
- var firstPoint = {
734
- x: 0,
735
- y: 1
736
- };
737
- var mark1 = exponentialTool.addPoint(firstPoint, null);
738
- var secondPoint = {
739
- x: 5,
740
- y: 0
741
- };
742
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
743
-
744
- // Should return unchanged mark
745
- expect(mark2).toBe(mark1);
746
- expect(mark2.edge).toBeUndefined();
747
- });
748
- it('handles rejected second point (opposite sign)', function () {
749
- _utils.equalPoints.mockReturnValue(false);
750
- _utils.sameAxes.mockReturnValue(false);
751
- var firstPoint = {
752
- x: 0,
753
- y: 5
754
- };
755
- var mark1 = exponentialTool.addPoint(firstPoint, null);
756
- var secondPoint = {
757
- x: 5,
758
- y: -10
759
- };
760
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
761
-
762
- // Should return unchanged mark
763
- expect(mark2).toBe(mark1);
764
- expect(mark2.edge).toBeUndefined();
765
- });
766
- it('handles rejected second point (same axes)', function () {
767
- _utils.equalPoints.mockReturnValue(false);
768
- _utils.sameAxes.mockReturnValue(true);
769
- var firstPoint = {
770
- x: 0,
771
- y: 5
772
- };
773
- var mark1 = exponentialTool.addPoint(firstPoint, null);
774
- var secondPoint = {
775
- x: 10,
776
- y: 5
777
- }; // same y
778
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
779
-
780
- // Should return unchanged mark
781
- expect(mark2).toBe(mark1);
782
- });
783
- it('handles exponential with negative y values', function () {
784
- _utils.equalPoints.mockReturnValue(false);
785
- _utils.sameAxes.mockReturnValue(false);
786
- var firstPoint = {
787
- x: 0,
788
- y: -1
789
- };
790
- var mark1 = exponentialTool.addPoint(firstPoint, null);
791
- var secondPoint = {
792
- x: 5,
793
- y: -10
794
- };
795
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
796
- expect(mark2.root).toEqual(firstPoint);
797
- expect(mark2.edge).toEqual(secondPoint);
798
- expect(mark2.building).toBe(false);
799
- expect(mark2.closed).toBe(true);
800
- });
801
- it('handles exponential with properties', function () {
802
- _utils.equalPoints.mockReturnValue(false);
803
- _utils.sameAxes.mockReturnValue(false);
804
- var firstPoint = {
805
- x: 0,
806
- y: 1,
807
- label: 'Start'
808
- };
809
- var mark1 = exponentialTool.addPoint(firstPoint, null);
810
-
811
- // Add properties
812
- mark1.label = 'Exp A';
813
- mark1.correctness = {
814
- value: 'correct'
815
- };
816
- var secondPoint = {
817
- x: 5,
818
- y: 10
819
- };
820
- var mark2 = exponentialTool.addPoint(secondPoint, mark1);
821
- expect(mark2.label).toBe('Exp A');
822
- expect(mark2.correctness).toEqual({
823
- value: 'correct'
824
- });
825
- });
826
- });
827
- });
828
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsImVxdWFsUG9pbnRzIiwiZm4iLCJzYW1lQXhlcyIsImRlc2NyaWJlIiwiZXhwb25lbnRpYWxUb29sIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJ0b29sIiwiaXQiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsIl90eXBlb2YyIiwidG9CZSIsInR5cGUiLCJDb21wb25lbnQiLCJjb21wbGV0ZSIsImFkZFBvaW50IiwiaG92ZXIiLCJ0b0JlVW5kZWZpbmVkIiwiZGF0YSIsIngiLCJ5IiwibWFyayIsInJvb3QiLCJlZGdlIiwiYnVpbGRpbmciLCJjbG9zZWQiLCJyZXN1bHQiLCJ0b0VxdWFsIiwibGFiZWwiLCJjb3JyZWN0bmVzcyIsInZhbHVlIiwib3JpZ2luYWxNYXJrIiwicG9pbnQiLCJtb2NrUmV0dXJuVmFsdWUiLCJ1bmRlZmluZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvQmVOdWxsIiwidG9UaHJvdyIsIm5ld0VkZ2UiLCJub3QiLCJmaXJzdFBvaW50IiwibWFyazEiLCJzZWNvbmRQb2ludCIsIm1hcmsyIiwibWFyazMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvZXhwb25lbnRpYWwvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9vbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IGVxdWFsUG9pbnRzLCBzYW1lQXhlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuamVzdC5tb2NrKCcuLi8uLi8uLi91dGlscycsICgpID0+ICh7XG4gIGVxdWFsUG9pbnRzOiBqZXN0LmZuKCksXG4gIHNhbWVBeGVzOiBqZXN0LmZuKCksXG59KSk7XG5cbmplc3QubW9jaygnZGVidWcnLCAoKSA9PiB7XG4gIHJldHVybiBqZXN0LmZuKCgpID0+IGplc3QuZm4oKSk7XG59KTtcblxuZGVzY3JpYmUoJ2V4cG9uZW50aWFsIHRvb2wnLCAoKSA9PiB7XG4gIGxldCBleHBvbmVudGlhbFRvb2w7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgZXhwb25lbnRpYWxUb29sID0gdG9vbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbCBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjcmVhdGVzIGEgdG9vbCBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXhwb25lbnRpYWxUb29sKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBleHBvbmVudGlhbFRvb2wpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyB0eXBlIGV4cG9uZW50aWFsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGV4cG9uZW50aWFsVG9vbC50eXBlKS50b0JlKCdleHBvbmVudGlhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBhIENvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHBvbmVudGlhbFRvb2wuQ29tcG9uZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb21wbGV0ZSBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZXhwb25lbnRpYWxUb29sLmNvbXBsZXRlKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBhZGRQb2ludCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGhhdmUgaG92ZXIgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXhwb25lbnRpYWxUb29sLmhvdmVyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wbGV0ZScsICgpID0+IHtcbiAgICBpdCgnbWFya3MgZXhwb25lbnRpYWwgYXMgY29tcGxldGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGVkZ2U6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoZGF0YSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAuLi5tYXJrLFxuICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgYnVpbGRpbmcgdG8gZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoe30sIG1hcmspO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXRzIGNsb3NlZCB0byB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoe30sIG1hcmspO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmNsb3NlZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgbWFyayBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGVkZ2U6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgbGFiZWw6ICdFeHAgQScsXG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQubGFiZWwpLnRvQmUoJ0V4cCBBJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvcnJlY3RuZXNzKS50b0VxdWFsKHsgdmFsdWU6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChtYXJrLnJvb3QpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5lZGdlKS50b0VxdWFsKG1hcmsuZWRnZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgbXV0YXRlIG9yaWdpbmFsIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3JpZ2luYWxNYXJrID0geyAuLi5tYXJrIH07XG5cbiAgICAgIGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChtYXJrKS50b0VxdWFsKG9yaWdpbmFsTWFyayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRQb2ludCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnZmlyc3QgcG9pbnQgKGNyZWF0aW5nIHJvb3QpJywgKCkgPT4ge1xuICAgICAgaXQoJ2NyZWF0ZXMgbmV3IGV4cG9uZW50aWFsIG1hcmsgd2hlbiBubyBtYXJrIGV4aXN0cycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDUgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IG51bGw7XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHBvaW50LFxuICAgICAgICAgIGVkZ2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyBtYXJrIHdpdGggYnVpbGRpbmcgdHJ1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDIsIHk6IDMgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NyZWF0ZXMgbWFyayB3aXRoIGNsb3NlZCBmYWxzZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDIsIHk6IDMgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2xvc2VkKS50b0JlKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyBtYXJrIHdpdGggdW5kZWZpbmVkIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAyLCB5OiAzIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LmVkZ2UpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnd29ya3Mgd2l0aCBwb3NpdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IDEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd3b3JrcyB3aXRoIG5lZ2F0aXZlIHkgY29vcmRpbmF0ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IC0xMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yb290KS50b0VxdWFsKHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnd29ya3Mgd2l0aCBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogMy41LCB5OiA3LjI1IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2Vjb25kIHBvaW50IChjb21wbGV0aW5nIGV4cG9uZW50aWFsKScsICgpID0+IHtcbiAgICAgIGl0KCdjb21wbGV0ZXMgZXhwb25lbnRpYWwgd2hlbiBhZGRpbmcgZWRnZSBwb2ludCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBjb25zdCBlZGdlID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBlZGdlOiB1bmRlZmluZWQsXG4gICAgICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZWRnZSwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ubWFyayxcbiAgICAgICAgICBlZGdlLFxuICAgICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzZXRzIGJ1aWxkaW5nIHRvIGZhbHNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5idWlsZGluZykudG9CZShmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3NldHMgY2xvc2VkIHRvIHRydWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2xvc2VkKS50b0JlKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmVzZXJ2ZXMgcm9vdCB3aGVuIGFkZGluZyBlZGdlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCByb290ID0geyB4OiAxLCB5OiAyIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlZGdlID0geyB4OiA1LCB5OiA4IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KGVkZ2UsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChyb290KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5lZGdlKS50b0VxdWFsKGVkZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmVzZXJ2ZXMgbWFyayBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdFeHAgMScsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQubGFiZWwpLnRvQmUoJ0V4cCAxJyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuY29ycmVjdG5lc3MpLnRvRXF1YWwoeyB2YWx1ZTogJ2NvcnJlY3QnIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2FtZSBwb2ludCBoYW5kbGluZycsICgpID0+IHtcbiAgICAgIGl0KCdyZXR1cm5zIHNhbWUgbWFyayB3aGVuIGNsaWNraW5nIGVxdWFsIHBvaW50JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHBvaW50LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIHNhbWUgbWFyayB3aGVuIGNsaWNraW5nIHBvaW50IG9uIHNhbWUgYXhpcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDgsIHk6IDEwIH07IC8vIHNhbWUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjYWxscyBlcXVhbFBvaW50cyB3aXRoIGNvcnJlY3QgYXJndW1lbnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKHRydWUpO1xuXG4gICAgICAgIGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KGVxdWFsUG9pbnRzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtYXJrLnJvb3QsIHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgc2FtZUF4ZXMgd2l0aCBjb3JyZWN0IGFyZ3VtZW50cycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDgsIHk6IDEwIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDUsIHk6IDEwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcblxuICAgICAgICBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChzYW1lQXhlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgobWFyay5yb290LCBwb2ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvcHBvc2l0ZSBzaWduIHktY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBpdCgncmV0dXJucyBzYW1lIG1hcmsgd2hlbiByb290IGFuZCBwb2ludCBoYXZlIG9wcG9zaXRlIHNpZ24geScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogNSB9LCAvLyBwb3NpdGl2ZSB5XG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAtMTAgfTsgLy8gbmVnYXRpdmUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShtYXJrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBzYW1lIG1hcmsgd2hlbiByb290IGlzIG5lZ2F0aXZlIGFuZCBwb2ludCBpcyBwb3NpdGl2ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogLTUgfSwgLy8gbmVnYXRpdmUgeVxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTsgLy8gcG9zaXRpdmUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShtYXJrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIHBvaW50cyB3aXRoIHNhbWUgc2lnbiB5IChib3RoIHBvc2l0aXZlKScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogNSB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9FcXVhbChwb2ludCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbGxvd3MgcG9pbnRzIHdpdGggc2FtZSBzaWduIHkgKGJvdGggbmVnYXRpdmUpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAtNSB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogLTEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LmVkZ2UpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3plcm8geS1jb29yZGluYXRlIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3JldHVybnMgc2FtZSBtYXJrIHdoZW4gcG9pbnQgaGFzIHkgPSAwJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiA1IH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmV2ZW50cyBhZGRpbmcgcG9pbnQgd2l0aCB6ZXJvIHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDEsIHk6IDIgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUobWFyayk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmV2ZW50cyBjcmVhdGluZyByb290IHdpdGggemVybyB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIHBvc2l0aXZlIHkgdmFsdWVzIGNsb3NlIHRvIHplcm8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwLjAwMSB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yb290KS50b0VxdWFsKHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIG5lZ2F0aXZlIHkgdmFsdWVzIGNsb3NlIHRvIHplcm8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAtMC4wMDEgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlcnJvciBoYW5kbGluZycsICgpID0+IHtcbiAgICAgIGl0KCd0aHJvd3MgZXJyb3Igd2hlbiBtYXJrIGhhcyBubyByb290JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgICAgLy8gcm9vdCBpcyBtaXNzaW5nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcbiAgICAgICAgfSkudG9UaHJvdygpOyAvLyBXaWxsIHRocm93IFR5cGVFcnJvciB3aGVuIGFjY2Vzc2luZyB1bmRlZmluZWQueVxuICAgICAgfSk7XG5cbiAgICAgIGl0KCd0aHJvd3MgZXJyb3Igd2hlbiBtYXJrIHJvb3QgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IG51bGwsXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcbiAgICAgICAgfSkudG9UaHJvdygpOyAvLyBXaWxsIHRocm93IFR5cGVFcnJvciB3aGVuIGFjY2Vzc2luZyBudWxsLnlcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndGhyb3dzIGVycm9yIHdoZW4gbWFyayByb290IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IDEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuICAgICAgICB9KS50b1Rocm93KCk7IC8vIFdpbGwgdGhyb3cgVHlwZUVycm9yIHdoZW4gYWNjZXNzaW5nIHVuZGVmaW5lZC55XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ2hhbmRsZXMgdW5kZWZpbmVkIG1hcmsgb24gZmlyc3QgY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgdW5kZWZpbmVkKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ2V4cG9uZW50aWFsJyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBwb3NpdGl2ZSB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAwMDAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBuZWdhdGl2ZSB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogLTEwMDAwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYW5kbGVzIG5lZ2F0aXZlIHggY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAtNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgbWFyayB3aXRoIGV4aXN0aW5nIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBlZGdlOiB7IHg6IDMsIHk6IDMgfSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgICAgY2xvc2VkOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdFZGdlID0geyB4OiA1LCB5OiA1IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KG5ld0VkZ2UsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9FcXVhbChuZXdFZGdlKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jbG9zZWQpLnRvQmUodHJ1ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW1tdXRhYmlsaXR5JywgKCkgPT4ge1xuICAgICAgaXQoJ2RvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBtYXJrIHdoZW4gYWRkaW5nIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNYXJrID0geyAuLi5tYXJrIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KG1hcmspLnRvRXF1YWwob3JpZ2luYWxNYXJrKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUobWFyayk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBtYXJrIHdoZW4gcmV0dXJuaW5nIHNhbWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDUsIHk6IDEwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbiBzY2VuYXJpb3MnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgZnVsbCBleHBvbmVudGlhbCBjcmVhdGlvbiBmbG93JywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgIC8vIEZpcnN0IGNsaWNrIC0gY3JlYXRlIHJvb3RcbiAgICAgIGNvbnN0IGZpcnN0UG9pbnQgPSB7IHg6IDAsIHk6IDEgfTtcbiAgICAgIGNvbnN0IG1hcmsxID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KGZpcnN0UG9pbnQsIG51bGwpO1xuICAgICAgZXhwZWN0KG1hcmsxLnJvb3QpLnRvRXF1YWwoZmlyc3RQb2ludCk7XG4gICAgICBleHBlY3QobWFyazEuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobWFyazEuY2xvc2VkKS50b0JlKGZhbHNlKTtcblxuICAgICAgLy8gU2Vjb25kIGNsaWNrIC0gY29tcGxldGUgZXhwb25lbnRpYWxcbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgbWFyazIgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoc2Vjb25kUG9pbnQsIG1hcmsxKTtcbiAgICAgIGV4cGVjdChtYXJrMi5yb290KS50b0VxdWFsKGZpcnN0UG9pbnQpO1xuICAgICAgZXhwZWN0KG1hcmsyLmVkZ2UpLnRvRXF1YWwoc2Vjb25kUG9pbnQpO1xuICAgICAgZXhwZWN0KG1hcmsyLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChtYXJrMi5jbG9zZWQpLnRvQmUodHJ1ZSk7XG5cbiAgICAgIC8vIENvbXBsZXRlXG4gICAgICBjb25zdCBtYXJrMyA9IGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyazIpO1xuICAgICAgZXhwZWN0KG1hcmszLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChtYXJrMy5jbG9zZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyByZWplY3RlZCBzZWNvbmQgcG9pbnQgKHplcm8geSknLCAoKSA9PiB7XG4gICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogMSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICBjb25zdCBtYXJrMiA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChzZWNvbmRQb2ludCwgbWFyazEpO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIHVuY2hhbmdlZCBtYXJrXG4gICAgICBleHBlY3QobWFyazIpLnRvQmUobWFyazEpO1xuICAgICAgZXhwZWN0KG1hcmsyLmVkZ2UpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHJlamVjdGVkIHNlY29uZCBwb2ludCAob3Bwb3NpdGUgc2lnbiknLCAoKSA9PiB7XG4gICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogNSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAtMTAgfTtcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdW5jaGFuZ2VkIG1hcmtcbiAgICAgIGV4cGVjdChtYXJrMikudG9CZShtYXJrMSk7XG4gICAgICBleHBlY3QobWFyazIuZWRnZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmVqZWN0ZWQgc2Vjb25kIHBvaW50IChzYW1lIGF4ZXMpJywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogNSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiAxMCwgeTogNSB9OyAvLyBzYW1lIHlcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdW5jaGFuZ2VkIG1hcmtcbiAgICAgIGV4cGVjdChtYXJrMikudG9CZShtYXJrMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBleHBvbmVudGlhbCB3aXRoIG5lZ2F0aXZlIHkgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGZpcnN0UG9pbnQgPSB7IHg6IDAsIHk6IC0xIH07XG4gICAgICBjb25zdCBtYXJrMSA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChmaXJzdFBvaW50LCBudWxsKTtcblxuICAgICAgY29uc3Qgc2Vjb25kUG9pbnQgPSB7IHg6IDUsIHk6IC0xMCB9O1xuICAgICAgY29uc3QgbWFyazIgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoc2Vjb25kUG9pbnQsIG1hcmsxKTtcblxuICAgICAgZXhwZWN0KG1hcmsyLnJvb3QpLnRvRXF1YWwoZmlyc3RQb2ludCk7XG4gICAgICBleHBlY3QobWFyazIuZWRnZSkudG9FcXVhbChzZWNvbmRQb2ludCk7XG4gICAgICBleHBlY3QobWFyazIuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KG1hcmsyLmNsb3NlZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGV4cG9uZW50aWFsIHdpdGggcHJvcGVydGllcycsICgpID0+IHtcbiAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICBjb25zdCBmaXJzdFBvaW50ID0geyB4OiAwLCB5OiAxLCBsYWJlbDogJ1N0YXJ0JyB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzXG4gICAgICBtYXJrMS5sYWJlbCA9ICdFeHAgQSc7XG4gICAgICBtYXJrMS5jb3JyZWN0bmVzcyA9IHsgdmFsdWU6ICdjb3JyZWN0JyB9O1xuXG4gICAgICBjb25zdCBzZWNvbmRQb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIGV4cGVjdChtYXJrMi5sYWJlbCkudG9CZSgnRXhwIEEnKTtcbiAgICAgIGV4cGVjdChtYXJrMi5jb3JyZWN0bmVzcykudG9FcXVhbCh7IHZhbHVlOiAnY29ycmVjdCcgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQXVELFNBQUFFLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FBQWMseUJBQUEsQ0FBQWYsQ0FBQSxLQUFBSCxPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxHQUFBYSxPQUFBLFdBQUFkLENB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