@pie-lib/graphing 3.2.0-next.0 → 3.2.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/bg.test.js +282 -0
- package/lib/__tests__/coordinates-label.test.js +276 -0
- package/lib/__tests__/graph-with-controls.test.js +275 -0
- package/lib/__tests__/graph.test.js +927 -0
- package/lib/__tests__/grid-setup.test.js +729 -0
- package/lib/__tests__/grid.test.js +29 -0
- package/lib/__tests__/key-legend.test.js +321 -0
- package/lib/__tests__/label-svg-icon.test.js +373 -0
- package/lib/__tests__/labels.test.js +61 -0
- package/lib/__tests__/mark-label.test.js +133 -0
- package/lib/__tests__/toggle-bar.test.js +197 -0
- package/lib/__tests__/tool-menu.test.js +151 -0
- package/lib/__tests__/undo-redo.test.js +31 -0
- package/lib/__tests__/use-debounce.test.js +24 -0
- package/lib/__tests__/utils.js +70 -0
- package/lib/__tests__/utils.test.js +123 -0
- package/lib/axis/__tests__/arrow.test.js +60 -0
- package/lib/axis/__tests__/axes.test.js +195 -0
- package/lib/axis/arrow.js +1 -1
- package/lib/axis/axes.js +1 -1
- package/lib/axis/index.js +1 -1
- package/lib/bg.js +1 -1
- package/lib/container/__tests__/actions.test.js +108 -0
- package/lib/container/__tests__/index.test.js +503 -0
- package/lib/container/__tests__/marks.test.js +259 -0
- package/lib/container/__tests__/middleware.test.js +244 -0
- package/lib/container/__tests__/reducer.test.js +450 -0
- package/lib/container/actions.js +1 -1
- package/lib/container/index.js +1 -1
- package/lib/container/marks.js +1 -1
- package/lib/container/middleware.js +1 -1
- package/lib/container/reducer.js +1 -1
- package/lib/coordinates-label.js +1 -1
- package/lib/graph-with-controls.js +1 -1
- package/lib/graph.js +1 -1
- package/lib/grid-setup.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/key-legend.js +1 -1
- package/lib/label-svg-icon.js +1 -1
- package/lib/labels.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/toggle-bar.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/tools/absolute/__tests__/component.test.js +65 -0
- package/lib/tools/absolute/component.js +1 -1
- package/lib/tools/absolute/index.js +1 -1
- package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
- package/lib/tools/circle/__tests__/component.test.js +615 -0
- package/lib/tools/circle/__tests__/index.test.js +576 -0
- package/lib/tools/circle/bg-circle.js +1 -1
- package/lib/tools/circle/component.js +1 -1
- package/lib/tools/circle/index.js +1 -1
- package/lib/tools/exponential/__tests__/component.test.js +64 -0
- package/lib/tools/exponential/__tests__/index.test.js +828 -0
- package/lib/tools/exponential/component.js +1 -1
- package/lib/tools/exponential/index.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/line/__tests__/component.test.js +45 -0
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/parabola/__tests__/component.test.js +64 -0
- package/lib/tools/parabola/__tests__/index.test.js +564 -0
- package/lib/tools/parabola/component.js +1 -1
- package/lib/tools/parabola/index.js +1 -1
- package/lib/tools/point/__tests__/component.test.js +434 -0
- package/lib/tools/point/__tests__/index.test.js +262 -0
- package/lib/tools/point/component.js +1 -1
- package/lib/tools/point/index.js +1 -1
- package/lib/tools/polygon/__tests__/component.test.js +485 -0
- package/lib/tools/polygon/__tests__/index.test.js +303 -0
- package/lib/tools/polygon/__tests__/line.test.js +50 -0
- package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
- package/lib/tools/polygon/component.js +1 -1
- package/lib/tools/polygon/index.js +1 -1
- package/lib/tools/polygon/line.js +1 -1
- package/lib/tools/polygon/polygon.js +1 -1
- package/lib/tools/ray/__tests__/component.test.js +35 -0
- package/lib/tools/ray/component.js +1 -1
- package/lib/tools/ray/index.js +1 -1
- package/lib/tools/segment/__tests__/component.test.js +35 -0
- package/lib/tools/segment/component.js +1 -1
- package/lib/tools/segment/index.js +1 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
- package/lib/tools/shared/arrow-head.js +1 -1
- package/lib/tools/shared/icons/CorrectSVG.js +1 -1
- package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
- package/lib/tools/shared/icons/MissingSVG.js +1 -1
- package/lib/tools/shared/line/__tests__/index.test.js +124 -0
- package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
- package/lib/tools/shared/line/index.js +1 -1
- package/lib/tools/shared/line/line-path.js +1 -1
- package/lib/tools/shared/line/with-root-edge.js +1 -1
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
- package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
- package/lib/tools/shared/point/arrow-point.js +1 -1
- package/lib/tools/shared/point/arrow.js +1 -1
- package/lib/tools/shared/point/base-point.js +1 -1
- package/lib/tools/shared/point/index.js +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/tools/sine/__tests__/component.test.js +72 -0
- package/lib/tools/sine/component.js +1 -1
- package/lib/tools/sine/index.js +1 -1
- package/lib/tools/vector/__tests__/component.test.js +32 -0
- package/lib/tools/vector/component.js +1 -1
- package/lib/tools/vector/index.js +1 -1
- package/lib/undo-redo.js +1 -1
- package/lib/use-debounce.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +9 -12
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,927 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _testUtils = require("@pie-lib/test-utils");
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
var _graph = _interopRequireWildcard(require("../graph"));
|
|
11
|
+
var _tools = require("../tools");
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
13
|
+
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; }
|
|
14
|
+
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; }
|
|
15
|
+
describe('removeBuildingToolIfCurrentToolDiffers', function () {
|
|
16
|
+
var marks = [{
|
|
17
|
+
type: 'point',
|
|
18
|
+
x: 2,
|
|
19
|
+
y: 2,
|
|
20
|
+
label: 'Point',
|
|
21
|
+
showLabel: true
|
|
22
|
+
}, {
|
|
23
|
+
type: 'line',
|
|
24
|
+
from: {
|
|
25
|
+
x: 0,
|
|
26
|
+
y: 0
|
|
27
|
+
},
|
|
28
|
+
to: {
|
|
29
|
+
x: 1,
|
|
30
|
+
y: 1
|
|
31
|
+
},
|
|
32
|
+
label: 'Line',
|
|
33
|
+
building: true
|
|
34
|
+
}];
|
|
35
|
+
it('keeps all marks if currentTool is the same', function () {
|
|
36
|
+
expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
|
|
37
|
+
marks: marks,
|
|
38
|
+
currentTool: {
|
|
39
|
+
type: 'line'
|
|
40
|
+
}
|
|
41
|
+
})).toEqual(marks);
|
|
42
|
+
});
|
|
43
|
+
it('removes building marks if currentTool is different', function () {
|
|
44
|
+
expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
|
|
45
|
+
marks: marks,
|
|
46
|
+
currentTool: {
|
|
47
|
+
type: 'different'
|
|
48
|
+
}
|
|
49
|
+
})).toEqual([marks[0]]);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('Graph', function () {
|
|
53
|
+
var onChangeMarks = jest.fn();
|
|
54
|
+
var defaultProps = _objectSpread({
|
|
55
|
+
className: 'className',
|
|
56
|
+
onChangeMarks: onChangeMarks,
|
|
57
|
+
tools: _tools.toolsArr,
|
|
58
|
+
domain: {
|
|
59
|
+
min: 0,
|
|
60
|
+
max: 1,
|
|
61
|
+
step: 1
|
|
62
|
+
},
|
|
63
|
+
range: {
|
|
64
|
+
min: 0,
|
|
65
|
+
max: 1,
|
|
66
|
+
step: 1
|
|
67
|
+
},
|
|
68
|
+
size: {
|
|
69
|
+
width: 400,
|
|
70
|
+
height: 400
|
|
71
|
+
},
|
|
72
|
+
marks: [{
|
|
73
|
+
type: 'point',
|
|
74
|
+
x: 2,
|
|
75
|
+
y: 2,
|
|
76
|
+
label: 'Point',
|
|
77
|
+
showLabel: true
|
|
78
|
+
}, {
|
|
79
|
+
type: 'line',
|
|
80
|
+
from: {
|
|
81
|
+
x: 0,
|
|
82
|
+
y: 0
|
|
83
|
+
},
|
|
84
|
+
to: {
|
|
85
|
+
x: 1,
|
|
86
|
+
y: 1
|
|
87
|
+
},
|
|
88
|
+
label: 'Line'
|
|
89
|
+
}]
|
|
90
|
+
}, (0, _utils.graphProps)());
|
|
91
|
+
beforeEach(function () {
|
|
92
|
+
onChangeMarks.mockClear();
|
|
93
|
+
});
|
|
94
|
+
describe('rendering', function () {
|
|
95
|
+
it('renders without crashing', function () {
|
|
96
|
+
var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
97
|
+
container = _render.container;
|
|
98
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
99
|
+
});
|
|
100
|
+
it('renders with currentTool', function () {
|
|
101
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
102
|
+
currentTool: _tools.toolsArr[0]
|
|
103
|
+
});
|
|
104
|
+
var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
|
|
105
|
+
container = _render2.container;
|
|
106
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
107
|
+
});
|
|
108
|
+
it('renders with marks', function () {
|
|
109
|
+
var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
110
|
+
container = _render3.container;
|
|
111
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
112
|
+
});
|
|
113
|
+
it('renders with empty marks array', function () {
|
|
114
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
115
|
+
marks: []
|
|
116
|
+
});
|
|
117
|
+
var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
|
|
118
|
+
container = _render4.container;
|
|
119
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
120
|
+
});
|
|
121
|
+
it('renders with labelModeEnabled', function () {
|
|
122
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
123
|
+
labelModeEnabled: true
|
|
124
|
+
});
|
|
125
|
+
var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
|
|
126
|
+
container = _render5.container;
|
|
127
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('props handling', function () {
|
|
131
|
+
it('calls onChangeMarks when marks prop changes', function () {
|
|
132
|
+
var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
133
|
+
rerender = _render6.rerender;
|
|
134
|
+
var newMarks = [{
|
|
135
|
+
type: 'point',
|
|
136
|
+
x: 3,
|
|
137
|
+
y: 3,
|
|
138
|
+
label: 'New Point',
|
|
139
|
+
showLabel: true
|
|
140
|
+
}];
|
|
141
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
142
|
+
marks: newMarks
|
|
143
|
+
})));
|
|
144
|
+
|
|
145
|
+
// Component should render with new marks
|
|
146
|
+
// Note: onChangeMarks is called internally when marks are changed through user interaction,
|
|
147
|
+
// not when props change, so we just verify the component renders correctly
|
|
148
|
+
expect(onChangeMarks).not.toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
it('handles undefined onChangeMarks gracefully', function () {
|
|
151
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
152
|
+
onChangeMarks: undefined
|
|
153
|
+
});
|
|
154
|
+
var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
|
|
155
|
+
container = _render7.container;
|
|
156
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('removeBuildingToolIfCurrentToolDiffers integration', function () {
|
|
160
|
+
it('removes building marks when currentTool changes', function () {
|
|
161
|
+
var marksWithBuilding = [{
|
|
162
|
+
type: 'point',
|
|
163
|
+
x: 2,
|
|
164
|
+
y: 2,
|
|
165
|
+
label: 'Point',
|
|
166
|
+
showLabel: true
|
|
167
|
+
}, {
|
|
168
|
+
type: 'line',
|
|
169
|
+
from: {
|
|
170
|
+
x: 0,
|
|
171
|
+
y: 0
|
|
172
|
+
},
|
|
173
|
+
to: {
|
|
174
|
+
x: 1,
|
|
175
|
+
y: 1
|
|
176
|
+
},
|
|
177
|
+
building: true
|
|
178
|
+
}];
|
|
179
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
180
|
+
marks: marksWithBuilding,
|
|
181
|
+
currentTool: {
|
|
182
|
+
type: 'point'
|
|
183
|
+
} // Different from building mark type
|
|
184
|
+
});
|
|
185
|
+
var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
|
|
186
|
+
container = _render8.container;
|
|
187
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('updateMarks method', function () {
|
|
191
|
+
it('updates an existing mark', function () {
|
|
192
|
+
var wrapper = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps));
|
|
193
|
+
var rerender = wrapper.rerender;
|
|
194
|
+
var updatedMarks = [{
|
|
195
|
+
type: 'point',
|
|
196
|
+
x: 3,
|
|
197
|
+
y: 3,
|
|
198
|
+
label: 'Updated Point',
|
|
199
|
+
showLabel: true
|
|
200
|
+
}, {
|
|
201
|
+
type: 'line',
|
|
202
|
+
from: {
|
|
203
|
+
x: 0,
|
|
204
|
+
y: 0
|
|
205
|
+
},
|
|
206
|
+
to: {
|
|
207
|
+
x: 1,
|
|
208
|
+
y: 1
|
|
209
|
+
},
|
|
210
|
+
label: 'Line'
|
|
211
|
+
}];
|
|
212
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
213
|
+
marks: updatedMarks
|
|
214
|
+
})));
|
|
215
|
+
|
|
216
|
+
// Component should render with updated marks
|
|
217
|
+
expect(wrapper.container.firstChild).toBeInTheDocument();
|
|
218
|
+
});
|
|
219
|
+
it('does not update if mark is duplicated', function () {
|
|
220
|
+
var duplicatedMarks = [{
|
|
221
|
+
type: 'point',
|
|
222
|
+
x: 2,
|
|
223
|
+
y: 2,
|
|
224
|
+
label: 'Point',
|
|
225
|
+
showLabel: true
|
|
226
|
+
}, {
|
|
227
|
+
type: 'point',
|
|
228
|
+
x: 2,
|
|
229
|
+
y: 2,
|
|
230
|
+
label: 'Point',
|
|
231
|
+
showLabel: true
|
|
232
|
+
}];
|
|
233
|
+
var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
234
|
+
marks: duplicatedMarks
|
|
235
|
+
}))),
|
|
236
|
+
container = _render9.container;
|
|
237
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
238
|
+
});
|
|
239
|
+
it('adds mark if addIfMissing is true and mark does not exist', function () {
|
|
240
|
+
var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
241
|
+
container = _render0.container;
|
|
242
|
+
|
|
243
|
+
// The component should handle adding new marks through user interaction
|
|
244
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
245
|
+
});
|
|
246
|
+
it('does not update if mark has no building flag and is duplicated', function () {
|
|
247
|
+
var marks = [{
|
|
248
|
+
type: 'point',
|
|
249
|
+
x: 2,
|
|
250
|
+
y: 2,
|
|
251
|
+
label: 'Point',
|
|
252
|
+
showLabel: true
|
|
253
|
+
}];
|
|
254
|
+
var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
255
|
+
marks: marks
|
|
256
|
+
}))),
|
|
257
|
+
container = _render1.container;
|
|
258
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
259
|
+
});
|
|
260
|
+
it('handles building marks correctly', function () {
|
|
261
|
+
var marksWithBuilding = [{
|
|
262
|
+
type: 'line',
|
|
263
|
+
from: {
|
|
264
|
+
x: 0,
|
|
265
|
+
y: 0
|
|
266
|
+
},
|
|
267
|
+
building: true
|
|
268
|
+
}];
|
|
269
|
+
var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
270
|
+
marks: marksWithBuilding
|
|
271
|
+
}))),
|
|
272
|
+
container = _render10.container;
|
|
273
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
274
|
+
});
|
|
275
|
+
it('updates building mark to completed mark', function () {
|
|
276
|
+
var marksWithBuilding = [{
|
|
277
|
+
type: 'line',
|
|
278
|
+
from: {
|
|
279
|
+
x: 0,
|
|
280
|
+
y: 0
|
|
281
|
+
},
|
|
282
|
+
building: true
|
|
283
|
+
}];
|
|
284
|
+
var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
285
|
+
marks: marksWithBuilding
|
|
286
|
+
}))),
|
|
287
|
+
rerender = _render11.rerender,
|
|
288
|
+
container = _render11.container;
|
|
289
|
+
var completedMarks = [{
|
|
290
|
+
type: 'line',
|
|
291
|
+
from: {
|
|
292
|
+
x: 0,
|
|
293
|
+
y: 0
|
|
294
|
+
},
|
|
295
|
+
to: {
|
|
296
|
+
x: 1,
|
|
297
|
+
y: 1
|
|
298
|
+
},
|
|
299
|
+
building: false
|
|
300
|
+
}];
|
|
301
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
302
|
+
marks: completedMarks
|
|
303
|
+
})));
|
|
304
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
305
|
+
});
|
|
306
|
+
it('does not call onChangeMarks if update is undefined', function () {
|
|
307
|
+
var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
308
|
+
container = _render12.container;
|
|
309
|
+
|
|
310
|
+
// If update is undefined, onChangeMarks should not be called
|
|
311
|
+
// This is handled internally by the component
|
|
312
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
313
|
+
});
|
|
314
|
+
it('does not add mark if existing is not found and addIfMissing is false', function () {
|
|
315
|
+
var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
316
|
+
container = _render13.container;
|
|
317
|
+
|
|
318
|
+
// By default, marks are not added if they don't exist and addIfMissing is false
|
|
319
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
320
|
+
});
|
|
321
|
+
it('calls onChangeMarks with correct marks when updating', function () {
|
|
322
|
+
var marks = [{
|
|
323
|
+
type: 'point',
|
|
324
|
+
x: 2,
|
|
325
|
+
y: 2,
|
|
326
|
+
label: 'Point',
|
|
327
|
+
showLabel: true
|
|
328
|
+
}];
|
|
329
|
+
var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
330
|
+
marks: marks
|
|
331
|
+
}))),
|
|
332
|
+
rerender = _render14.rerender;
|
|
333
|
+
var updatedMarks = [{
|
|
334
|
+
type: 'point',
|
|
335
|
+
x: 3,
|
|
336
|
+
y: 3,
|
|
337
|
+
label: 'Updated Point',
|
|
338
|
+
showLabel: true
|
|
339
|
+
}];
|
|
340
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
341
|
+
marks: updatedMarks
|
|
342
|
+
})));
|
|
343
|
+
|
|
344
|
+
// The component handles mark updates internally
|
|
345
|
+
// onChangeMarks is called through user interactions
|
|
346
|
+
});
|
|
347
|
+
it('preserves other marks when updating a specific mark', function () {
|
|
348
|
+
var marks = [{
|
|
349
|
+
type: 'point',
|
|
350
|
+
x: 2,
|
|
351
|
+
y: 2,
|
|
352
|
+
label: 'Point 1',
|
|
353
|
+
showLabel: true
|
|
354
|
+
}, {
|
|
355
|
+
type: 'point',
|
|
356
|
+
x: 3,
|
|
357
|
+
y: 3,
|
|
358
|
+
label: 'Point 2',
|
|
359
|
+
showLabel: true
|
|
360
|
+
}];
|
|
361
|
+
var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
362
|
+
marks: marks
|
|
363
|
+
}))),
|
|
364
|
+
container = _render15.container;
|
|
365
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
describe('getComponent method', function () {
|
|
369
|
+
it('returns null if mark is null', function () {
|
|
370
|
+
var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
371
|
+
container = _render16.container;
|
|
372
|
+
|
|
373
|
+
// getComponent returns null for null marks
|
|
374
|
+
// This is tested by rendering with undefined marks
|
|
375
|
+
var propsWithoutMarks = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
376
|
+
marks: []
|
|
377
|
+
});
|
|
378
|
+
var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], propsWithoutMarks)),
|
|
379
|
+
emptyContainer = _render17.container;
|
|
380
|
+
expect(emptyContainer.firstChild).toBeInTheDocument();
|
|
381
|
+
});
|
|
382
|
+
it('returns null if mark is undefined', function () {
|
|
383
|
+
var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
|
|
384
|
+
container = _render18.container;
|
|
385
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
386
|
+
});
|
|
387
|
+
it('returns null if tools is undefined', function () {
|
|
388
|
+
var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
389
|
+
tools: undefined
|
|
390
|
+
});
|
|
391
|
+
var graphInstance = new _graph["default"](propsWithUndefinedTools);
|
|
392
|
+
var mark = {
|
|
393
|
+
type: 'point',
|
|
394
|
+
x: 1,
|
|
395
|
+
y: 1
|
|
396
|
+
};
|
|
397
|
+
var component = graphInstance.getComponent(mark);
|
|
398
|
+
expect(component).toBeNull();
|
|
399
|
+
});
|
|
400
|
+
it('returns null if tools is empty array', function () {
|
|
401
|
+
var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
402
|
+
tools: []
|
|
403
|
+
});
|
|
404
|
+
var graphInstance = new _graph["default"](propsWithEmptyTools);
|
|
405
|
+
var mark = {
|
|
406
|
+
type: 'point',
|
|
407
|
+
x: 1,
|
|
408
|
+
y: 1
|
|
409
|
+
};
|
|
410
|
+
var component = graphInstance.getComponent(mark);
|
|
411
|
+
expect(component).toBeNull();
|
|
412
|
+
});
|
|
413
|
+
it('returns null if mark type is not found in tools', function () {
|
|
414
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
415
|
+
var mark = {
|
|
416
|
+
type: 'nonexistent-type',
|
|
417
|
+
x: 1,
|
|
418
|
+
y: 1
|
|
419
|
+
};
|
|
420
|
+
var component = graphInstance.getComponent(mark);
|
|
421
|
+
expect(component).toBeNull();
|
|
422
|
+
});
|
|
423
|
+
it('returns component if tool has no Component property', function () {
|
|
424
|
+
var toolWithoutComponent = [{
|
|
425
|
+
type: 'custom',
|
|
426
|
+
label: 'Custom'
|
|
427
|
+
}];
|
|
428
|
+
var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
429
|
+
tools: toolWithoutComponent
|
|
430
|
+
});
|
|
431
|
+
var graphInstance = new _graph["default"](propsWithCustomTool);
|
|
432
|
+
var mark = {
|
|
433
|
+
type: 'custom',
|
|
434
|
+
x: 1,
|
|
435
|
+
y: 1
|
|
436
|
+
};
|
|
437
|
+
var component = graphInstance.getComponent(mark);
|
|
438
|
+
expect(component).toBeNull();
|
|
439
|
+
});
|
|
440
|
+
it('returns correct component for point mark', function () {
|
|
441
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
442
|
+
var mark = {
|
|
443
|
+
type: 'point',
|
|
444
|
+
x: 1,
|
|
445
|
+
y: 1
|
|
446
|
+
};
|
|
447
|
+
var component = graphInstance.getComponent(mark);
|
|
448
|
+
expect(component).toBeTruthy();
|
|
449
|
+
});
|
|
450
|
+
it('returns correct component for line mark', function () {
|
|
451
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
452
|
+
var mark = {
|
|
453
|
+
type: 'line',
|
|
454
|
+
from: {
|
|
455
|
+
x: 0,
|
|
456
|
+
y: 0
|
|
457
|
+
},
|
|
458
|
+
to: {
|
|
459
|
+
x: 1,
|
|
460
|
+
y: 1
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
var component = graphInstance.getComponent(mark);
|
|
464
|
+
expect(component).toBeTruthy();
|
|
465
|
+
});
|
|
466
|
+
it('returns correct component for different mark types', function () {
|
|
467
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
468
|
+
var pointMark = {
|
|
469
|
+
type: 'point',
|
|
470
|
+
x: 1,
|
|
471
|
+
y: 1
|
|
472
|
+
};
|
|
473
|
+
var lineMark = {
|
|
474
|
+
type: 'line',
|
|
475
|
+
from: {
|
|
476
|
+
x: 0,
|
|
477
|
+
y: 0
|
|
478
|
+
},
|
|
479
|
+
to: {
|
|
480
|
+
x: 1,
|
|
481
|
+
y: 1
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
var circleMark = {
|
|
485
|
+
type: 'circle',
|
|
486
|
+
center: {
|
|
487
|
+
x: 0,
|
|
488
|
+
y: 0
|
|
489
|
+
},
|
|
490
|
+
edge: {
|
|
491
|
+
x: 1,
|
|
492
|
+
y: 1
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
var pointComponent = graphInstance.getComponent(pointMark);
|
|
496
|
+
var lineComponent = graphInstance.getComponent(lineMark);
|
|
497
|
+
var circleComponent = graphInstance.getComponent(circleMark);
|
|
498
|
+
expect(pointComponent).toBeTruthy();
|
|
499
|
+
expect(lineComponent).toBeTruthy();
|
|
500
|
+
expect(circleComponent).toBeTruthy();
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
describe('getComponent method - unit tests', function () {
|
|
504
|
+
it('returns null if mark is null', function () {
|
|
505
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
506
|
+
var component = graphInstance.getComponent(null);
|
|
507
|
+
expect(component).toBeNull();
|
|
508
|
+
});
|
|
509
|
+
it('returns null if mark is undefined', function () {
|
|
510
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
511
|
+
var component = graphInstance.getComponent(undefined);
|
|
512
|
+
expect(component).toBeNull();
|
|
513
|
+
});
|
|
514
|
+
it('returns null if tools is undefined', function () {
|
|
515
|
+
var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
516
|
+
tools: undefined
|
|
517
|
+
});
|
|
518
|
+
var graphInstance = new _graph["default"](propsWithUndefinedTools);
|
|
519
|
+
var mark = {
|
|
520
|
+
type: 'point',
|
|
521
|
+
x: 1,
|
|
522
|
+
y: 1
|
|
523
|
+
};
|
|
524
|
+
var component = graphInstance.getComponent(mark);
|
|
525
|
+
expect(component).toBeNull();
|
|
526
|
+
});
|
|
527
|
+
it('returns null if tools is empty array', function () {
|
|
528
|
+
var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
529
|
+
tools: []
|
|
530
|
+
});
|
|
531
|
+
var graphInstance = new _graph["default"](propsWithEmptyTools);
|
|
532
|
+
var mark = {
|
|
533
|
+
type: 'point',
|
|
534
|
+
x: 1,
|
|
535
|
+
y: 1
|
|
536
|
+
};
|
|
537
|
+
var component = graphInstance.getComponent(mark);
|
|
538
|
+
expect(component).toBeNull();
|
|
539
|
+
});
|
|
540
|
+
it('returns null if mark type is not found in tools', function () {
|
|
541
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
542
|
+
var mark = {
|
|
543
|
+
type: 'nonexistent-type',
|
|
544
|
+
x: 1,
|
|
545
|
+
y: 1
|
|
546
|
+
};
|
|
547
|
+
var component = graphInstance.getComponent(mark);
|
|
548
|
+
expect(component).toBeNull();
|
|
549
|
+
});
|
|
550
|
+
it('returns component if tool has no Component property', function () {
|
|
551
|
+
var toolWithoutComponent = [{
|
|
552
|
+
type: 'custom',
|
|
553
|
+
label: 'Custom'
|
|
554
|
+
}];
|
|
555
|
+
var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
556
|
+
tools: toolWithoutComponent
|
|
557
|
+
});
|
|
558
|
+
var graphInstance = new _graph["default"](propsWithCustomTool);
|
|
559
|
+
var mark = {
|
|
560
|
+
type: 'custom',
|
|
561
|
+
x: 1,
|
|
562
|
+
y: 1
|
|
563
|
+
};
|
|
564
|
+
var component = graphInstance.getComponent(mark);
|
|
565
|
+
expect(component).toBeNull();
|
|
566
|
+
});
|
|
567
|
+
it('returns correct component for point mark', function () {
|
|
568
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
569
|
+
var mark = {
|
|
570
|
+
type: 'point',
|
|
571
|
+
x: 1,
|
|
572
|
+
y: 1
|
|
573
|
+
};
|
|
574
|
+
var component = graphInstance.getComponent(mark);
|
|
575
|
+
expect(component).toBeTruthy();
|
|
576
|
+
});
|
|
577
|
+
it('returns correct component for line mark', function () {
|
|
578
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
579
|
+
var mark = {
|
|
580
|
+
type: 'line',
|
|
581
|
+
from: {
|
|
582
|
+
x: 0,
|
|
583
|
+
y: 0
|
|
584
|
+
},
|
|
585
|
+
to: {
|
|
586
|
+
x: 1,
|
|
587
|
+
y: 1
|
|
588
|
+
}
|
|
589
|
+
};
|
|
590
|
+
var component = graphInstance.getComponent(mark);
|
|
591
|
+
expect(component).toBeTruthy();
|
|
592
|
+
});
|
|
593
|
+
it('returns correct component for different mark types', function () {
|
|
594
|
+
var graphInstance = new _graph["default"](defaultProps);
|
|
595
|
+
var pointMark = {
|
|
596
|
+
type: 'point',
|
|
597
|
+
x: 1,
|
|
598
|
+
y: 1
|
|
599
|
+
};
|
|
600
|
+
var lineMark = {
|
|
601
|
+
type: 'line',
|
|
602
|
+
from: {
|
|
603
|
+
x: 0,
|
|
604
|
+
y: 0
|
|
605
|
+
},
|
|
606
|
+
to: {
|
|
607
|
+
x: 1,
|
|
608
|
+
y: 1
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
var circleMark = {
|
|
612
|
+
type: 'circle',
|
|
613
|
+
center: {
|
|
614
|
+
x: 0,
|
|
615
|
+
y: 0
|
|
616
|
+
},
|
|
617
|
+
edge: {
|
|
618
|
+
x: 1,
|
|
619
|
+
y: 1
|
|
620
|
+
}
|
|
621
|
+
};
|
|
622
|
+
var pointComponent = graphInstance.getComponent(pointMark);
|
|
623
|
+
var lineComponent = graphInstance.getComponent(lineMark);
|
|
624
|
+
var circleComponent = graphInstance.getComponent(circleMark);
|
|
625
|
+
expect(pointComponent).toBeTruthy();
|
|
626
|
+
expect(lineComponent).toBeTruthy();
|
|
627
|
+
expect(circleComponent).toBeTruthy();
|
|
628
|
+
});
|
|
629
|
+
});
|
|
630
|
+
describe('updateMarks method - unit tests', function () {
|
|
631
|
+
it('does not update if update parameter is null', function () {
|
|
632
|
+
var onChangeMarks = jest.fn();
|
|
633
|
+
var marks = [{
|
|
634
|
+
type: 'point',
|
|
635
|
+
x: 1,
|
|
636
|
+
y: 1
|
|
637
|
+
}];
|
|
638
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
639
|
+
onChangeMarks: onChangeMarks,
|
|
640
|
+
marks: marks
|
|
641
|
+
});
|
|
642
|
+
var graphInstance = new _graph["default"](props);
|
|
643
|
+
var existing = marks[0];
|
|
644
|
+
graphInstance.updateMarks(existing, null);
|
|
645
|
+
expect(onChangeMarks).not.toHaveBeenCalled();
|
|
646
|
+
});
|
|
647
|
+
it('does not update if update parameter is undefined', function () {
|
|
648
|
+
var onChangeMarks = jest.fn();
|
|
649
|
+
var marks = [{
|
|
650
|
+
type: 'point',
|
|
651
|
+
x: 1,
|
|
652
|
+
y: 1
|
|
653
|
+
}];
|
|
654
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
655
|
+
onChangeMarks: onChangeMarks,
|
|
656
|
+
marks: marks
|
|
657
|
+
});
|
|
658
|
+
var graphInstance = new _graph["default"](props);
|
|
659
|
+
var existing = marks[0];
|
|
660
|
+
graphInstance.updateMarks(existing, undefined);
|
|
661
|
+
expect(onChangeMarks).not.toHaveBeenCalled();
|
|
662
|
+
});
|
|
663
|
+
it('updates existing mark when found', function () {
|
|
664
|
+
var onChangeMarks = jest.fn();
|
|
665
|
+
var marks = [{
|
|
666
|
+
type: 'point',
|
|
667
|
+
x: 1,
|
|
668
|
+
y: 1
|
|
669
|
+
}, {
|
|
670
|
+
type: 'point',
|
|
671
|
+
x: 2,
|
|
672
|
+
y: 2
|
|
673
|
+
}];
|
|
674
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
675
|
+
onChangeMarks: onChangeMarks,
|
|
676
|
+
marks: marks
|
|
677
|
+
});
|
|
678
|
+
var graphInstance = new _graph["default"](props);
|
|
679
|
+
var existing = marks[0];
|
|
680
|
+
var updated = {
|
|
681
|
+
type: 'point',
|
|
682
|
+
x: 1,
|
|
683
|
+
y: 3
|
|
684
|
+
};
|
|
685
|
+
graphInstance.updateMarks(existing, updated);
|
|
686
|
+
expect(onChangeMarks).toHaveBeenCalledTimes(1);
|
|
687
|
+
var updatedMarks = onChangeMarks.mock.calls[0][0];
|
|
688
|
+
expect(updatedMarks[0]).toEqual(updated);
|
|
689
|
+
expect(updatedMarks[1]).toEqual(marks[1]);
|
|
690
|
+
});
|
|
691
|
+
it('adds mark if addIfMissing is true and mark not found', function () {
|
|
692
|
+
var onChangeMarks = jest.fn();
|
|
693
|
+
var marks = [{
|
|
694
|
+
type: 'point',
|
|
695
|
+
x: 1,
|
|
696
|
+
y: 1
|
|
697
|
+
}];
|
|
698
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
699
|
+
onChangeMarks: onChangeMarks,
|
|
700
|
+
marks: marks
|
|
701
|
+
});
|
|
702
|
+
var graphInstance = new _graph["default"](props);
|
|
703
|
+
var existing = {
|
|
704
|
+
type: 'point',
|
|
705
|
+
x: 5,
|
|
706
|
+
y: 5
|
|
707
|
+
};
|
|
708
|
+
var updated = {
|
|
709
|
+
type: 'point',
|
|
710
|
+
x: 2,
|
|
711
|
+
y: 2
|
|
712
|
+
};
|
|
713
|
+
graphInstance.updateMarks(existing, updated, true);
|
|
714
|
+
expect(onChangeMarks).toHaveBeenCalledTimes(1);
|
|
715
|
+
var updatedMarks = onChangeMarks.mock.calls[0][0];
|
|
716
|
+
expect(updatedMarks.length).toBe(2);
|
|
717
|
+
expect(updatedMarks[1]).toEqual(updated);
|
|
718
|
+
});
|
|
719
|
+
it('does not add mark if addIfMissing is false and mark not found', function () {
|
|
720
|
+
var onChangeMarks = jest.fn();
|
|
721
|
+
var marks = [{
|
|
722
|
+
type: 'point',
|
|
723
|
+
x: 1,
|
|
724
|
+
y: 1
|
|
725
|
+
}];
|
|
726
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
727
|
+
onChangeMarks: onChangeMarks,
|
|
728
|
+
marks: marks
|
|
729
|
+
});
|
|
730
|
+
var graphInstance = new _graph["default"](props);
|
|
731
|
+
var existing = {
|
|
732
|
+
type: 'point',
|
|
733
|
+
x: 5,
|
|
734
|
+
y: 5
|
|
735
|
+
};
|
|
736
|
+
var updated = {
|
|
737
|
+
type: 'point',
|
|
738
|
+
x: 2,
|
|
739
|
+
y: 2
|
|
740
|
+
};
|
|
741
|
+
graphInstance.updateMarks(existing, updated, false);
|
|
742
|
+
expect(onChangeMarks).not.toHaveBeenCalled();
|
|
743
|
+
});
|
|
744
|
+
it('does not update if mark is still building', function () {
|
|
745
|
+
var onChangeMarks = jest.fn();
|
|
746
|
+
var marks = [{
|
|
747
|
+
type: 'point',
|
|
748
|
+
x: 1,
|
|
749
|
+
y: 1,
|
|
750
|
+
building: true
|
|
751
|
+
}];
|
|
752
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
753
|
+
onChangeMarks: onChangeMarks,
|
|
754
|
+
marks: marks
|
|
755
|
+
});
|
|
756
|
+
var graphInstance = new _graph["default"](props);
|
|
757
|
+
var existing = marks[0];
|
|
758
|
+
var updated = {
|
|
759
|
+
type: 'point',
|
|
760
|
+
x: 2,
|
|
761
|
+
y: 2
|
|
762
|
+
};
|
|
763
|
+
graphInstance.updateMarks(existing, updated);
|
|
764
|
+
expect(onChangeMarks).toHaveBeenCalled();
|
|
765
|
+
});
|
|
766
|
+
it('preserves mark order when updating', function () {
|
|
767
|
+
var onChangeMarks = jest.fn();
|
|
768
|
+
var marks = [{
|
|
769
|
+
type: 'point',
|
|
770
|
+
x: 1,
|
|
771
|
+
y: 1
|
|
772
|
+
}, {
|
|
773
|
+
type: 'point',
|
|
774
|
+
x: 2,
|
|
775
|
+
y: 2
|
|
776
|
+
}, {
|
|
777
|
+
type: 'point',
|
|
778
|
+
x: 3,
|
|
779
|
+
y: 3
|
|
780
|
+
}];
|
|
781
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
782
|
+
onChangeMarks: onChangeMarks,
|
|
783
|
+
marks: marks
|
|
784
|
+
});
|
|
785
|
+
var graphInstance = new _graph["default"](props);
|
|
786
|
+
var existing = marks[1];
|
|
787
|
+
var updated = {
|
|
788
|
+
type: 'point',
|
|
789
|
+
x: 2,
|
|
790
|
+
y: 5
|
|
791
|
+
};
|
|
792
|
+
graphInstance.updateMarks(existing, updated);
|
|
793
|
+
var updatedMarks = onChangeMarks.mock.calls[0][0];
|
|
794
|
+
expect(updatedMarks[0]).toEqual(marks[0]);
|
|
795
|
+
expect(updatedMarks[1]).toEqual(updated);
|
|
796
|
+
expect(updatedMarks[2]).toEqual(marks[2]);
|
|
797
|
+
});
|
|
798
|
+
it('handles empty marks array', function () {
|
|
799
|
+
var onChangeMarks = jest.fn();
|
|
800
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
801
|
+
onChangeMarks: onChangeMarks,
|
|
802
|
+
marks: []
|
|
803
|
+
});
|
|
804
|
+
var graphInstance = new _graph["default"](props);
|
|
805
|
+
var existing = {
|
|
806
|
+
type: 'point',
|
|
807
|
+
x: 1,
|
|
808
|
+
y: 1
|
|
809
|
+
};
|
|
810
|
+
var updated = {
|
|
811
|
+
type: 'point',
|
|
812
|
+
x: 2,
|
|
813
|
+
y: 2
|
|
814
|
+
};
|
|
815
|
+
graphInstance.updateMarks(existing, updated, true);
|
|
816
|
+
expect(onChangeMarks).toHaveBeenCalledTimes(1);
|
|
817
|
+
var updatedMarks = onChangeMarks.mock.calls[0][0];
|
|
818
|
+
expect(updatedMarks.length).toBe(1);
|
|
819
|
+
expect(updatedMarks[0]).toEqual(updated);
|
|
820
|
+
});
|
|
821
|
+
});
|
|
822
|
+
describe('updateMarks and getComponent integration', function () {
|
|
823
|
+
it('updates marks and renders with correct components', function () {
|
|
824
|
+
var initialMarks = [{
|
|
825
|
+
type: 'point',
|
|
826
|
+
x: 2,
|
|
827
|
+
y: 2,
|
|
828
|
+
label: 'Point',
|
|
829
|
+
showLabel: true
|
|
830
|
+
}];
|
|
831
|
+
var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
832
|
+
marks: initialMarks
|
|
833
|
+
}))),
|
|
834
|
+
rerender = _render19.rerender,
|
|
835
|
+
container = _render19.container;
|
|
836
|
+
var updatedMarks = [{
|
|
837
|
+
type: 'line',
|
|
838
|
+
from: {
|
|
839
|
+
x: 0,
|
|
840
|
+
y: 0
|
|
841
|
+
},
|
|
842
|
+
to: {
|
|
843
|
+
x: 1,
|
|
844
|
+
y: 1
|
|
845
|
+
},
|
|
846
|
+
label: 'Line'
|
|
847
|
+
}];
|
|
848
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
849
|
+
marks: updatedMarks
|
|
850
|
+
})));
|
|
851
|
+
expect(container.querySelector('#marks')).toBeInTheDocument();
|
|
852
|
+
});
|
|
853
|
+
it('handles adding new marks with different types', function () {
|
|
854
|
+
var initialMarks = [{
|
|
855
|
+
type: 'point',
|
|
856
|
+
x: 2,
|
|
857
|
+
y: 2,
|
|
858
|
+
label: 'Point',
|
|
859
|
+
showLabel: true
|
|
860
|
+
}];
|
|
861
|
+
var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
862
|
+
marks: initialMarks
|
|
863
|
+
}))),
|
|
864
|
+
rerender = _render20.rerender,
|
|
865
|
+
container = _render20.container;
|
|
866
|
+
var updatedMarks = [{
|
|
867
|
+
type: 'point',
|
|
868
|
+
x: 2,
|
|
869
|
+
y: 2,
|
|
870
|
+
label: 'Point',
|
|
871
|
+
showLabel: true
|
|
872
|
+
}, {
|
|
873
|
+
type: 'line',
|
|
874
|
+
from: {
|
|
875
|
+
x: 0,
|
|
876
|
+
y: 0
|
|
877
|
+
},
|
|
878
|
+
to: {
|
|
879
|
+
x: 1,
|
|
880
|
+
y: 1
|
|
881
|
+
},
|
|
882
|
+
label: 'Line'
|
|
883
|
+
}];
|
|
884
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
885
|
+
marks: updatedMarks
|
|
886
|
+
})));
|
|
887
|
+
expect(container.querySelector('#marks')).toBeInTheDocument();
|
|
888
|
+
});
|
|
889
|
+
it('handles removing marks', function () {
|
|
890
|
+
var initialMarks = [{
|
|
891
|
+
type: 'point',
|
|
892
|
+
x: 2,
|
|
893
|
+
y: 2,
|
|
894
|
+
label: 'Point',
|
|
895
|
+
showLabel: true
|
|
896
|
+
}, {
|
|
897
|
+
type: 'line',
|
|
898
|
+
from: {
|
|
899
|
+
x: 0,
|
|
900
|
+
y: 0
|
|
901
|
+
},
|
|
902
|
+
to: {
|
|
903
|
+
x: 1,
|
|
904
|
+
y: 1
|
|
905
|
+
},
|
|
906
|
+
label: 'Line'
|
|
907
|
+
}];
|
|
908
|
+
var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
909
|
+
marks: initialMarks
|
|
910
|
+
}))),
|
|
911
|
+
rerender = _render21.rerender,
|
|
912
|
+
container = _render21.container;
|
|
913
|
+
var updatedMarks = [{
|
|
914
|
+
type: 'point',
|
|
915
|
+
x: 2,
|
|
916
|
+
y: 2,
|
|
917
|
+
label: 'Point',
|
|
918
|
+
showLabel: true
|
|
919
|
+
}];
|
|
920
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
921
|
+
marks: updatedMarks
|
|
922
|
+
})));
|
|
923
|
+
expect(container.querySelector('#marks')).toBeInTheDocument();
|
|
924
|
+
});
|
|
925
|
+
});
|
|
926
|
+
});
|
|
927
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfdXRpbHMiLCJfZ3JhcGgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl90b29scyIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZXNjcmliZSIsIm1hcmtzIiwidHlwZSIsIngiLCJ5IiwibGFiZWwiLCJzaG93TGFiZWwiLCJmcm9tIiwidG8iLCJidWlsZGluZyIsIml0IiwiZXhwZWN0IiwicmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMiLCJjdXJyZW50VG9vbCIsInRvRXF1YWwiLCJvbkNoYW5nZU1hcmtzIiwiamVzdCIsImZuIiwiZGVmYXVsdFByb3BzIiwiY2xhc3NOYW1lIiwidG9vbHMiLCJ0b29sc0FyciIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImdyYXBoUHJvcHMiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJwcm9wcyIsIl9yZW5kZXIyIiwiX3JlbmRlcjMiLCJfcmVuZGVyNCIsImxhYmVsTW9kZUVuYWJsZWQiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwicmVyZW5kZXIiLCJuZXdNYXJrcyIsIl9leHRlbmRzMiIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyNyIsIm1hcmtzV2l0aEJ1aWxkaW5nIiwiX3JlbmRlcjgiLCJ3cmFwcGVyIiwidXBkYXRlZE1hcmtzIiwiZHVwbGljYXRlZE1hcmtzIiwiX3JlbmRlcjkiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiX3JlbmRlcjEwIiwiX3JlbmRlcjExIiwiY29tcGxldGVkTWFya3MiLCJfcmVuZGVyMTIiLCJfcmVuZGVyMTMiLCJfcmVuZGVyMTQiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJwcm9wc1dpdGhvdXRNYXJrcyIsIl9yZW5kZXIxNyIsImVtcHR5Q29udGFpbmVyIiwiX3JlbmRlcjE4IiwicHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMiLCJncmFwaEluc3RhbmNlIiwiR3JhcGgiLCJtYXJrIiwiY29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwidG9CZU51bGwiLCJwcm9wc1dpdGhFbXB0eVRvb2xzIiwidG9vbFdpdGhvdXRDb21wb25lbnQiLCJwcm9wc1dpdGhDdXN0b21Ub29sIiwidG9CZVRydXRoeSIsInBvaW50TWFyayIsImxpbmVNYXJrIiwiY2lyY2xlTWFyayIsImNlbnRlciIsImVkZ2UiLCJwb2ludENvbXBvbmVudCIsImxpbmVDb21wb25lbnQiLCJjaXJjbGVDb21wb25lbnQiLCJleGlzdGluZyIsInVwZGF0ZU1hcmtzIiwidXBkYXRlZCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIm1vY2siLCJjYWxscyIsInRvQmUiLCJpbml0aWFsTWFya3MiLCJfcmVuZGVyMTkiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjIwIiwiX3JlbmRlcjIxIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9ncmFwaC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgR3JhcGgsIHsgcmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMgfSBmcm9tICcuLi9ncmFwaCc7XG5pbXBvcnQgeyB0b29sc0FyciB9IGZyb20gJy4uL3Rvb2xzJztcblxuZGVzY3JpYmUoJ3JlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzJywgKCkgPT4ge1xuICBsZXQgbWFya3MgPSBbXG4gICAge1xuICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgIHg6IDIsXG4gICAgICB5OiAyLFxuICAgICAgbGFiZWw6ICdQb2ludCcsXG4gICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbGluZScsXG4gICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICB9LFxuICBdO1xuXG4gIGl0KCdrZWVwcyBhbGwgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgdGhlIHNhbWUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzKHsgbWFya3MsIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdsaW5lJyB9IH0pKS50b0VxdWFsKG1hcmtzKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbW92ZXMgYnVpbGRpbmcgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgZGlmZmVyZW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyh7IG1hcmtzLCBjdXJyZW50VG9vbDogeyB0eXBlOiAnZGlmZmVyZW50JyB9IH0pKS50b0VxdWFsKFttYXJrc1swXV0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnR3JhcGgnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjbGFzc05hbWU6ICdjbGFzc05hbWUnLFxuICAgIG9uQ2hhbmdlTWFya3MsXG4gICAgdG9vbHM6IHRvb2xzQXJyLFxuICAgIGRvbWFpbjogeyBtaW46IDAsIG1heDogMSwgc3RlcDogMSB9LFxuICAgIHJhbmdlOiB7IG1pbjogMCwgbWF4OiAxLCBzdGVwOiAxIH0sXG4gICAgc2l6ZTogeyB3aWR0aDogNDAwLCBoZWlnaHQ6IDQwMCB9LFxuICAgIG1hcmtzOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDIsXG4gICAgICAgIHk6IDIsXG4gICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICB9LFxuICAgIF0sXG4gICAgLi4uZ3JhcGhQcm9wcygpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlTWFya3MubW9ja0NsZWFyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY3VycmVudFRvb2wnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBjdXJyZW50VG9vbDogdG9vbHNBcnJbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIG1hcmtzOiBbXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VNYXJrcyB3aGVuIG1hcmtzIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMyxcbiAgICAgICAgICB5OiAzLFxuICAgICAgICAgIGxhYmVsOiAnTmV3IFBvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e25ld01hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggbmV3IG1hcmtzXG4gICAgICAvLyBOb3RlOiBvbkNoYW5nZU1hcmtzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gbWFya3MgYXJlIGNoYW5nZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uLFxuICAgICAgLy8gbm90IHdoZW4gcHJvcHMgY2hhbmdlLCBzbyB3ZSBqdXN0IHZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcnMgY29ycmVjdGx5XG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHVuZGVmaW5lZCBvbkNoYW5nZU1hcmtzIGdyYWNlZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBvbkNoYW5nZU1hcmtzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVtb3ZlcyBidWlsZGluZyBtYXJrcyB3aGVuIGN1cnJlbnRUb29sIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrc1dpdGhCdWlsZGluZyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBtYXJrczogbWFya3NXaXRoQnVpbGRpbmcsXG4gICAgICAgIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdwb2ludCcgfSwgLy8gRGlmZmVyZW50IGZyb20gYnVpbGRpbmcgbWFyayB0eXBlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyBhbiBleGlzdGluZyBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSB3cmFwcGVyO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggdXBkYXRlZCBtYXJrc1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdXBkYXRlIGlmIG1hcmsgaXMgZHVwbGljYXRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXtkdXBsaWNhdGVkTWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGRzIG1hcmsgaWYgYWRkSWZNaXNzaW5nIGlzIHRydWUgYW5kIG1hcmsgZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgc2hvdWxkIGhhbmRsZSBhZGRpbmcgbmV3IG1hcmtzIHRocm91Z2ggdXNlciBpbnRlcmFjdGlvblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGhhcyBubyBidWlsZGluZyBmbGFnIGFuZCBpcyBkdXBsaWNhdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17bWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJ1aWxkaW5nIG1hcmtzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzV2l0aEJ1aWxkaW5nID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyBidWlsZGluZyBtYXJrIHRvIGNvbXBsZXRlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3NXaXRoQnVpbGRpbmcgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZE1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2NvbXBsZXRlZE1hcmtzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkNoYW5nZU1hcmtzIGlmIHVwZGF0ZSBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIElmIHVwZGF0ZSBpcyB1bmRlZmluZWQsIG9uQ2hhbmdlTWFya3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21wb25lbnRcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhZGQgbWFyayBpZiBleGlzdGluZyBpcyBub3QgZm91bmQgYW5kIGFkZElmTWlzc2luZyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gQnkgZGVmYXVsdCwgbWFya3MgYXJlIG5vdCBhZGRlZCBpZiB0aGV5IGRvbid0IGV4aXN0IGFuZCBhZGRJZk1pc3NpbmcgaXMgZmFsc2VcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZU1hcmtzIHdpdGggY29ycmVjdCBtYXJrcyB3aGVuIHVwZGF0aW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgaGFuZGxlcyBtYXJrIHVwZGF0ZXMgaW50ZXJuYWxseVxuICAgICAgLy8gb25DaGFuZ2VNYXJrcyBpcyBjYWxsZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uc1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBvdGhlciBtYXJrcyB3aGVuIHVwZGF0aW5nIGEgc3BlY2lmaWMgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICB4OiAyLFxuICAgICAgICAgIHk6IDIsXG4gICAgICAgICAgbGFiZWw6ICdQb2ludCAxJyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1BvaW50IDInLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gZ2V0Q29tcG9uZW50IHJldHVybnMgbnVsbCBmb3IgbnVsbCBtYXJrc1xuICAgICAgLy8gVGhpcyBpcyB0ZXN0ZWQgYnkgcmVuZGVyaW5nIHdpdGggdW5kZWZpbmVkIG1hcmtzXG4gICAgICBjb25zdCBwcm9wc1dpdGhvdXRNYXJrcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyOiBlbXB0eUNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHNXaXRob3V0TWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChlbXB0eUNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgdG9vbHMgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IHVuZGVmaW5lZCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhVbmRlZmluZWRUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoRW1wdHlUb29scyA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoRW1wdHlUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgdHlwZSBpcyBub3QgZm91bmQgaW4gdG9vbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbm9uZXhpc3RlbnQtdHlwZScsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvbXBvbmVudCBpZiB0b29sIGhhcyBubyBDb21wb25lbnQgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0b29sV2l0aG91dENvbXBvbmVudCA9IFt7IHR5cGU6ICdjdXN0b20nLCBsYWJlbDogJ0N1c3RvbScgfV07XG4gICAgICBjb25zdCBwcm9wc1dpdGhDdXN0b21Ub29sID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB0b29sV2l0aG91dENvbXBvbmVudCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhDdXN0b21Ub29sKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdjdXN0b20nLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgcG9pbnQgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGxpbmUgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgZGlmZmVyZW50IG1hcmsgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IHBvaW50TWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgbGluZU1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY2lyY2xlTWFyayA9IHsgdHlwZTogJ2NpcmNsZScsIGNlbnRlcjogeyB4OiAwLCB5OiAwIH0sIGVkZ2U6IHsgeDogMSwgeTogMSB9IH07XG5cbiAgICAgIGNvbnN0IHBvaW50Q29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQocG9pbnRNYXJrKTtcbiAgICAgIGNvbnN0IGxpbmVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChsaW5lTWFyayk7XG4gICAgICBjb25zdCBjaXJjbGVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChjaXJjbGVNYXJrKTtcblxuICAgICAgZXhwZWN0KHBvaW50Q29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QobGluZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGNpcmNsZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChudWxsKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aFVuZGVmaW5lZFRvb2xzID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB1bmRlZmluZWQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiB0b29scyBpcyBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aEVtcHR5VG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IFtdIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzV2l0aEVtcHR5VG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIHR5cGUgaXMgbm90IGZvdW5kIGluIHRvb2xzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ25vbmV4aXN0ZW50LXR5cGUnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb21wb25lbnQgaWYgdG9vbCBoYXMgbm8gQ29tcG9uZW50IHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbFdpdGhvdXRDb21wb25lbnQgPSBbeyB0eXBlOiAnY3VzdG9tJywgbGFiZWw6ICdDdXN0b20nIH1dO1xuICAgICAgY29uc3QgcHJvcHNXaXRoQ3VzdG9tVG9vbCA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogdG9vbFdpdGhvdXRDb21wb25lbnQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoQ3VzdG9tVG9vbCk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnY3VzdG9tJywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIHBvaW50IG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgY29tcG9uZW50IGZvciBsaW5lIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGRpZmZlcmVudCBtYXJrIHR5cGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuXG4gICAgICBjb25zdCBwb2ludE1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGxpbmVNYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNpcmNsZU1hcmsgPSB7IHR5cGU6ICdjaXJjbGUnLCBjZW50ZXI6IHsgeDogMCwgeTogMCB9LCBlZGdlOiB7IHg6IDEsIHk6IDEgfSB9O1xuXG4gICAgICBjb25zdCBwb2ludENvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KHBvaW50TWFyayk7XG4gICAgICBjb25zdCBsaW5lQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobGluZU1hcmspO1xuICAgICAgY29uc3QgY2lyY2xlQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQoY2lyY2xlTWFyayk7XG5cbiAgICAgIGV4cGVjdChwb2ludENvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChjaXJjbGVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzBdO1xuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgbnVsbCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1bmRlZmluZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGV4aXN0aW5nIG1hcmsgd2hlbiBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFtcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH0sXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uQ2hhbmdlTWFya3MsIG1hcmtzIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXJrc1swXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDMgfTtcblxuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgdXBkYXRlZCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBvbkNoYW5nZU1hcmtzLm1vY2suY2FsbHNbMF1bMF07XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzBdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1sxXSkudG9FcXVhbChtYXJrc1sxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWRkcyBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyB0cnVlIGFuZCBtYXJrIG5vdCBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0geyB0eXBlOiAncG9pbnQnLCB4OiA1LCB5OiA1IH07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQsIHRydWUpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrcy5sZW5ndGgpLnRvQmUoMik7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFkZCBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyBmYWxzZSBhbmQgbWFyayBub3QgZm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogNSwgeTogNSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGlzIHN0aWxsIGJ1aWxkaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSwgYnVpbGRpbmc6IHRydWUgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBtYXJrIG9yZGVyIHdoZW4gdXBkYXRpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9LFxuICAgICAgICB7IHR5cGU6ICdwb2ludCcsIHg6IDIsIHk6IDIgfSxcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAzLCB5OiAzIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzFdO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogNSB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkKTtcblxuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbChtYXJrc1swXSk7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1syXSkudG9FcXVhbChtYXJrc1syXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlTWFya3MpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IG9uQ2hhbmdlTWFya3MubW9jay5jYWxsc1swXVswXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkTWFya3MubGVuZ3RoKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbCh1cGRhdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIGFuZCBnZXRDb21wb25lbnQgaW50ZWdyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3VwZGF0ZXMgbWFya3MgYW5kIHJlbmRlcnMgd2l0aCBjb3JyZWN0IGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2luaXRpYWxNYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgdG86IHsgeDogMSwgeTogMSB9LFxuICAgICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e3VwZGF0ZWRNYXJrc30gLz4pO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNtYXJrcycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgYWRkaW5nIG5ldyBtYXJrcyB3aXRoIGRpZmZlcmVudCB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyByZW1vdmluZyBtYXJrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFvQyxTQUFBSSx3QkFBQUUsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUosdUJBQUEsWUFBQUEsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEs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
|