@pie-lib/charting 6.2.0-next.2 → 6.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 (60) hide show
  1. package/CHANGELOG.md +23 -37
  2. package/LICENSE.md +5 -0
  3. package/lib/actions-button.js +1 -1
  4. package/lib/axes.js +1 -1
  5. package/lib/bars/bar.js +1 -1
  6. package/lib/bars/common/bars.js +1 -1
  7. package/lib/bars/common/correct-check-icon.js +1 -1
  8. package/lib/bars/histogram.js +1 -1
  9. package/lib/chart-setup.js +1 -1
  10. package/lib/chart-type.js +1 -1
  11. package/lib/chart-types.js +1 -1
  12. package/lib/chart.js +1 -1
  13. package/lib/common/correctness-indicators.js +1 -1
  14. package/lib/common/drag-handle.js +1 -1
  15. package/lib/common/drag-icon.js +1 -1
  16. package/lib/common/styles.js +1 -1
  17. package/lib/grid.js +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/key-legend.js +1 -1
  20. package/lib/line/common/drag-handle.js +1 -1
  21. package/lib/line/common/line.js +1 -1
  22. package/lib/line/line-cross.js +1 -1
  23. package/lib/line/line-dot.js +1 -1
  24. package/lib/mark-label.js +1 -1
  25. package/lib/plot/common/plot.js +1 -1
  26. package/lib/plot/dot.js +1 -1
  27. package/lib/plot/line.js +1 -1
  28. package/lib/tool-menu.js +1 -1
  29. package/lib/utils.js +1 -1
  30. package/package.json +3 -3
  31. package/lib/__tests__/actions-button.test.js +0 -332
  32. package/lib/__tests__/axes.test.js +0 -746
  33. package/lib/__tests__/chart-setup.test.js +0 -796
  34. package/lib/__tests__/chart-type.test.js +0 -25
  35. package/lib/__tests__/chart.test.js +0 -103
  36. package/lib/__tests__/grid.test.js +0 -39
  37. package/lib/__tests__/key-legend.test.js +0 -235
  38. package/lib/__tests__/mark-label.test.js +0 -46
  39. package/lib/__tests__/tool-menu.test.js +0 -627
  40. package/lib/__tests__/utils.js +0 -56
  41. package/lib/__tests__/utils.test.js +0 -186
  42. package/lib/bars/__tests__/bar.test.js +0 -53
  43. package/lib/bars/__tests__/histogram.test.js +0 -53
  44. package/lib/bars/__tests__/utils.js +0 -50
  45. package/lib/bars/common/__tests__/bars.test.js +0 -76
  46. package/lib/bars/common/__tests__/utils.js +0 -50
  47. package/lib/common/__tests__/correctness-indicators.test.js +0 -887
  48. package/lib/common/__tests__/drag-handle.test.js +0 -73
  49. package/lib/common/__tests__/utils.js +0 -50
  50. package/lib/line/__tests__/line-cross.test.js +0 -617
  51. package/lib/line/__tests__/line-dot.test.js +0 -47
  52. package/lib/line/__tests__/utils.js +0 -56
  53. package/lib/line/common/__tests__/drag-handle.test.js +0 -73
  54. package/lib/line/common/__tests__/line.test.js +0 -92
  55. package/lib/line/common/__tests__/utils.js +0 -50
  56. package/lib/plot/__tests__/dot.test.js +0 -513
  57. package/lib/plot/__tests__/line.test.js +0 -566
  58. package/lib/plot/__tests__/utils.js +0 -50
  59. package/lib/plot/common/__tests__/plot.test.js +0 -79
  60. package/lib/plot/common/__tests__/utils.js +0 -50
@@ -1,887 +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 _react = _interopRequireDefault(require("react"));
6
- var _react2 = require("@testing-library/react");
7
- var _styles = require("@mui/material/styles");
8
- var _correctnessIndicators = require("../correctness-indicators");
9
- 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; }
10
- 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; }
11
- jest.mock('@pie-lib/render-ui', function () {
12
- return {
13
- color: {
14
- correct: function correct() {
15
- return '#00ff00';
16
- },
17
- incorrectWithIcon: function incorrectWithIcon() {
18
- return '#ff0000';
19
- },
20
- defaults: {
21
- WHITE: '#ffffff'
22
- }
23
- }
24
- };
25
- });
26
- jest.mock('@mui/icons-material/Check', function () {
27
- return function Check(props) {
28
- return /*#__PURE__*/_react["default"].createElement("svg", {
29
- "data-testid": "check-icon",
30
- title: props.title,
31
- className: props.className
32
- });
33
- };
34
- });
35
- jest.mock('@mui/icons-material/Close', function () {
36
- return function Close(props) {
37
- return /*#__PURE__*/_react["default"].createElement("svg", {
38
- "data-testid": "close-icon",
39
- title: props.title,
40
- className: props.className
41
- });
42
- };
43
- });
44
- var theme;
45
- beforeAll(function () {
46
- theme = (0, _styles.createTheme)();
47
- });
48
- describe('CorrectnessIndicator', function () {
49
- var mockScale = {
50
- x: jest.fn(function (val) {
51
- return val * 10;
52
- }),
53
- y: jest.fn(function (val) {
54
- return val * 10;
55
- })
56
- };
57
- beforeEach(function () {
58
- jest.clearAllMocks();
59
- });
60
- var renderComponent = function renderComponent() {
61
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
62
- var defaults = {
63
- scale: mockScale,
64
- x: 5,
65
- y: 10,
66
- correctness: {
67
- value: 'correct',
68
- label: 'Correct Answer'
69
- },
70
- interactive: true
71
- };
72
- var props = _objectSpread(_objectSpread({}, defaults), extras);
73
- return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
74
- theme: theme
75
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.CorrectnessIndicator, props))));
76
- };
77
- describe('rendering', function () {
78
- it('should render without crashing', function () {
79
- var _renderComponent = renderComponent(),
80
- container = _renderComponent.container;
81
- expect(container).toBeInTheDocument();
82
- });
83
- it('should render foreignObject element', function () {
84
- var _renderComponent2 = renderComponent(),
85
- container = _renderComponent2.container;
86
- var foreignObject = container.querySelector('foreignObject');
87
- expect(foreignObject).toBeInTheDocument();
88
- });
89
- it('should render check icon for correct answer', function () {
90
- var _renderComponent3 = renderComponent({
91
- correctness: {
92
- value: 'correct',
93
- label: 'Correct'
94
- }
95
- }),
96
- getByTestId = _renderComponent3.getByTestId;
97
- expect(getByTestId('check-icon')).toBeInTheDocument();
98
- });
99
- it('should render close icon for incorrect answer', function () {
100
- var _renderComponent4 = renderComponent({
101
- correctness: {
102
- value: 'incorrect',
103
- label: 'Incorrect'
104
- }
105
- }),
106
- getByTestId = _renderComponent4.getByTestId;
107
- expect(getByTestId('close-icon')).toBeInTheDocument();
108
- });
109
- it('should not render when correctness is null', function () {
110
- var _renderComponent5 = renderComponent({
111
- correctness: null
112
- }),
113
- container = _renderComponent5.container;
114
- var foreignObject = container.querySelector('foreignObject');
115
- expect(foreignObject).not.toBeInTheDocument();
116
- });
117
- it('should not render when correctness is undefined', function () {
118
- var _renderComponent6 = renderComponent({
119
- correctness: undefined
120
- }),
121
- container = _renderComponent6.container;
122
- var foreignObject = container.querySelector('foreignObject');
123
- expect(foreignObject).not.toBeInTheDocument();
124
- });
125
- it('should not render when interactive is false', function () {
126
- var _renderComponent7 = renderComponent({
127
- interactive: false
128
- }),
129
- container = _renderComponent7.container;
130
- var foreignObject = container.querySelector('foreignObject');
131
- expect(foreignObject).not.toBeInTheDocument();
132
- });
133
- it('should render with correct title for correct answer', function () {
134
- var _renderComponent8 = renderComponent({
135
- correctness: {
136
- value: 'correct',
137
- label: 'Well done!'
138
- }
139
- }),
140
- getByTestId = _renderComponent8.getByTestId;
141
- var icon = getByTestId('check-icon');
142
- expect(icon).toHaveAttribute('title', 'Well done!');
143
- });
144
- it('should render with correct title for incorrect answer', function () {
145
- var _renderComponent9 = renderComponent({
146
- correctness: {
147
- value: 'incorrect',
148
- label: 'Try again'
149
- }
150
- }),
151
- getByTestId = _renderComponent9.getByTestId;
152
- var icon = getByTestId('close-icon');
153
- expect(icon).toHaveAttribute('title', 'Try again');
154
- });
155
- });
156
- describe('positioning with scale', function () {
157
- it('should use scale to calculate position', function () {
158
- var _renderComponent0 = renderComponent({
159
- scale: mockScale,
160
- x: 5,
161
- y: 10
162
- }),
163
- container = _renderComponent0.container;
164
- var foreignObject = container.querySelector('foreignObject');
165
- expect(mockScale.x).toHaveBeenCalledWith(5);
166
- expect(mockScale.y).toHaveBeenCalledWith(10);
167
- // position is scaled value - 11 (half of 22px icon size)
168
- expect(foreignObject).toHaveAttribute('x', '39'); // 50 - 11
169
- expect(foreignObject).toHaveAttribute('y', '89'); // 100 - 11
170
- });
171
- it('should have correct size attributes', function () {
172
- var _renderComponent1 = renderComponent(),
173
- container = _renderComponent1.container;
174
- var foreignObject = container.querySelector('foreignObject');
175
- expect(foreignObject).toHaveAttribute('width', '22');
176
- expect(foreignObject).toHaveAttribute('height', '22');
177
- });
178
- it('should handle different x and y values', function () {
179
- var _renderComponent10 = renderComponent({
180
- x: 20,
181
- y: 30
182
- }),
183
- container = _renderComponent10.container;
184
- expect(mockScale.x).toHaveBeenCalledWith(20);
185
- expect(mockScale.y).toHaveBeenCalledWith(30);
186
- });
187
- it('should use raw values when scale is not provided', function () {
188
- var _renderComponent11 = renderComponent({
189
- scale: null,
190
- x: 50,
191
- y: 100
192
- }),
193
- container = _renderComponent11.container;
194
- var foreignObject = container.querySelector('foreignObject');
195
- expect(foreignObject).toHaveAttribute('x', '39'); // 50 - 11
196
- expect(foreignObject).toHaveAttribute('y', '89'); // 100 - 11
197
- });
198
- });
199
- describe('edge cases', function () {
200
- it('should handle zero coordinates', function () {
201
- var _renderComponent12 = renderComponent({
202
- x: 0,
203
- y: 0
204
- }),
205
- container = _renderComponent12.container;
206
- var foreignObject = container.querySelector('foreignObject');
207
- expect(foreignObject).toHaveAttribute('x', '-11');
208
- expect(foreignObject).toHaveAttribute('y', '-11');
209
- });
210
- it('should handle negative coordinates', function () {
211
- var _renderComponent13 = renderComponent({
212
- x: -5,
213
- y: -10
214
- }),
215
- container = _renderComponent13.container;
216
- expect(mockScale.x).toHaveBeenCalledWith(-5);
217
- expect(mockScale.y).toHaveBeenCalledWith(-10);
218
- });
219
- it('should handle large coordinates', function () {
220
- var _renderComponent14 = renderComponent({
221
- x: 1000,
222
- y: 2000
223
- }),
224
- container = _renderComponent14.container;
225
- expect(mockScale.x).toHaveBeenCalledWith(1000);
226
- expect(mockScale.y).toHaveBeenCalledWith(2000);
227
- });
228
- it('should handle correctness with empty label', function () {
229
- var _renderComponent15 = renderComponent({
230
- correctness: {
231
- value: 'correct',
232
- label: ''
233
- }
234
- }),
235
- getByTestId = _renderComponent15.getByTestId;
236
- var icon = getByTestId('check-icon');
237
- expect(icon).toHaveAttribute('title', '');
238
- });
239
- it('should handle correctness with undefined label', function () {
240
- var _renderComponent16 = renderComponent({
241
- correctness: {
242
- value: 'correct',
243
- label: undefined
244
- }
245
- }),
246
- getByTestId = _renderComponent16.getByTestId;
247
- expect(getByTestId('check-icon')).toBeInTheDocument();
248
- });
249
- it('should render when both correctness and interactive are true', function () {
250
- var _renderComponent17 = renderComponent({
251
- correctness: {
252
- value: 'correct',
253
- label: 'Test'
254
- },
255
- interactive: true
256
- }),
257
- container = _renderComponent17.container;
258
- expect(container.querySelector('foreignObject')).toBeInTheDocument();
259
- });
260
- it('should not render when interactive is false even with correctness', function () {
261
- var _renderComponent18 = renderComponent({
262
- correctness: {
263
- value: 'correct',
264
- label: 'Test'
265
- },
266
- interactive: false
267
- }),
268
- container = _renderComponent18.container;
269
- expect(container.querySelector('foreignObject')).not.toBeInTheDocument();
270
- });
271
- });
272
- });
273
- describe('SmallCorrectPointIndicator', function () {
274
- var mockScale = {
275
- x: jest.fn(function (val) {
276
- return val * 10;
277
- }),
278
- y: jest.fn(function (val) {
279
- return val * 10;
280
- })
281
- };
282
- var correctData = [{
283
- label: 'A',
284
- value: 10
285
- }, {
286
- label: 'B',
287
- value: 20
288
- }, {
289
- label: 'C',
290
- value: '30'
291
- }];
292
- beforeEach(function () {
293
- jest.clearAllMocks();
294
- });
295
- var renderComponent = function renderComponent() {
296
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
297
- var defaults = {
298
- scale: mockScale,
299
- x: 5,
300
- correctness: {
301
- value: 'incorrect',
302
- label: 'Incorrect'
303
- },
304
- correctData: correctData,
305
- label: 'A'
306
- };
307
- var props = _objectSpread(_objectSpread({}, defaults), extras);
308
- return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
309
- theme: theme
310
- }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.SmallCorrectPointIndicator, props))));
311
- };
312
- describe('rendering', function () {
313
- it('should render without crashing', function () {
314
- var _renderComponent19 = renderComponent(),
315
- container = _renderComponent19.container;
316
- expect(container).toBeInTheDocument();
317
- });
318
- it('should render foreignObject when incorrect', function () {
319
- var _renderComponent20 = renderComponent({
320
- correctness: {
321
- value: 'incorrect',
322
- label: 'Wrong'
323
- },
324
- label: 'A'
325
- }),
326
- container = _renderComponent20.container;
327
- var foreignObject = container.querySelector('foreignObject');
328
- expect(foreignObject).toBeInTheDocument();
329
- });
330
- it('should render small check icon when incorrect', function () {
331
- var _renderComponent21 = renderComponent({
332
- correctness: {
333
- value: 'incorrect',
334
- label: 'Wrong'
335
- },
336
- label: 'A'
337
- }),
338
- getByTestId = _renderComponent21.getByTestId;
339
- var icon = getByTestId('check-icon');
340
- expect(icon).toBeInTheDocument();
341
- expect(icon).toHaveClass('small');
342
- });
343
- it('should not render when correctness is correct', function () {
344
- var _renderComponent22 = renderComponent({
345
- correctness: {
346
- value: 'correct',
347
- label: 'Correct'
348
- }
349
- }),
350
- container = _renderComponent22.container;
351
- var foreignObject = container.querySelector('foreignObject');
352
- expect(foreignObject).not.toBeInTheDocument();
353
- });
354
- it('should not render when correctness is null', function () {
355
- var _renderComponent23 = renderComponent({
356
- correctness: null
357
- }),
358
- container = _renderComponent23.container;
359
- var foreignObject = container.querySelector('foreignObject');
360
- expect(foreignObject).not.toBeInTheDocument();
361
- });
362
- it('should not render when correctness is undefined', function () {
363
- var _renderComponent24 = renderComponent({
364
- correctness: undefined
365
- }),
366
- container = _renderComponent24.container;
367
- var foreignObject = container.querySelector('foreignObject');
368
- expect(foreignObject).not.toBeInTheDocument();
369
- });
370
- });
371
- describe('positioning', function () {
372
- it('should calculate correct position for label A', function () {
373
- var _renderComponent25 = renderComponent({
374
- x: 5,
375
- label: 'A'
376
- }),
377
- container = _renderComponent25.container;
378
- var foreignObject = container.querySelector('foreignObject');
379
- expect(mockScale.x).toHaveBeenCalledWith(5);
380
- expect(mockScale.y).toHaveBeenCalledWith(10); // value from correctData for label A
381
- // Position is scaled value - 7.5 (half of 15px small icon size)
382
- expect(foreignObject).toHaveAttribute('x', '42.5'); // 50 - 7.5
383
- expect(foreignObject).toHaveAttribute('y', '92.5'); // 100 - 7.5
384
- });
385
- it('should calculate correct position for label B', function () {
386
- var _renderComponent26 = renderComponent({
387
- x: 5,
388
- label: 'B'
389
- }),
390
- container = _renderComponent26.container;
391
- expect(mockScale.y).toHaveBeenCalledWith(20);
392
- });
393
- it('should calculate correct position for label C with string value', function () {
394
- var _renderComponent27 = renderComponent({
395
- x: 5,
396
- label: 'C'
397
- }),
398
- container = _renderComponent27.container;
399
- expect(mockScale.y).toHaveBeenCalledWith(30);
400
- });
401
- it('should have correct size attributes for small icon', function () {
402
- var _renderComponent28 = renderComponent({
403
- label: 'A'
404
- }),
405
- container = _renderComponent28.container;
406
- var foreignObject = container.querySelector('foreignObject');
407
- expect(foreignObject).toHaveAttribute('width', '15');
408
- expect(foreignObject).toHaveAttribute('height', '15');
409
- });
410
- });
411
- describe('correctData handling', function () {
412
- it('should find correct value from correctData by label', function () {
413
- var _renderComponent29 = renderComponent({
414
- label: 'B'
415
- }),
416
- container = _renderComponent29.container;
417
- var foreignObject = container.querySelector('foreignObject');
418
- expect(foreignObject).toBeInTheDocument();
419
- expect(mockScale.y).toHaveBeenCalledWith(20);
420
- });
421
- it('should not render when label is not in correctData', function () {
422
- var _renderComponent30 = renderComponent({
423
- label: 'Z'
424
- }),
425
- container = _renderComponent30.container;
426
- var foreignObject = container.querySelector('foreignObject');
427
- expect(foreignObject).not.toBeInTheDocument();
428
- });
429
- it('should not render when correctData value is NaN', function () {
430
- var _renderComponent31 = renderComponent({
431
- correctData: [{
432
- label: 'A',
433
- value: 'invalid'
434
- }],
435
- label: 'A'
436
- }),
437
- container = _renderComponent31.container;
438
- var foreignObject = container.querySelector('foreignObject');
439
- expect(foreignObject).not.toBeInTheDocument();
440
- });
441
- it('should handle empty correctData array', function () {
442
- var _renderComponent32 = renderComponent({
443
- correctData: [],
444
- label: 'A'
445
- }),
446
- container = _renderComponent32.container;
447
- var foreignObject = container.querySelector('foreignObject');
448
- expect(foreignObject).not.toBeInTheDocument();
449
- });
450
- it('should not render when correctData is undefined (correctness not incorrect)', function () {
451
- var _renderComponent33 = renderComponent({
452
- correctness: {
453
- value: 'correct',
454
- label: 'Correct'
455
- },
456
- correctData: undefined,
457
- label: 'A'
458
- }),
459
- container = _renderComponent33.container;
460
- var foreignObject = container.querySelector('foreignObject');
461
- expect(foreignObject).not.toBeInTheDocument();
462
- });
463
- it('should parse string values correctly', function () {
464
- var _renderComponent34 = renderComponent({
465
- correctData: [{
466
- label: 'D',
467
- value: '45.5'
468
- }],
469
- label: 'D'
470
- }),
471
- container = _renderComponent34.container;
472
- var foreignObject = container.querySelector('foreignObject');
473
- expect(foreignObject).toBeInTheDocument();
474
- expect(mockScale.y).toHaveBeenCalledWith(45.5);
475
- });
476
- it('should handle zero values', function () {
477
- var _renderComponent35 = renderComponent({
478
- correctData: [{
479
- label: 'E',
480
- value: 0
481
- }],
482
- label: 'E'
483
- }),
484
- container = _renderComponent35.container;
485
- var foreignObject = container.querySelector('foreignObject');
486
- expect(foreignObject).toBeInTheDocument();
487
- expect(mockScale.y).toHaveBeenCalledWith(0);
488
- });
489
- it('should handle negative values', function () {
490
- var _renderComponent36 = renderComponent({
491
- correctData: [{
492
- label: 'F',
493
- value: -10
494
- }],
495
- label: 'F'
496
- }),
497
- container = _renderComponent36.container;
498
- var foreignObject = container.querySelector('foreignObject');
499
- expect(foreignObject).toBeInTheDocument();
500
- expect(mockScale.y).toHaveBeenCalledWith(-10);
501
- });
502
- });
503
- describe('icon properties', function () {
504
- it('should render icon with correct title', function () {
505
- var _renderComponent37 = renderComponent({
506
- correctness: {
507
- value: 'incorrect',
508
- label: 'Not quite right'
509
- },
510
- label: 'A'
511
- }),
512
- getByTestId = _renderComponent37.getByTestId;
513
- var icon = getByTestId('check-icon');
514
- expect(icon).toHaveAttribute('title', 'Not quite right');
515
- });
516
- it('should render icon with small className', function () {
517
- var _renderComponent38 = renderComponent({
518
- label: 'A'
519
- }),
520
- getByTestId = _renderComponent38.getByTestId;
521
- var icon = getByTestId('check-icon');
522
- expect(icon).toHaveClass('small');
523
- });
524
- });
525
- describe('edge cases', function () {
526
- it('should handle missing label prop', function () {
527
- var _renderComponent39 = renderComponent({
528
- label: undefined
529
- }),
530
- container = _renderComponent39.container;
531
- var foreignObject = container.querySelector('foreignObject');
532
- expect(foreignObject).not.toBeInTheDocument();
533
- });
534
- it('should handle empty string label', function () {
535
- var _renderComponent40 = renderComponent({
536
- label: ''
537
- }),
538
- container = _renderComponent40.container;
539
- var foreignObject = container.querySelector('foreignObject');
540
- expect(foreignObject).not.toBeInTheDocument();
541
- });
542
- it('should handle very large values in correctData', function () {
543
- var _renderComponent41 = renderComponent({
544
- correctData: [{
545
- label: 'G',
546
- value: 999999
547
- }],
548
- label: 'G'
549
- }),
550
- container = _renderComponent41.container;
551
- var foreignObject = container.querySelector('foreignObject');
552
- expect(foreignObject).toBeInTheDocument();
553
- expect(mockScale.y).toHaveBeenCalledWith(999999);
554
- });
555
- it('should only render for incorrect answers', function () {
556
- var _renderComponent42 = renderComponent({
557
- correctness: {
558
- value: 'incorrect',
559
- label: 'Wrong'
560
- },
561
- label: 'A'
562
- }),
563
- incorrectContainer = _renderComponent42.container;
564
- expect(incorrectContainer.querySelector('foreignObject')).toBeInTheDocument();
565
- var _renderComponent43 = renderComponent({
566
- correctness: {
567
- value: 'correct',
568
- label: 'Right'
569
- },
570
- label: 'A'
571
- }),
572
- correctContainer = _renderComponent43.container;
573
- expect(correctContainer.querySelector('foreignObject')).not.toBeInTheDocument();
574
- });
575
- });
576
- });
577
- describe('TickCorrectnessIndicator', function () {
578
- beforeEach(function () {
579
- jest.clearAllMocks();
580
- });
581
- var renderComponent = function renderComponent() {
582
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
583
- var defaults = {
584
- correctness: {
585
- value: 'correct',
586
- label: 'Correct Answer'
587
- },
588
- interactive: true
589
- };
590
- var props = _objectSpread(_objectSpread({}, defaults), extras);
591
- return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
592
- theme: theme
593
- }, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.TickCorrectnessIndicator, props)));
594
- };
595
- describe('rendering', function () {
596
- it('should render without crashing', function () {
597
- var _renderComponent44 = renderComponent(),
598
- container = _renderComponent44.container;
599
- expect(container).toBeInTheDocument();
600
- });
601
- it('should render check icon for correct answer', function () {
602
- var _renderComponent45 = renderComponent({
603
- correctness: {
604
- value: 'correct',
605
- label: 'Correct'
606
- }
607
- }),
608
- getByTestId = _renderComponent45.getByTestId;
609
- expect(getByTestId('check-icon')).toBeInTheDocument();
610
- });
611
- it('should render close icon for incorrect answer', function () {
612
- var _renderComponent46 = renderComponent({
613
- correctness: {
614
- value: 'incorrect',
615
- label: 'Incorrect'
616
- }
617
- }),
618
- getByTestId = _renderComponent46.getByTestId;
619
- expect(getByTestId('close-icon')).toBeInTheDocument();
620
- });
621
- it('should not render when correctness is null', function () {
622
- var _renderComponent47 = renderComponent({
623
- correctness: null
624
- }),
625
- queryByTestId = _renderComponent47.queryByTestId;
626
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
627
- expect(queryByTestId('close-icon')).not.toBeInTheDocument();
628
- });
629
- it('should not render when correctness is undefined', function () {
630
- var _renderComponent48 = renderComponent({
631
- correctness: undefined
632
- }),
633
- queryByTestId = _renderComponent48.queryByTestId;
634
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
635
- expect(queryByTestId('close-icon')).not.toBeInTheDocument();
636
- });
637
- it('should not render when interactive is false', function () {
638
- var _renderComponent49 = renderComponent({
639
- interactive: false
640
- }),
641
- queryByTestId = _renderComponent49.queryByTestId;
642
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
643
- expect(queryByTestId('close-icon')).not.toBeInTheDocument();
644
- });
645
- it('should render with correct title for correct answer', function () {
646
- var _renderComponent50 = renderComponent({
647
- correctness: {
648
- value: 'correct',
649
- label: 'Great job!'
650
- }
651
- }),
652
- getByTestId = _renderComponent50.getByTestId;
653
- var icon = getByTestId('check-icon');
654
- expect(icon).toHaveAttribute('title', 'Great job!');
655
- });
656
- it('should render with correct title for incorrect answer', function () {
657
- var _renderComponent51 = renderComponent({
658
- correctness: {
659
- value: 'incorrect',
660
- label: 'Not correct'
661
- }
662
- }),
663
- getByTestId = _renderComponent51.getByTestId;
664
- var icon = getByTestId('close-icon');
665
- expect(icon).toHaveAttribute('title', 'Not correct');
666
- });
667
- });
668
- describe('interactive flag', function () {
669
- it('should render when interactive is true', function () {
670
- var _renderComponent52 = renderComponent({
671
- interactive: true,
672
- correctness: {
673
- value: 'correct',
674
- label: 'Test'
675
- }
676
- }),
677
- getByTestId = _renderComponent52.getByTestId;
678
- expect(getByTestId('check-icon')).toBeInTheDocument();
679
- });
680
- it('should not render when interactive is false', function () {
681
- var _renderComponent53 = renderComponent({
682
- interactive: false,
683
- correctness: {
684
- value: 'correct',
685
- label: 'Test'
686
- }
687
- }),
688
- queryByTestId = _renderComponent53.queryByTestId;
689
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
690
- });
691
- it('should not render when interactive is undefined', function () {
692
- var _renderComponent54 = renderComponent({
693
- interactive: undefined,
694
- correctness: {
695
- value: 'correct',
696
- label: 'Test'
697
- }
698
- }),
699
- queryByTestId = _renderComponent54.queryByTestId;
700
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
701
- });
702
- it('should not render when interactive is null', function () {
703
- var _renderComponent55 = renderComponent({
704
- interactive: null,
705
- correctness: {
706
- value: 'correct',
707
- label: 'Test'
708
- }
709
- }),
710
- queryByTestId = _renderComponent55.queryByTestId;
711
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
712
- });
713
- });
714
- describe('correctness values', function () {
715
- it('should render check icon when value is "correct"', function () {
716
- var _renderComponent56 = renderComponent({
717
- correctness: {
718
- value: 'correct',
719
- label: 'Test'
720
- }
721
- }),
722
- getByTestId = _renderComponent56.getByTestId,
723
- queryByTestId = _renderComponent56.queryByTestId;
724
- expect(getByTestId('check-icon')).toBeInTheDocument();
725
- expect(queryByTestId('close-icon')).not.toBeInTheDocument();
726
- });
727
- it('should render close icon when value is "incorrect"', function () {
728
- var _renderComponent57 = renderComponent({
729
- correctness: {
730
- value: 'incorrect',
731
- label: 'Test'
732
- }
733
- }),
734
- getByTestId = _renderComponent57.getByTestId,
735
- queryByTestId = _renderComponent57.queryByTestId;
736
- expect(getByTestId('close-icon')).toBeInTheDocument();
737
- expect(queryByTestId('check-icon')).not.toBeInTheDocument();
738
- });
739
- it('should render close icon for any value other than "correct"', function () {
740
- var _renderComponent58 = renderComponent({
741
- correctness: {
742
- value: 'partial',
743
- label: 'Test'
744
- }
745
- }),
746
- getByTestId = _renderComponent58.getByTestId;
747
- expect(getByTestId('close-icon')).toBeInTheDocument();
748
- });
749
- it('should handle empty value string', function () {
750
- var _renderComponent59 = renderComponent({
751
- correctness: {
752
- value: '',
753
- label: 'Test'
754
- }
755
- }),
756
- getByTestId = _renderComponent59.getByTestId;
757
- expect(getByTestId('close-icon')).toBeInTheDocument();
758
- });
759
- });
760
- describe('edge cases', function () {
761
- it('should handle correctness with empty label', function () {
762
- var _renderComponent60 = renderComponent({
763
- correctness: {
764
- value: 'correct',
765
- label: ''
766
- }
767
- }),
768
- getByTestId = _renderComponent60.getByTestId;
769
- var icon = getByTestId('check-icon');
770
- expect(icon).toHaveAttribute('title', '');
771
- });
772
- it('should handle correctness with undefined label', function () {
773
- var _renderComponent61 = renderComponent({
774
- correctness: {
775
- value: 'correct',
776
- label: undefined
777
- }
778
- }),
779
- getByTestId = _renderComponent61.getByTestId;
780
- expect(getByTestId('check-icon')).toBeInTheDocument();
781
- });
782
- it('should handle correctness with null value', function () {
783
- var _renderComponent62 = renderComponent({
784
- correctness: {
785
- value: null,
786
- label: 'Test'
787
- }
788
- }),
789
- queryByTestId = _renderComponent62.queryByTestId;
790
- expect(queryByTestId('close-icon')).toBeInTheDocument();
791
- });
792
- it('should require both correctness and interactive to render', function () {
793
- var _renderComponent63 = renderComponent({
794
- correctness: {
795
- value: 'correct',
796
- label: 'Test'
797
- },
798
- interactive: false
799
- }),
800
- query1 = _renderComponent63.queryByTestId;
801
- expect(query1('check-icon')).not.toBeInTheDocument();
802
- var _renderComponent64 = renderComponent({
803
- correctness: null,
804
- interactive: true
805
- }),
806
- query2 = _renderComponent64.queryByTestId;
807
- expect(query2('check-icon')).not.toBeInTheDocument();
808
- });
809
- it('should handle special characters in label', function () {
810
- var _renderComponent65 = renderComponent({
811
- correctness: {
812
- value: 'correct',
813
- label: 'Test <>&"'
814
- }
815
- }),
816
- getByTestId = _renderComponent65.getByTestId;
817
- var icon = getByTestId('check-icon');
818
- expect(icon).toHaveAttribute('title', 'Test <>&"');
819
- });
820
- it('should handle unicode characters in label', function () {
821
- var _renderComponent66 = renderComponent({
822
- correctness: {
823
- value: 'correct',
824
- label: 'Test 你好 🎉'
825
- }
826
- }),
827
- getByTestId = _renderComponent66.getByTestId;
828
- var icon = getByTestId('check-icon');
829
- expect(icon).toHaveAttribute('title', 'Test 你好 🎉');
830
- });
831
- it('should handle very long labels', function () {
832
- var longLabel = 'This is a very long label that might cause layout issues in the UI';
833
- var _renderComponent67 = renderComponent({
834
- correctness: {
835
- value: 'correct',
836
- label: longLabel
837
- }
838
- }),
839
- getByTestId = _renderComponent67.getByTestId;
840
- var icon = getByTestId('check-icon');
841
- expect(icon).toHaveAttribute('title', longLabel);
842
- });
843
- });
844
- describe('component consistency', function () {
845
- it('should render same icon type consistently for same correctness value', function () {
846
- var _renderComponent68 = renderComponent({
847
- correctness: {
848
- value: 'correct',
849
- label: 'Test 1'
850
- }
851
- }),
852
- getByTestId = _renderComponent68.getByTestId,
853
- unmount = _renderComponent68.unmount;
854
- expect(getByTestId('check-icon')).toBeInTheDocument();
855
- unmount();
856
- var _renderComponent69 = renderComponent({
857
- correctness: {
858
- value: 'correct',
859
- label: 'Test 2'
860
- }
861
- }),
862
- get2 = _renderComponent69.getByTestId;
863
- expect(get2('check-icon')).toBeInTheDocument();
864
- });
865
- it('should render different icons for different correctness values', function () {
866
- var _renderComponent70 = renderComponent({
867
- correctness: {
868
- value: 'correct',
869
- label: 'Correct'
870
- }
871
- }),
872
- getByTestId = _renderComponent70.getByTestId,
873
- unmount = _renderComponent70.unmount;
874
- expect(getByTestId('check-icon')).toBeInTheDocument();
875
- unmount();
876
- var _renderComponent71 = renderComponent({
877
- correctness: {
878
- value: 'incorrect',
879
- label: 'Incorrect'
880
- }
881
- }),
882
- get2 = _renderComponent71.getByTestId;
883
- expect(get2('close-icon')).toBeInTheDocument();
884
- });
885
- });
886
- });
887
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfc3R5bGVzIiwiX2NvcnJlY3RuZXNzSW5kaWNhdG9ycyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJjb2xvciIsImNvcnJlY3QiLCJpbmNvcnJlY3RXaXRoSWNvbiIsImRlZmF1bHRzIiwiV0hJVEUiLCJDaGVjayIsInByb3BzIiwiY3JlYXRlRWxlbWVudCIsInRpdGxlIiwiY2xhc3NOYW1lIiwiQ2xvc2UiLCJ0aGVtZSIsImJlZm9yZUFsbCIsImNyZWF0ZVRoZW1lIiwiZGVzY3JpYmUiLCJtb2NrU2NhbGUiLCJ4IiwiZm4iLCJ2YWwiLCJ5IiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJ1bmRlZmluZWQiLCJzY2FsZSIsImNvcnJlY3RuZXNzIiwidmFsdWUiLCJsYWJlbCIsImludGVyYWN0aXZlIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIkNvcnJlY3RuZXNzSW5kaWNhdG9yIiwiaXQiLCJfcmVuZGVyQ29tcG9uZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyQ29tcG9uZW50MiIsImZvcmVpZ25PYmplY3QiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlckNvbXBvbmVudDMiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXJDb21wb25lbnQ0IiwiX3JlbmRlckNvbXBvbmVudDUiLCJub3QiLCJfcmVuZGVyQ29tcG9uZW50NiIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJpY29uIiwidG9IYXZlQXR0cmlidXRlIiwiX3JlbmRlckNvbXBvbmVudDkiLCJfcmVuZGVyQ29tcG9uZW50MCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfcmVuZGVyQ29tcG9uZW50MTQiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfcmVuZGVyQ29tcG9uZW50MTciLCJfcmVuZGVyQ29tcG9uZW50MTgiLCJjb3JyZWN0RGF0YSIsIlNtYWxsQ29ycmVjdFBvaW50SW5kaWNhdG9yIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwidG9IYXZlQ2xhc3MiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJfcmVuZGVyQ29tcG9uZW50MjMiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJfcmVuZGVyQ29tcG9uZW50MzAiLCJfcmVuZGVyQ29tcG9uZW50MzEiLCJfcmVuZGVyQ29tcG9uZW50MzIiLCJfcmVuZGVyQ29tcG9uZW50MzMiLCJfcmVuZGVyQ29tcG9uZW50MzQiLCJfcmVuZGVyQ29tcG9uZW50MzUiLCJfcmVuZGVyQ29tcG9uZW50MzYiLCJfcmVuZGVyQ29tcG9uZW50MzciLCJfcmVuZGVyQ29tcG9uZW50MzgiLCJfcmVuZGVyQ29tcG9uZW50MzkiLCJfcmVuZGVyQ29tcG9uZW50NDAiLCJfcmVuZGVyQ29tcG9uZW50NDEiLCJfcmVuZGVyQ29tcG9uZW50NDIiLCJpbmNvcnJlY3RDb250YWluZXIiLCJfcmVuZGVyQ29tcG9uZW50NDMiLCJjb3JyZWN0Q29udGFpbmVyIiwiVGlja0NvcnJlY3RuZXNzSW5kaWNhdG9yIiwiX3JlbmRlckNvbXBvbmVudDQ0IiwiX3JlbmRlckNvbXBvbmVudDQ1IiwiX3JlbmRlckNvbXBvbmVudDQ2IiwiX3JlbmRlckNvbXBvbmVudDQ3IiwicXVlcnlCeVRlc3RJZCIsIl9yZW5kZXJDb21wb25lbnQ0OCIsIl9yZW5kZXJDb21wb25lbnQ0OSIsIl9yZW5kZXJDb21wb25lbnQ1MCIsIl9yZW5kZXJDb21wb25lbnQ1MSIsIl9yZW5kZXJDb21wb25lbnQ1MiIsIl9yZW5kZXJDb21wb25lbnQ1MyIsIl9yZW5kZXJDb21wb25lbnQ1NCIsIl9yZW5kZXJDb21wb25lbnQ1NSIsIl9yZW5kZXJDb21wb25lbnQ1NiIsIl9yZW5kZXJDb21wb25lbnQ1NyIsIl9yZW5kZXJDb21wb25lbnQ1OCIsIl9yZW5kZXJDb21wb25lbnQ1OSIsIl9yZW5kZXJDb21wb25lbnQ2MCIsIl9yZW5kZXJDb21wb25lbnQ2MSIsIl9yZW5kZXJDb21wb25lbnQ2MiIsIl9yZW5kZXJDb21wb25lbnQ2MyIsInF1ZXJ5MSIsIl9yZW5kZXJDb21wb25lbnQ2NCIsInF1ZXJ5MiIsIl9yZW5kZXJDb21wb25lbnQ2NSIsIl9yZW5kZXJDb21wb25lbnQ2NiIsImxvbmdMYWJlbCIsIl9yZW5kZXJDb21wb25lbnQ2NyIsIl9yZW5kZXJDb21wb25lbnQ2OCIsInVubW91bnQiLCJfcmVuZGVyQ29tcG9uZW50NjkiLCJnZXQyIiwiX3JlbmRlckNvbXBvbmVudDcwIiwiX3JlbmRlckNvbXBvbmVudDcxIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9fX3Rlc3RzX18vY29ycmVjdG5lc3MtaW5kaWNhdG9ycy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVtZSwgVGhlbWVQcm92aWRlciB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IENvcnJlY3RuZXNzSW5kaWNhdG9yLCBTbWFsbENvcnJlY3RQb2ludEluZGljYXRvciwgVGlja0NvcnJlY3RuZXNzSW5kaWNhdG9yIH0gZnJvbSAnLi4vY29ycmVjdG5lc3MtaW5kaWNhdG9ycyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvcmVuZGVyLXVpJywgKCkgPT4gKHtcbiAgY29sb3I6IHtcbiAgICBjb3JyZWN0OiAoKSA9PiAnIzAwZmYwMCcsXG4gICAgaW5jb3JyZWN0V2l0aEljb246ICgpID0+ICcjZmYwMDAwJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgV0hJVEU6ICcjZmZmZmZmJyxcbiAgICB9LFxuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2snLCAoKSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBDaGVjayhwcm9wcykge1xuICAgIHJldHVybiA8c3ZnIGRhdGEtdGVzdGlkPVwiY2hlY2staWNvblwiIHRpdGxlPXtwcm9wcy50aXRsZX0gY2xhc3NOYW1lPXtwcm9wcy5jbGFzc05hbWV9IC8+O1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQG11aS9pY29ucy1tYXRlcmlhbC9DbG9zZScsICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIENsb3NlKHByb3BzKSB7XG4gICAgcmV0dXJuIDxzdmcgZGF0YS10ZXN0aWQ9XCJjbG9zZS1pY29uXCIgdGl0bGU9e3Byb3BzLnRpdGxlfSBjbGFzc05hbWU9e3Byb3BzLmNsYXNzTmFtZX0gLz47XG4gIH07XG59KTtcblxubGV0IHRoZW1lO1xuXG5iZWZvcmVBbGwoKCkgPT4ge1xuICB0aGVtZSA9IGNyZWF0ZVRoZW1lKCk7XG59KTtcblxuZGVzY3JpYmUoJ0NvcnJlY3RuZXNzSW5kaWNhdG9yJywgKCkgPT4ge1xuICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgeDogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gICAgeTogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgc2NhbGU6IG1vY2tTY2FsZSxcbiAgICAgIHg6IDUsXG4gICAgICB5OiAxMCxcbiAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCBBbnN3ZXInIH0sXG4gICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcihcbiAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxzdmc+XG4gICAgICAgICAgPENvcnJlY3RuZXNzSW5kaWNhdG9yIHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGZvcmVpZ25PYmplY3QgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjaGVjayBpY29uIGZvciBjb3JyZWN0IGFuc3dlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjbG9zZSBpY29uIGZvciBpbmNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ0luY29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgaW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRoIGNvcnJlY3QgdGl0bGUgZm9yIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdXZWxsIGRvbmUhJyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ1dlbGwgZG9uZSEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGggY29ycmVjdCB0aXRsZSBmb3IgaW5jb3JyZWN0IGFuc3dlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdUcnkgYWdhaW4nIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2xvc2UtaWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnVHJ5IGFnYWluJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwb3NpdGlvbmluZyB3aXRoIHNjYWxlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXNlIHNjYWxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgICB4OiA1LFxuICAgICAgICB5OiAxMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDUpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxMCk7XG4gICAgICAvLyBwb3NpdGlvbiBpcyBzY2FsZWQgdmFsdWUgLSAxMSAoaGFsZiBvZiAyMnB4IGljb24gc2l6ZSlcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3gnLCAnMzknKTsgLy8gNTAgLSAxMVxuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgneScsICc4OScpOyAvLyAxMDAgLSAxMVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3Qgc2l6ZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd3aWR0aCcsICcyMicpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgnaGVpZ2h0JywgJzIyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgeCBhbmQgeSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgeDogMjAsXG4gICAgICAgIHk6IDMwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIwKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMzApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgcmF3IHZhbHVlcyB3aGVuIHNjYWxlIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBzY2FsZTogbnVsbCxcbiAgICAgICAgeDogNTAsXG4gICAgICAgIHk6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd4JywgJzM5Jyk7IC8vIDUwIC0gMTFcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3knLCAnODknKTsgLy8gMTAwIC0gMTFcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3gnLCAnLTExJyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd5JywgJy0xMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmVnYXRpdmUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgeDogLTUsXG4gICAgICAgIHk6IC0xMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS54KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgtNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKC0xMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiAxMDAwLFxuICAgICAgICB5OiAyMDAwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwMDApO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgyMDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggZW1wdHkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJycgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggdW5kZWZpbmVkIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6IHVuZGVmaW5lZCB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdoZW4gYm90aCBjb3JyZWN0bmVzcyBhbmQgaW50ZXJhY3RpdmUgYXJlIHRydWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBpbnRlcmFjdGl2ZSBpcyBmYWxzZSBldmVuIHdpdGggY29ycmVjdG5lc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1NtYWxsQ29ycmVjdFBvaW50SW5kaWNhdG9yJywgKCkgPT4ge1xuICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgeDogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gICAgeTogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gIH07XG5cbiAgY29uc3QgY29ycmVjdERhdGEgPSBbXG4gICAgeyBsYWJlbDogJ0EnLCB2YWx1ZTogMTAgfSxcbiAgICB7IGxhYmVsOiAnQicsIHZhbHVlOiAyMCB9LFxuICAgIHsgbGFiZWw6ICdDJywgdmFsdWU6ICczMCcgfSxcbiAgXTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVuZGVyQ29tcG9uZW50ID0gKGV4dHJhcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgeDogNSxcbiAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdJbmNvcnJlY3QnIH0sXG4gICAgICBjb3JyZWN0RGF0YSxcbiAgICAgIGxhYmVsOiAnQScsXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxTbWFsbENvcnJlY3RQb2ludEluZGljYXRvciB7Li4ucHJvcHN9IC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9UaGVtZVByb3ZpZGVyPixcbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBmb3JlaWduT2JqZWN0IHdoZW4gaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdXcm9uZycgfSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHNtYWxsIGNoZWNrIGljb24gd2hlbiBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnV3JvbmcnIH0sXG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQ2xhc3MoJ3NtYWxsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncG9zaXRpb25pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgbGFiZWwgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTsgLy8gdmFsdWUgZnJvbSBjb3JyZWN0RGF0YSBmb3IgbGFiZWwgQVxuICAgICAgLy8gUG9zaXRpb24gaXMgc2NhbGVkIHZhbHVlIC0gNy41IChoYWxmIG9mIDE1cHggc21hbGwgaWNvbiBzaXplKVxuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgneCcsICc0Mi41Jyk7IC8vIDUwIC0gNy41XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd5JywgJzkyLjUnKTsgLy8gMTAwIC0gNy41XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uIGZvciBsYWJlbCBCJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHg6IDUsXG4gICAgICAgIGxhYmVsOiAnQicsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgbGFiZWwgQyB3aXRoIHN0cmluZyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICBsYWJlbDogJ0MnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDMwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHNpemUgYXR0cmlidXRlcyBmb3Igc21hbGwgaWNvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3dpZHRoJywgJzE1Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCdoZWlnaHQnLCAnMTUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3REYXRhIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmluZCBjb3JyZWN0IHZhbHVlIGZyb20gY29ycmVjdERhdGEgYnkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6ICdCJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbGFiZWwgaXMgbm90IGluIGNvcnJlY3REYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsOiAnWicsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gY29ycmVjdERhdGEgdmFsdWUgaXMgTmFOJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0EnLCB2YWx1ZTogJ2ludmFsaWQnIH1dLFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGNvcnJlY3REYXRhIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbXSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0RGF0YSBpcyB1bmRlZmluZWQgKGNvcnJlY3RuZXNzIG5vdCBpbmNvcnJlY3QpJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgICAgY29ycmVjdERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHN0cmluZyB2YWx1ZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0QnLCB2YWx1ZTogJzQ1LjUnIH1dLFxuICAgICAgICBsYWJlbDogJ0QnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg0NS41KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0UnLCB2YWx1ZTogMCB9XSxcbiAgICAgICAgbGFiZWw6ICdFJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdERhdGE6IFt7IGxhYmVsOiAnRicsIHZhbHVlOiAtMTAgfV0sXG4gICAgICAgIGxhYmVsOiAnRicsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKC0xMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpY29uIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWNvbiB3aXRoIGNvcnJlY3QgdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnTm90IHF1aXRlIHJpZ2h0JyB9LFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ05vdCBxdWl0ZSByaWdodCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWNvbiB3aXRoIHNtYWxsIGNsYXNzTmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUNsYXNzKCdzbWFsbCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXNzaW5nIGxhYmVsIHByb3AnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmcgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHZlcnkgbGFyZ2UgdmFsdWVzIGluIGNvcnJlY3REYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0cnLCB2YWx1ZTogOTk5OTk5IH1dLFxuICAgICAgICBsYWJlbDogJ0cnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg5OTk5OTkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IHJlbmRlciBmb3IgaW5jb3JyZWN0IGFuc3dlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lcjogaW5jb3JyZWN0Q29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnV3JvbmcnIH0sXG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChpbmNvcnJlY3RDb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lcjogY29ycmVjdENvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdSaWdodCcgfSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvcnJlY3RDb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RpY2tDb3JyZWN0bmVzc0luZGljYXRvcicsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IEFuc3dlcicgfSxcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKFxuICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgPFRpY2tDb3JyZWN0bmVzc0luZGljYXRvciB7Li4ucHJvcHN9IC8+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNoZWNrIGljb24gZm9yIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNsb3NlIGljb24gZm9yIGluY29ycmVjdCBhbnN3ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnSW5jb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGNvcnJlY3RuZXNzIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGNvcnJlY3RuZXNzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdjaGVjay1pY29uJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBpbnRlcmFjdGl2ZSBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgaW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGggY29ycmVjdCB0aXRsZSBmb3IgY29ycmVjdCBhbnN3ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0dyZWF0IGpvYiEnIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnR3JlYXQgam9iIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aCBjb3JyZWN0IHRpdGxlIGZvciBpbmNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ05vdCBjb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2Nsb3NlLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ05vdCBjb3JyZWN0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlcmFjdGl2ZSBmbGFnJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2hlY2staWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGludGVyYWN0aXZlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgaW50ZXJhY3RpdmU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2hlY2staWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGludGVyYWN0aXZlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiBudWxsLFxuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdjaGVjay1pY29uJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdG5lc3MgdmFsdWVzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNoZWNrIGljb24gd2hlbiB2YWx1ZSBpcyBcImNvcnJlY3RcIicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQsIHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNsb3NlIGljb24gd2hlbiB2YWx1ZSBpcyBcImluY29ycmVjdFwiJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjbG9zZSBpY29uIGZvciBhbnkgdmFsdWUgb3RoZXIgdGhhbiBcImNvcnJlY3RcIicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAncGFydGlhbCcsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSB2YWx1ZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJycsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggZW1wdHkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJycgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggdW5kZWZpbmVkIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6IHVuZGVmaW5lZCB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggbnVsbCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6IG51bGwsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBib3RoIGNvcnJlY3RuZXNzIGFuZCBpbnRlcmFjdGl2ZSB0byByZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQ6IHF1ZXJ5MSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeTEoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG5cbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZDogcXVlcnkyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogbnVsbCxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeTIoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QgPD4mXCInIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnVGVzdCA8PiZcIicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0IOS9oOWlvSDwn46JJyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Rlc3Qg5L2g5aW9IPCfjoknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHZlcnkgbG9uZyBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsb25nTGFiZWwgPSAnVGhpcyBpcyBhIHZlcnkgbG9uZyBsYWJlbCB0aGF0IG1pZ2h0IGNhdXNlIGxheW91dCBpc3N1ZXMgaW4gdGhlIFVJJztcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiBsb25nTGFiZWwgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsIGxvbmdMYWJlbCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wb25lbnQgY29uc2lzdGVuY3knLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgc2FtZSBpY29uIHR5cGUgY29uc2lzdGVudGx5IGZvciBzYW1lIGNvcnJlY3RuZXNzIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgdW5tb3VudCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0IDEnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB1bm1vdW50KCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQ6IGdldDIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnVGVzdCAyJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXQyKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBkaWZmZXJlbnQgaWNvbnMgZm9yIGRpZmZlcmVudCBjb3JyZWN0bmVzcyB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkLCB1bm1vdW50IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0NvcnJlY3QnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB1bm1vdW50KCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQ6IGdldDIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldDIoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FB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QWlDckcsZUFBZSxDQUFDO1VBQy9DSSxXQUFXLEVBQUU7WUFBRUMsS0FBSyxFQUFFLFNBQVM7WUFBRUMsS0FBSyxFQUFFO1VBQVM7UUFDbkQsQ0FBQyxDQUFDO1FBRk1jLFdBQVcsR0FBQWlGLGtCQUFBLENBQVhqRixXQUFXO1FBQUVrRixPQUFPLEdBQUFELGtCQUFBLENBQVBDLE9BQU87TUFJNUJ4RixNQUFNLENBQUNNLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDTCxpQkFBaUIsQ0FBQyxDQUFDO01BQ3JEdUYsT0FBTyxDQUFDLENBQUM7TUFFVCxJQUFBQyxrQkFBQSxHQUE4QnZHLGVBQWUsQ0FBQztVQUM1Q0ksV0FBVyxFQUFFO1lBQUVDLEtBQUssRUFBRSxTQUFTO1lBQUVDLEtBQUssRUFBRTtVQUFTO1FBQ25ELENBQUMsQ0FBQztRQUZtQmtHLElBQUksR0FBQUQsa0JBQUEsQ0FBakJuRixXQUFXO01BSW5CTixNQUFNLENBQUMwRixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ3pGLGlCQUFpQixDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUZKLEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxZQUFNO01BQ3pFLElBQUE4RixrQkFBQSxHQUFpQ3pHLGVBQWUsQ0FBQztVQUMvQ0ksV0FBVyxFQUFFO1lBQUVDLEtBQUssRUFBRSxTQUFTO1lBQUVDLEtBQUssRUFBRTtVQUFVO1FBQ3BELENBQUMsQ0FBQztRQUZNYyxXQUFXLEdBQUFxRixrQkFBQSxDQUFYckYsV0FBVztRQUFFa0YsT0FBTyxHQUFBRyxrQkFBQSxDQUFQSCxPQUFPO01BSTVCeEYsTUFBTSxDQUFDTSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ0wsaUJBQWlCLENBQUMsQ0FBQztNQUNyRHVGLE9BQU8sQ0FBQyxDQUFDO01BRVQsSUFBQUksa0JBQUEsR0FBOEIxRyxlQUFlLENBQUM7VUFDNUNJLFdBQVcsRUFBRTtZQUFFQyxLQUFLLEVBQUUsV0FBVztZQUFFQyxLQUFLLEVBQUU7VUFBWTtRQUN4RCxDQUFDLENBQUM7UUFGbUJrRyxJQUFJLEdBQUFFLGtCQUFBLENBQWpCdEYsV0FBVztNQUluQk4sTUFBTSxDQUFDMEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUN6RixpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==