@pie-lib/graphing-solution-set 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 (75) hide show
  1. package/CHANGELOG.md +19 -32
  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/labels.js +1 -1
  19. package/lib/mark-label.js +1 -1
  20. package/lib/toggle-bar.js +1 -1
  21. package/lib/tool-menu.js +1 -1
  22. package/lib/tools/index.js +1 -1
  23. package/lib/tools/line/component.js +1 -1
  24. package/lib/tools/line/index.js +1 -1
  25. package/lib/tools/polygon/component.js +1 -1
  26. package/lib/tools/polygon/index.js +1 -1
  27. package/lib/tools/polygon/line.js +1 -1
  28. package/lib/tools/polygon/polygon.js +1 -1
  29. package/lib/tools/shared/arrow-head.js +1 -1
  30. package/lib/tools/shared/line/index.js +1 -1
  31. package/lib/tools/shared/line/line-path.js +1 -1
  32. package/lib/tools/shared/line/with-root-edge.js +1 -1
  33. package/lib/tools/shared/point/arrow-point.js +1 -1
  34. package/lib/tools/shared/point/arrow.js +1 -1
  35. package/lib/tools/shared/point/base-point.js +1 -1
  36. package/lib/tools/shared/point/index.js +1 -1
  37. package/lib/tools/shared/styles.js +1 -1
  38. package/lib/tools/shared/types.js +1 -1
  39. package/lib/undo-redo.js +1 -1
  40. package/lib/use-debounce.js +1 -1
  41. package/lib/utils.js +1 -1
  42. package/package.json +4 -4
  43. package/lib/__tests__/bg.test.js +0 -282
  44. package/lib/__tests__/coordinates-label.test.js +0 -276
  45. package/lib/__tests__/graph-with-controls.test.js +0 -256
  46. package/lib/__tests__/graph.test.js +0 -113
  47. package/lib/__tests__/grid-setup.test.js +0 -729
  48. package/lib/__tests__/grid.test.js +0 -29
  49. package/lib/__tests__/labels.test.js +0 -45
  50. package/lib/__tests__/mark-label.test.js +0 -133
  51. package/lib/__tests__/toggle-bar.test.js +0 -146
  52. package/lib/__tests__/tool-menu.test.js +0 -540
  53. package/lib/__tests__/undo-redo.test.js +0 -31
  54. package/lib/__tests__/use-debounce.test.js +0 -24
  55. package/lib/__tests__/utils.js +0 -70
  56. package/lib/__tests__/utils.test.js +0 -123
  57. package/lib/axis/__tests__/arrow.test.js +0 -60
  58. package/lib/axis/__tests__/axes.test.js +0 -160
  59. package/lib/container/__tests__/actions.test.js +0 -108
  60. package/lib/container/__tests__/index.test.js +0 -346
  61. package/lib/container/__tests__/marks.test.js +0 -259
  62. package/lib/container/__tests__/middleware.test.js +0 -244
  63. package/lib/container/__tests__/reducer.test.js +0 -450
  64. package/lib/tools/line/__tests__/component.test.js +0 -45
  65. package/lib/tools/polygon/__tests__/component.test.js +0 -501
  66. package/lib/tools/polygon/__tests__/index.test.js +0 -92
  67. package/lib/tools/polygon/__tests__/line.test.js +0 -30
  68. package/lib/tools/polygon/__tests__/polygon.test.js +0 -61
  69. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  70. package/lib/tools/shared/line/__tests__/index.test.js +0 -725
  71. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -64
  72. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -618
  73. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  74. package/lib/tools/shared/point/__tests__/arrow.test.js +0 -619
  75. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
@@ -1,540 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
5
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
- var _testUtils = require("@pie-lib/test-utils");
7
- var _react = _interopRequireDefault(require("react"));
8
- var _toolMenu = _interopRequireDefault(require("../tool-menu"));
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
- describe('ToolMenu', function () {
12
- var onChange;
13
- var tools = ['one', 'two'];
14
- beforeEach(function () {
15
- onChange = jest.fn();
16
- });
17
- var renderComponent = function renderComponent(extras) {
18
- var defaults = {
19
- classes: {},
20
- className: 'className',
21
- onChange: onChange,
22
- currentTool: tools[0],
23
- tools: tools,
24
- gssLineData: {
25
- selectedTool: 'lineA',
26
- numberOfLines: 2,
27
- lineA: {
28
- lineType: 'Solid'
29
- },
30
- lineB: {
31
- lineType: 'Solid'
32
- }
33
- }
34
- };
35
- var props = _objectSpread(_objectSpread({}, defaults), extras);
36
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_toolMenu["default"], props));
37
- };
38
- describe('rendering', function () {
39
- it('renders without crashing', function () {
40
- var _renderComponent = renderComponent(),
41
- container = _renderComponent.container;
42
- expect(container.firstChild).toBeInTheDocument();
43
- });
44
- it('renders Line A radio button', function () {
45
- var _renderComponent2 = renderComponent(),
46
- getByText = _renderComponent2.getByText;
47
- expect(getByText('Line A')).toBeInTheDocument();
48
- });
49
- it('renders Line B radio button when numberOfLines is 2', function () {
50
- var _renderComponent3 = renderComponent(),
51
- getByText = _renderComponent3.getByText;
52
- expect(getByText('Line B')).toBeInTheDocument();
53
- });
54
- it('does not render Line B radio button when numberOfLines is 1', function () {
55
- var _renderComponent4 = renderComponent({
56
- gssLineData: {
57
- selectedTool: 'lineA',
58
- numberOfLines: 1,
59
- lineA: {
60
- lineType: 'Solid'
61
- },
62
- lineB: {
63
- lineType: 'Solid'
64
- }
65
- }
66
- }),
67
- queryByText = _renderComponent4.queryByText;
68
- expect(queryByText('Line B')).not.toBeInTheDocument();
69
- });
70
- it('renders Solution Set radio button', function () {
71
- var _renderComponent5 = renderComponent(),
72
- getByText = _renderComponent5.getByText;
73
- expect(getByText('Solution Set')).toBeInTheDocument();
74
- });
75
- it('renders Solid and Dashed buttons for Line A', function () {
76
- var _renderComponent6 = renderComponent(),
77
- getAllByText = _renderComponent6.getAllByText;
78
- var solidButtons = getAllByText(/Solid/);
79
- var dashedButtons = getAllByText(/Dashed/);
80
- expect(solidButtons.length).toBeGreaterThan(0);
81
- expect(dashedButtons.length).toBeGreaterThan(0);
82
- });
83
- it('shows checkmark on selected line type for Line A', function () {
84
- var _renderComponent7 = renderComponent({
85
- gssLineData: {
86
- selectedTool: 'lineA',
87
- numberOfLines: 2,
88
- lineA: {
89
- lineType: 'Solid'
90
- },
91
- lineB: {
92
- lineType: 'Dashed'
93
- }
94
- }
95
- }),
96
- getAllByText = _renderComponent7.getAllByText;
97
- var solidButtons = getAllByText(/✔ Solid/);
98
- expect(solidButtons.length).toBeGreaterThan(0);
99
- });
100
- it('disables all controls when disabled prop is true', function () {
101
- var _renderComponent8 = renderComponent({
102
- disabled: true
103
- }),
104
- getAllByRole = _renderComponent8.getAllByRole;
105
- var radios = getAllByRole('radio');
106
- var buttons = getAllByRole('button');
107
- radios.forEach(function (radio) {
108
- expect(radio).toBeDisabled();
109
- });
110
- buttons.forEach(function (button) {
111
- expect(button).toBeDisabled();
112
- });
113
- });
114
- });
115
- describe('onChangeRadioValue', function () {
116
- it('calls onChange with updated selectedTool when lineA radio is clicked', function () {
117
- var _renderComponent9 = renderComponent({
118
- gssLineData: {
119
- selectedTool: 'solutionSet',
120
- numberOfLines: 2,
121
- lineA: {
122
- lineType: 'Solid'
123
- },
124
- lineB: {
125
- lineType: 'Solid'
126
- }
127
- }
128
- }),
129
- getAllByRole = _renderComponent9.getAllByRole;
130
- var radios = getAllByRole('radio');
131
- var lineARadio = radios.find(function (r) {
132
- return r.value === 'lineA';
133
- });
134
- _testUtils.fireEvent.click(lineARadio);
135
- expect(onChange).toHaveBeenCalledTimes(1);
136
- var _onChange$mock$calls$ = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
137
- updatedData = _onChange$mock$calls$[0],
138
- oldSelectedTool = _onChange$mock$calls$[1];
139
- expect(updatedData.selectedTool).toBe('lineA');
140
- expect(oldSelectedTool).toBe('solutionSet');
141
- });
142
- it('calls onChange with updated selectedTool when lineB radio is clicked', function () {
143
- var _renderComponent0 = renderComponent({
144
- gssLineData: {
145
- selectedTool: 'lineA',
146
- numberOfLines: 2,
147
- lineA: {
148
- lineType: 'Solid'
149
- },
150
- lineB: {
151
- lineType: 'Solid'
152
- }
153
- }
154
- }),
155
- getAllByRole = _renderComponent0.getAllByRole;
156
- var radios = getAllByRole('radio');
157
- var lineBRadio = radios.find(function (r) {
158
- return r.value === 'lineB';
159
- });
160
- _testUtils.fireEvent.click(lineBRadio);
161
- expect(onChange).toHaveBeenCalledTimes(1);
162
- var _onChange$mock$calls$2 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
163
- updatedData = _onChange$mock$calls$2[0],
164
- oldSelectedTool = _onChange$mock$calls$2[1];
165
- expect(updatedData.selectedTool).toBe('lineB');
166
- expect(oldSelectedTool).toBe('lineA');
167
- });
168
- it('calls onChange with updated selectedTool when solutionSet radio is clicked', function () {
169
- var _renderComponent1 = renderComponent({
170
- gssLineData: {
171
- selectedTool: 'lineA',
172
- numberOfLines: 2,
173
- lineA: {
174
- lineType: 'Solid'
175
- },
176
- lineB: {
177
- lineType: 'Solid'
178
- }
179
- }
180
- }),
181
- getAllByRole = _renderComponent1.getAllByRole;
182
- var radios = getAllByRole('radio');
183
- var solutionSetRadio = radios.find(function (r) {
184
- return r.value === 'solutionSet';
185
- });
186
- _testUtils.fireEvent.click(solutionSetRadio);
187
- expect(onChange).toHaveBeenCalledTimes(1);
188
- var _onChange$mock$calls$3 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
189
- updatedData = _onChange$mock$calls$3[0],
190
- oldSelectedTool = _onChange$mock$calls$3[1];
191
- expect(updatedData.selectedTool).toBe('solutionSet');
192
- expect(oldSelectedTool).toBe('lineA');
193
- });
194
- it('preserves other gssLineData properties when changing selectedTool', function () {
195
- var _renderComponent10 = renderComponent({
196
- gssLineData: {
197
- selectedTool: 'lineA',
198
- numberOfLines: 2,
199
- lineA: {
200
- lineType: 'Dashed'
201
- },
202
- lineB: {
203
- lineType: 'Solid'
204
- }
205
- }
206
- }),
207
- getAllByRole = _renderComponent10.getAllByRole;
208
- var radios = getAllByRole('radio');
209
- var lineBRadio = radios.find(function (r) {
210
- return r.value === 'lineB';
211
- });
212
- _testUtils.fireEvent.click(lineBRadio);
213
- var _onChange$mock$calls$4 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
214
- updatedData = _onChange$mock$calls$4[0];
215
- expect(updatedData.lineA.lineType).toBe('Dashed');
216
- expect(updatedData.lineB.lineType).toBe('Solid');
217
- expect(updatedData.numberOfLines).toBe(2);
218
- });
219
- it('does not call onChange when disabled', function () {
220
- var _renderComponent11 = renderComponent({
221
- disabled: true,
222
- gssLineData: {
223
- selectedTool: 'lineA',
224
- numberOfLines: 2,
225
- lineA: {
226
- lineType: 'Solid'
227
- },
228
- lineB: {
229
- lineType: 'Solid'
230
- }
231
- }
232
- }),
233
- getAllByRole = _renderComponent11.getAllByRole;
234
- var radios = getAllByRole('radio');
235
- var lineBRadio = radios.find(function (r) {
236
- return r.value === 'lineB';
237
- });
238
-
239
- // Disabled radios should not fire change events
240
- expect(lineBRadio).toBeDisabled();
241
- });
242
- });
243
- describe('lineTypeChange', function () {
244
- it('calls onChange with updated lineType for Line A when Solid button is clicked', function () {
245
- var _renderComponent12 = renderComponent({
246
- gssLineData: {
247
- selectedTool: 'lineA',
248
- numberOfLines: 2,
249
- lineA: {
250
- lineType: 'Dashed'
251
- },
252
- lineB: {
253
- lineType: 'Solid'
254
- }
255
- }
256
- }),
257
- getAllByText = _renderComponent12.getAllByText;
258
- var solidButtons = getAllByText(/Solid/);
259
- // First solid button should be for Line A
260
- _testUtils.fireEvent.click(solidButtons[0]);
261
- expect(onChange).toHaveBeenCalledTimes(1);
262
- var _onChange$mock$calls$5 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
263
- updatedData = _onChange$mock$calls$5[0],
264
- oldSelectedTool = _onChange$mock$calls$5[1];
265
- expect(updatedData.lineA.lineType).toBe('Solid');
266
- expect(oldSelectedTool).toBe('lineA');
267
- });
268
- it('calls onChange with updated lineType for Line A when Dashed button is clicked', function () {
269
- var _renderComponent13 = renderComponent({
270
- gssLineData: {
271
- selectedTool: 'lineA',
272
- numberOfLines: 2,
273
- lineA: {
274
- lineType: 'Solid'
275
- },
276
- lineB: {
277
- lineType: 'Solid'
278
- }
279
- }
280
- }),
281
- getAllByText = _renderComponent13.getAllByText;
282
- var dashedButtons = getAllByText(/Dashed/);
283
- // First dashed button should be for Line A
284
- _testUtils.fireEvent.click(dashedButtons[0]);
285
- expect(onChange).toHaveBeenCalledTimes(1);
286
- var _onChange$mock$calls$6 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
287
- updatedData = _onChange$mock$calls$6[0],
288
- oldSelectedTool = _onChange$mock$calls$6[1];
289
- expect(updatedData.lineA.lineType).toBe('Dashed');
290
- expect(oldSelectedTool).toBe('lineA');
291
- });
292
- it('calls onChange with updated lineType for Line B when Solid button is clicked', function () {
293
- var _renderComponent14 = renderComponent({
294
- gssLineData: {
295
- selectedTool: 'lineB',
296
- numberOfLines: 2,
297
- lineA: {
298
- lineType: 'Solid'
299
- },
300
- lineB: {
301
- lineType: 'Dashed'
302
- }
303
- }
304
- }),
305
- getAllByText = _renderComponent14.getAllByText;
306
- var solidButtons = getAllByText(/Solid/);
307
- // Second solid button should be for Line B
308
- _testUtils.fireEvent.click(solidButtons[1]);
309
- expect(onChange).toHaveBeenCalledTimes(1);
310
- var _onChange$mock$calls$7 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
311
- updatedData = _onChange$mock$calls$7[0],
312
- oldSelectedTool = _onChange$mock$calls$7[1];
313
- expect(updatedData.lineB.lineType).toBe('Solid');
314
- expect(oldSelectedTool).toBe('lineB');
315
- });
316
- it('calls onChange with updated lineType for Line B when Dashed button is clicked', function () {
317
- var _renderComponent15 = renderComponent({
318
- gssLineData: {
319
- selectedTool: 'lineB',
320
- numberOfLines: 2,
321
- lineA: {
322
- lineType: 'Solid'
323
- },
324
- lineB: {
325
- lineType: 'Solid'
326
- }
327
- }
328
- }),
329
- getAllByText = _renderComponent15.getAllByText;
330
- var dashedButtons = getAllByText(/Dashed/);
331
- // Second dashed button should be for Line B
332
- _testUtils.fireEvent.click(dashedButtons[1]);
333
- expect(onChange).toHaveBeenCalledTimes(1);
334
- var _onChange$mock$calls$8 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
335
- updatedData = _onChange$mock$calls$8[0],
336
- oldSelectedTool = _onChange$mock$calls$8[1];
337
- expect(updatedData.lineB.lineType).toBe('Dashed');
338
- expect(oldSelectedTool).toBe('lineB');
339
- });
340
- it('preserves other line properties when changing Line A lineType', function () {
341
- var _renderComponent16 = renderComponent({
342
- gssLineData: {
343
- selectedTool: 'lineA',
344
- numberOfLines: 2,
345
- lineA: {
346
- lineType: 'Solid'
347
- },
348
- lineB: {
349
- lineType: 'Dashed'
350
- }
351
- }
352
- }),
353
- getAllByText = _renderComponent16.getAllByText;
354
- var dashedButtons = getAllByText(/Dashed/);
355
- _testUtils.fireEvent.click(dashedButtons[0]);
356
- var _onChange$mock$calls$9 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
357
- updatedData = _onChange$mock$calls$9[0];
358
- expect(updatedData.lineA.lineType).toBe('Dashed');
359
- expect(updatedData.lineB.lineType).toBe('Dashed');
360
- expect(updatedData.selectedTool).toBe('lineA');
361
- expect(updatedData.numberOfLines).toBe(2);
362
- });
363
- it('preserves other line properties when changing Line B lineType', function () {
364
- var _renderComponent17 = renderComponent({
365
- gssLineData: {
366
- selectedTool: 'lineB',
367
- numberOfLines: 2,
368
- lineA: {
369
- lineType: 'Dashed'
370
- },
371
- lineB: {
372
- lineType: 'Solid'
373
- }
374
- }
375
- }),
376
- getAllByText = _renderComponent17.getAllByText;
377
- var dashedButtons = getAllByText(/Dashed/);
378
- _testUtils.fireEvent.click(dashedButtons[1]);
379
- var _onChange$mock$calls$0 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
380
- updatedData = _onChange$mock$calls$0[0];
381
- expect(updatedData.lineA.lineType).toBe('Dashed');
382
- expect(updatedData.lineB.lineType).toBe('Dashed');
383
- expect(updatedData.selectedTool).toBe('lineB');
384
- expect(updatedData.numberOfLines).toBe(2);
385
- });
386
- it('handles multiple line type changes correctly', function () {
387
- var _renderComponent18 = renderComponent({
388
- gssLineData: {
389
- selectedTool: 'lineA',
390
- numberOfLines: 2,
391
- lineA: {
392
- lineType: 'Solid'
393
- },
394
- lineB: {
395
- lineType: 'Solid'
396
- }
397
- }
398
- }),
399
- getAllByText = _renderComponent18.getAllByText;
400
-
401
- // Change Line A to Dashed
402
- var dashedButtons = getAllByText(/Dashed/);
403
- _testUtils.fireEvent.click(dashedButtons[0]);
404
- expect(onChange).toHaveBeenCalledTimes(1);
405
- var _onChange$mock$calls$1 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
406
- updatedData = _onChange$mock$calls$1[0];
407
- expect(updatedData.lineA.lineType).toBe('Dashed');
408
-
409
- // Change Line B to Dashed
410
- dashedButtons = getAllByText(/Dashed/);
411
- _testUtils.fireEvent.click(dashedButtons[1]);
412
- expect(onChange).toHaveBeenCalledTimes(2);
413
- var _onChange$mock$calls$10 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
414
- updatedData = _onChange$mock$calls$10[0];
415
- expect(updatedData.lineB.lineType).toBe('Dashed');
416
- });
417
- it('does not call onChange when line type button is disabled', function () {
418
- var _renderComponent19 = renderComponent({
419
- disabled: true,
420
- gssLineData: {
421
- selectedTool: 'lineA',
422
- numberOfLines: 2,
423
- lineA: {
424
- lineType: 'Solid'
425
- },
426
- lineB: {
427
- lineType: 'Solid'
428
- }
429
- }
430
- }),
431
- getAllByRole = _renderComponent19.getAllByRole;
432
- var buttons = getAllByRole('button');
433
- buttons.forEach(function (button) {
434
- expect(button).toBeDisabled();
435
- });
436
- });
437
- it('maintains correct state when clicking same line type that is already selected', function () {
438
- var _renderComponent20 = renderComponent({
439
- gssLineData: {
440
- selectedTool: 'lineA',
441
- numberOfLines: 2,
442
- lineA: {
443
- lineType: 'Solid'
444
- },
445
- lineB: {
446
- lineType: 'Solid'
447
- }
448
- }
449
- }),
450
- getAllByText = _renderComponent20.getAllByText;
451
- var solidButtons = getAllByText(/Solid/);
452
- _testUtils.fireEvent.click(solidButtons[0]); // Click Solid when already Solid
453
-
454
- expect(onChange).toHaveBeenCalledTimes(1);
455
- var _onChange$mock$calls$11 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
456
- updatedData = _onChange$mock$calls$11[0];
457
- expect(updatedData.lineA.lineType).toBe('Solid');
458
- });
459
- });
460
- describe('integration tests', function () {
461
- it('allows switching selected tool and changing line type in sequence', function () {
462
- var _renderComponent21 = renderComponent({
463
- gssLineData: {
464
- selectedTool: 'lineA',
465
- numberOfLines: 2,
466
- lineA: {
467
- lineType: 'Solid'
468
- },
469
- lineB: {
470
- lineType: 'Solid'
471
- }
472
- }
473
- }),
474
- getAllByRole = _renderComponent21.getAllByRole,
475
- getAllByText = _renderComponent21.getAllByText;
476
-
477
- // Switch to Line B
478
- var radios = getAllByRole('radio');
479
- var lineBRadio = radios.find(function (r) {
480
- return r.value === 'lineB';
481
- });
482
- _testUtils.fireEvent.click(lineBRadio);
483
- expect(onChange).toHaveBeenCalledTimes(1);
484
- var _onChange$mock$calls$12 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
485
- updatedData = _onChange$mock$calls$12[0];
486
- expect(updatedData.selectedTool).toBe('lineB');
487
-
488
- // Change Line B to Dashed
489
- var dashedButtons = getAllByText(/Dashed/);
490
- _testUtils.fireEvent.click(dashedButtons[1]);
491
- expect(onChange).toHaveBeenCalledTimes(2);
492
- var _onChange$mock$calls$13 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
493
- updatedData = _onChange$mock$calls$13[0];
494
- expect(updatedData.lineB.lineType).toBe('Dashed');
495
- });
496
- it('handles complete workflow of switching between all tools and changing line types', function () {
497
- var _renderComponent22 = renderComponent({
498
- gssLineData: {
499
- selectedTool: 'lineA',
500
- numberOfLines: 2,
501
- lineA: {
502
- lineType: 'Solid'
503
- },
504
- lineB: {
505
- lineType: 'Solid'
506
- }
507
- }
508
- }),
509
- getAllByRole = _renderComponent22.getAllByRole,
510
- getAllByText = _renderComponent22.getAllByText;
511
-
512
- // Change Line A to Dashed
513
- var dashedButtons = getAllByText(/Dashed/);
514
- _testUtils.fireEvent.click(dashedButtons[0]);
515
- expect(onChange.mock.calls[0][0].lineA.lineType).toBe('Dashed');
516
-
517
- // Switch to Line B
518
- var radios = getAllByRole('radio');
519
- var lineBRadio = radios.find(function (r) {
520
- return r.value === 'lineB';
521
- });
522
- _testUtils.fireEvent.click(lineBRadio);
523
- expect(onChange.mock.calls[1][0].selectedTool).toBe('lineB');
524
-
525
- // Change Line B to Dashed
526
- dashedButtons = getAllByText(/Dashed/);
527
- _testUtils.fireEvent.click(dashedButtons[1]);
528
- expect(onChange.mock.calls[2][0].lineB.lineType).toBe('Dashed');
529
-
530
- // Switch to Solution Set
531
- var solutionSetRadio = radios.find(function (r) {
532
- return r.value === 'solutionSet';
533
- });
534
- _testUtils.fireEvent.click(solutionSetRadio);
535
- expect(onChange.mock.calls[3][0].selectedTool).toBe('solutionSet');
536
- expect(onChange).toHaveBeenCalledTimes(4);
537
- });
538
- });
539
- });
540
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdG9vbE1lbnUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJ0b29scyIsImJlZm9yZUVhY2giLCJqZXN0IiwiZm4iLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJjdXJyZW50VG9vbCIsImdzc0xpbmVEYXRhIiwic2VsZWN0ZWRUb29sIiwibnVtYmVyT2ZMaW5lcyIsImxpbmVBIiwibGluZVR5cGUiLCJsaW5lQiIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlckNvbXBvbmVudDMiLCJfcmVuZGVyQ29tcG9uZW50NCIsInF1ZXJ5QnlUZXh0Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsImdldEFsbEJ5VGV4dCIsInNvbGlkQnV0dG9ucyIsImRhc2hlZEJ1dHRvbnMiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyQ29tcG9uZW50NyIsIl9yZW5kZXJDb21wb25lbnQ4IiwiZGlzYWJsZWQiLCJnZXRBbGxCeVJvbGUiLCJyYWRpb3MiLCJidXR0b25zIiwicmFkaW8iLCJ0b0JlRGlzYWJsZWQiLCJidXR0b24iLCJfcmVuZGVyQ29tcG9uZW50OSIsImxpbmVBUmFkaW8iLCJmaW5kIiwidmFsdWUiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJCIsIl9zbGljZWRUb0FycmF5MiIsIm1vY2siLCJjYWxscyIsInVwZGF0ZWREYXRhIiwib2xkU2VsZWN0ZWRUb29sIiwidG9CZSIsIl9yZW5kZXJDb21wb25lbnQwIiwibGluZUJSYWRpbyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDIiLCJfcmVuZGVyQ29tcG9uZW50MSIsInNvbHV0aW9uU2V0UmFkaW8iLCJfb25DaGFuZ2UkbW9jayRjYWxscyQzIiwiX3JlbmRlckNvbXBvbmVudDEwIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNCIsIl9yZW5kZXJDb21wb25lbnQxMSIsIl9yZW5kZXJDb21wb25lbnQxMiIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDUiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ2IiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNyIsIl9yZW5kZXJDb21wb25lbnQxNSIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDgiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ5IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMCIsIl9yZW5kZXJDb21wb25lbnQxOCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDEiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMCIsIl9yZW5kZXJDb21wb25lbnQxOSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDExIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMTIiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMyIsIl9yZW5kZXJDb21wb25lbnQyMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdG9vbC1tZW51LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgVG9vbE1lbnUgZnJvbSAnLi4vdG9vbC1tZW51JztcblxuZGVzY3JpYmUoJ1Rvb2xNZW51JywgKCkgPT4ge1xuICBsZXQgb25DaGFuZ2U7XG4gIGNvbnN0IHRvb2xzID0gWydvbmUnLCAndHdvJ107XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgY3VycmVudFRvb2w6IHRvb2xzWzBdLFxuICAgICAgdG9vbHMsXG4gICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKDxUb29sTWVudSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEEgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBBJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEIgcmFkaW8gYnV0dG9uIHdoZW4gbnVtYmVyT2ZMaW5lcyBpcyAyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBCJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIExpbmUgQiByYWRpbyBidXR0b24gd2hlbiBudW1iZXJPZkxpbmVzIGlzIDEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAxLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdMaW5lIEInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2x1dGlvbiBTZXQgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnU29sdXRpb24gU2V0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2xpZCBhbmQgRGFzaGVkIGJ1dHRvbnMgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZXhwZWN0KHNvbGlkQnV0dG9ucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgIGV4cGVjdChkYXNoZWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3dzIGNoZWNrbWFyayBvbiBzZWxlY3RlZCBsaW5lIHR5cGUgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgv4pyUIFNvbGlkLyk7XG4gICAgICBleHBlY3Qoc29saWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGFsbCBjb250cm9scyB3aGVuIGRpc2FibGVkIHByb3AgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBnZXRBbGxCeVJvbGUoJ2J1dHRvbicpO1xuXG4gICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgZXhwZWN0KHJhZGlvKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBleHBlY3QoYnV0dG9uKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25DaGFuZ2VSYWRpb1ZhbHVlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIHVwZGF0ZWQgc2VsZWN0ZWRUb29sIHdoZW4gbGluZUEgcmFkaW8gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ3NvbHV0aW9uU2V0JyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQVJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluZUFSYWRpbyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBzZWxlY3RlZFRvb2wgd2hlbiBsaW5lQiByYWRpbyBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhsaW5lQlJhZGlvKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLnNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUInKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIHNlbGVjdGVkVG9vbCB3aGVuIHNvbHV0aW9uU2V0IHJhZGlvIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3Qgc29sdXRpb25TZXRSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnc29sdXRpb25TZXQnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbHV0aW9uU2V0UmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgICAgZXhwZWN0KG9sZFNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgb3RoZXIgZ3NzTGluZURhdGEgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIHNlbGVjdGVkVG9vbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3QgbGluZUJSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnbGluZUInKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBjb25zdCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubnVtYmVyT2ZMaW5lcykudG9CZSgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2hhbmdlIHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIC8vIERpc2FibGVkIHJhZGlvcyBzaG91bGQgbm90IGZpcmUgY2hhbmdlIGV2ZW50c1xuICAgICAgZXhwZWN0KGxpbmVCUmFkaW8pLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGluZVR5cGVDaGFuZ2UnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBBIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ0Rhc2hlZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIEZpcnN0IHNvbGlkIGJ1dHRvbiBzaG91bGQgYmUgZm9yIExpbmUgQVxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbGlkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnU29saWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIGxpbmVUeXBlIGZvciBMaW5lIEEgd2hlbiBEYXNoZWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICAvLyBGaXJzdCBkYXNoZWQgYnV0dG9uIHNob3VsZCBiZSBmb3IgTGluZSBBXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQicsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIFNlY29uZCBzb2xpZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhzb2xpZEJ1dHRvbnNbMV0pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gRGFzaGVkIGJ1dHRvbiBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUInLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgLy8gU2Vjb25kIGRhc2hlZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVCLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQSBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQiBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVCJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtdWx0aXBsZSBsaW5lIHR5cGUgY2hhbmdlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hhbmdlIExpbmUgQSB0byBEYXNoZWRcbiAgICAgIGxldCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzBdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBsZXQgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMV07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNhbGwgb25DaGFuZ2Ugd2hlbiBsaW5lIHR5cGUgYnV0dG9uIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBidXR0b25zID0gZ2V0QWxsQnlSb2xlKCdidXR0b24nKTtcblxuICAgICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgZXhwZWN0KGJ1dHRvbikudG9CZURpc2FibGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgY29ycmVjdCBzdGF0ZSB3aGVuIGNsaWNraW5nIHNhbWUgbGluZSB0eXBlIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb2xpZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL1NvbGlkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29saWRCdXR0b25zWzBdKTsgLy8gQ2xpY2sgU29saWQgd2hlbiBhbHJlYWR5IFNvbGlkXG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnYWxsb3dzIHN3aXRjaGluZyBzZWxlY3RlZCB0b29sIGFuZCBjaGFuZ2luZyBsaW5lIHR5cGUgaW4gc2VxdWVuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGxldCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG5cbiAgICAgIC8vIENoYW5nZSBMaW5lIEIgdG8gRGFzaGVkXG4gICAgICBjb25zdCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgICBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1sxXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBjb21wbGV0ZSB3b3JrZmxvdyBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBhbGwgdG9vbHMgYW5kIGNoYW5naW5nIGxpbmUgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBBIHRvIERhc2hlZFxuICAgICAgbGV0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGRhc2hlZEJ1dHRvbnNbMF0pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMF1bMF0ubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMV1bMF0uc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1syXVswXS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG5cbiAgICAgIC8vIFN3aXRjaCB0byBTb2x1dGlvbiBTZXRcbiAgICAgIGNvbnN0IHNvbHV0aW9uU2V0UmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ3NvbHV0aW9uU2V0Jyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29sdXRpb25TZXRSYWRpbyk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1szXVswXS5zZWxlY3RlZFRvb2wpLnRvQmUoJ3NvbHV0aW9uU2V0Jyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5n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