@pie-lib/charting 6.2.0-next.0 → 6.2.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/actions-button.test.js +332 -0
- package/lib/__tests__/axes.test.js +746 -0
- package/lib/__tests__/chart-setup.test.js +796 -0
- package/lib/__tests__/chart-type.test.js +25 -0
- package/lib/__tests__/chart.test.js +103 -0
- package/lib/__tests__/grid.test.js +39 -0
- package/lib/__tests__/key-legend.test.js +235 -0
- package/lib/__tests__/mark-label.test.js +46 -0
- package/lib/__tests__/tool-menu.test.js +627 -0
- package/lib/__tests__/utils.js +56 -0
- package/lib/__tests__/utils.test.js +186 -0
- package/lib/actions-button.js +1 -1
- package/lib/axes.js +1 -1
- package/lib/bars/__tests__/bar.test.js +53 -0
- package/lib/bars/__tests__/histogram.test.js +53 -0
- package/lib/bars/__tests__/utils.js +50 -0
- package/lib/bars/bar.js +1 -1
- package/lib/bars/common/__tests__/bars.test.js +76 -0
- package/lib/bars/common/__tests__/utils.js +50 -0
- package/lib/bars/common/bars.js +1 -1
- package/lib/bars/common/correct-check-icon.js +1 -1
- package/lib/bars/histogram.js +1 -1
- package/lib/chart-setup.js +1 -1
- package/lib/chart-type.js +1 -1
- package/lib/chart-types.js +1 -1
- package/lib/chart.js +1 -1
- package/lib/common/__tests__/correctness-indicators.test.js +887 -0
- package/lib/common/__tests__/drag-handle.test.js +73 -0
- package/lib/common/__tests__/utils.js +50 -0
- package/lib/common/correctness-indicators.js +1 -1
- package/lib/common/drag-handle.js +1 -1
- package/lib/common/drag-icon.js +1 -1
- package/lib/common/styles.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/key-legend.js +1 -1
- package/lib/line/__tests__/line-cross.test.js +617 -0
- package/lib/line/__tests__/line-dot.test.js +47 -0
- package/lib/line/__tests__/utils.js +56 -0
- package/lib/line/common/__tests__/drag-handle.test.js +73 -0
- package/lib/line/common/__tests__/line.test.js +92 -0
- package/lib/line/common/__tests__/utils.js +50 -0
- package/lib/line/common/drag-handle.js +1 -1
- package/lib/line/common/line.js +1 -1
- package/lib/line/line-cross.js +1 -1
- package/lib/line/line-dot.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/plot/__tests__/dot.test.js +513 -0
- package/lib/plot/__tests__/line.test.js +566 -0
- package/lib/plot/__tests__/utils.js +50 -0
- package/lib/plot/common/__tests__/plot.test.js +79 -0
- package/lib/plot/common/__tests__/utils.js +50 -0
- package/lib/plot/common/plot.js +1 -1
- package/lib/plot/dot.js +1 -1
- package/lib/plot/line.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +8 -11
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
6
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
7
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _testUtils = require("@pie-lib/test-utils");
|
|
10
|
+
var _styles = require("@mui/material/styles");
|
|
11
|
+
var _axes = _interopRequireWildcard(require("../axes"));
|
|
12
|
+
var _utils = require("./utils");
|
|
13
|
+
var _excluded = ["children"],
|
|
14
|
+
_excluded2 = ["children", "tickValues"];
|
|
15
|
+
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); }
|
|
16
|
+
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; }
|
|
17
|
+
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; }
|
|
18
|
+
jest.mock('@visx/axis', function () {
|
|
19
|
+
return {
|
|
20
|
+
AxisLeft: function AxisLeft(_ref) {
|
|
21
|
+
var children = _ref.children,
|
|
22
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
23
|
+
return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
|
|
24
|
+
"data-testid": "axis-left"
|
|
25
|
+
}, props), typeof children === 'function' ? children({
|
|
26
|
+
formattedValue: '5'
|
|
27
|
+
}) : children);
|
|
28
|
+
},
|
|
29
|
+
AxisBottom: function AxisBottom(_ref2) {
|
|
30
|
+
var children = _ref2.children,
|
|
31
|
+
tickValues = _ref2.tickValues,
|
|
32
|
+
props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
|
|
33
|
+
return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
|
|
34
|
+
"data-testid": "axis-bottom"
|
|
35
|
+
}, props), typeof children === 'function' ? (tickValues || ['0-A', '1-B', '2-C']).map(function (v, i) {
|
|
36
|
+
return children({
|
|
37
|
+
formattedValue: v,
|
|
38
|
+
index: i
|
|
39
|
+
});
|
|
40
|
+
}) : children);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
jest.mock('../mark-label', function () {
|
|
45
|
+
return function MarkLabel(_ref3) {
|
|
46
|
+
var mark = _ref3.mark,
|
|
47
|
+
disabled = _ref3.disabled,
|
|
48
|
+
_onChange = _ref3.onChange,
|
|
49
|
+
error = _ref3.error,
|
|
50
|
+
autoFocus = _ref3.autoFocus,
|
|
51
|
+
inputRef = _ref3.inputRef,
|
|
52
|
+
correctnessIndicator = _ref3.correctnessIndicator;
|
|
53
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
54
|
+
"data-testid": "mark-label"
|
|
55
|
+
}, /*#__PURE__*/_react["default"].createElement("input", {
|
|
56
|
+
"data-testid": "mark-label-input",
|
|
57
|
+
ref: inputRef,
|
|
58
|
+
value: (mark === null || mark === void 0 ? void 0 : mark.label) || '',
|
|
59
|
+
disabled: disabled,
|
|
60
|
+
onChange: function onChange(e) {
|
|
61
|
+
return _onChange && _onChange(e.target.value);
|
|
62
|
+
},
|
|
63
|
+
autoFocus: autoFocus
|
|
64
|
+
}), error && /*#__PURE__*/_react["default"].createElement("span", {
|
|
65
|
+
"data-testid": "mark-label-error"
|
|
66
|
+
}, error), correctnessIndicator);
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
jest.mock('@pie-lib/config-ui', function () {
|
|
70
|
+
return {
|
|
71
|
+
AlertDialog: function AlertDialog(_ref4) {
|
|
72
|
+
var open = _ref4.open,
|
|
73
|
+
title = _ref4.title,
|
|
74
|
+
text = _ref4.text,
|
|
75
|
+
onClose = _ref4.onClose,
|
|
76
|
+
onConfirm = _ref4.onConfirm;
|
|
77
|
+
return open ? /*#__PURE__*/_react["default"].createElement("div", {
|
|
78
|
+
"data-testid": "alert-dialog"
|
|
79
|
+
}, /*#__PURE__*/_react["default"].createElement("h2", null, title), /*#__PURE__*/_react["default"].createElement("p", null, text), /*#__PURE__*/_react["default"].createElement("button", {
|
|
80
|
+
"data-testid": "alert-cancel",
|
|
81
|
+
onClick: onClose
|
|
82
|
+
}, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
|
|
83
|
+
"data-testid": "alert-confirm",
|
|
84
|
+
onClick: onConfirm
|
|
85
|
+
}, "Confirm")) : null;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
jest.mock('../common/correctness-indicators', function () {
|
|
90
|
+
return {
|
|
91
|
+
TickCorrectnessIndicator: function TickCorrectnessIndicator(_ref5) {
|
|
92
|
+
var correctness = _ref5.correctness,
|
|
93
|
+
interactive = _ref5.interactive;
|
|
94
|
+
return correctness && interactive ? /*#__PURE__*/_react["default"].createElement("div", {
|
|
95
|
+
"data-testid": "tick-correctness-indicator"
|
|
96
|
+
}, correctness.value === 'correct' ? '✓' : '✗') : null;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
jest.mock('@pie-lib/math-rendering', function () {
|
|
101
|
+
return {
|
|
102
|
+
renderMath: jest.fn(function (text) {
|
|
103
|
+
return text;
|
|
104
|
+
})
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
var theme = (0, _styles.createTheme)();
|
|
108
|
+
describe('ChartAxes', function () {
|
|
109
|
+
var renderComponent = function renderComponent(extras) {
|
|
110
|
+
var defaults = {
|
|
111
|
+
classes: {},
|
|
112
|
+
className: 'className',
|
|
113
|
+
graphProps: (0, _utils.graphProps)(),
|
|
114
|
+
xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
|
|
115
|
+
categories: []
|
|
116
|
+
};
|
|
117
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
118
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
|
|
119
|
+
theme: theme
|
|
120
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes["default"], props))));
|
|
121
|
+
};
|
|
122
|
+
describe('rendering', function () {
|
|
123
|
+
it('renders axes container', function () {
|
|
124
|
+
var _renderComponent = renderComponent(),
|
|
125
|
+
container = _renderComponent.container;
|
|
126
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
127
|
+
});
|
|
128
|
+
it('renders SVG with axes group', function () {
|
|
129
|
+
var _renderComponent2 = renderComponent(),
|
|
130
|
+
container = _renderComponent2.container;
|
|
131
|
+
var svg = container.querySelector('svg');
|
|
132
|
+
expect(svg).toBeInTheDocument();
|
|
133
|
+
var axesGroup = container.querySelector('g');
|
|
134
|
+
expect(axesGroup).toBeInTheDocument();
|
|
135
|
+
});
|
|
136
|
+
it('renders axes elements', function () {
|
|
137
|
+
var _renderComponent3 = renderComponent(),
|
|
138
|
+
container = _renderComponent3.container;
|
|
139
|
+
var groups = container.querySelectorAll('g');
|
|
140
|
+
expect(groups.length).toBeGreaterThan(0);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('edge cases', function () {
|
|
144
|
+
it('handles missing xBand', function () {
|
|
145
|
+
var _renderComponent4 = renderComponent({
|
|
146
|
+
xBand: undefined
|
|
147
|
+
}),
|
|
148
|
+
container = _renderComponent4.container;
|
|
149
|
+
expect(container).toBeInTheDocument();
|
|
150
|
+
});
|
|
151
|
+
it('handles empty categories', function () {
|
|
152
|
+
var _renderComponent5 = renderComponent({
|
|
153
|
+
categories: []
|
|
154
|
+
}),
|
|
155
|
+
container = _renderComponent5.container;
|
|
156
|
+
expect(container).toBeInTheDocument();
|
|
157
|
+
});
|
|
158
|
+
it('handles null categories', function () {
|
|
159
|
+
var _renderComponent6 = renderComponent({
|
|
160
|
+
categories: null
|
|
161
|
+
}),
|
|
162
|
+
container = _renderComponent6.container;
|
|
163
|
+
expect(container).toBeInTheDocument();
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe('RawChartAxes', function () {
|
|
168
|
+
var renderComponent = function renderComponent(extras) {
|
|
169
|
+
var defaults = {
|
|
170
|
+
classes: {},
|
|
171
|
+
className: 'className',
|
|
172
|
+
graphProps: (0, _utils.graphProps)(),
|
|
173
|
+
xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
|
|
174
|
+
categories: []
|
|
175
|
+
};
|
|
176
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
177
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
|
|
178
|
+
theme: theme
|
|
179
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.RawChartAxes, props))));
|
|
180
|
+
};
|
|
181
|
+
describe('rendering', function () {
|
|
182
|
+
it('renders raw axes container', function () {
|
|
183
|
+
var _renderComponent7 = renderComponent(),
|
|
184
|
+
container = _renderComponent7.container;
|
|
185
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
186
|
+
});
|
|
187
|
+
it('renders SVG with axes group', function () {
|
|
188
|
+
var _renderComponent8 = renderComponent(),
|
|
189
|
+
container = _renderComponent8.container;
|
|
190
|
+
var svg = container.querySelector('svg');
|
|
191
|
+
expect(svg).toBeInTheDocument();
|
|
192
|
+
var axesGroup = container.querySelector('g');
|
|
193
|
+
expect(axesGroup).toBeInTheDocument();
|
|
194
|
+
});
|
|
195
|
+
it('renders both axes when leftAxis is true', function () {
|
|
196
|
+
var _renderComponent9 = renderComponent({
|
|
197
|
+
leftAxis: true
|
|
198
|
+
}),
|
|
199
|
+
getByTestId = _renderComponent9.getByTestId;
|
|
200
|
+
expect(getByTestId('axis-left')).toBeInTheDocument();
|
|
201
|
+
expect(getByTestId('axis-bottom')).toBeInTheDocument();
|
|
202
|
+
});
|
|
203
|
+
it('renders only bottom axis when leftAxis is false', function () {
|
|
204
|
+
var _renderComponent0 = renderComponent({
|
|
205
|
+
leftAxis: false
|
|
206
|
+
}),
|
|
207
|
+
queryByTestId = _renderComponent0.queryByTestId,
|
|
208
|
+
getByTestId = _renderComponent0.getByTestId;
|
|
209
|
+
expect(queryByTestId('axis-left')).not.toBeInTheDocument();
|
|
210
|
+
expect(getByTestId('axis-bottom')).toBeInTheDocument();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe('TickComponent', function () {
|
|
215
|
+
var defaultCategories = [{
|
|
216
|
+
value: 1,
|
|
217
|
+
label: 'Category A',
|
|
218
|
+
editable: true,
|
|
219
|
+
interactive: true
|
|
220
|
+
}, {
|
|
221
|
+
value: 2,
|
|
222
|
+
label: 'Category B',
|
|
223
|
+
editable: true,
|
|
224
|
+
interactive: true
|
|
225
|
+
}];
|
|
226
|
+
var renderComponent = function renderComponent(extras) {
|
|
227
|
+
var defaults = {
|
|
228
|
+
graphProps: (0, _utils.graphProps)(),
|
|
229
|
+
xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
|
|
230
|
+
categories: defaultCategories,
|
|
231
|
+
formattedValue: '0-Category A',
|
|
232
|
+
bandWidth: 100,
|
|
233
|
+
barWidth: 100,
|
|
234
|
+
x: 50,
|
|
235
|
+
y: 50,
|
|
236
|
+
top: 0,
|
|
237
|
+
onChangeCategory: jest.fn()
|
|
238
|
+
};
|
|
239
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
240
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
|
|
241
|
+
theme: theme
|
|
242
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, props))));
|
|
243
|
+
};
|
|
244
|
+
describe('rendering', function () {
|
|
245
|
+
it('renders tick component', function () {
|
|
246
|
+
var _renderComponent1 = renderComponent(),
|
|
247
|
+
container = _renderComponent1.container;
|
|
248
|
+
var svg = container.querySelector('svg');
|
|
249
|
+
expect(svg).toBeInTheDocument();
|
|
250
|
+
expect(container.querySelector('g')).toBeInTheDocument();
|
|
251
|
+
});
|
|
252
|
+
it('renders with categories', function () {
|
|
253
|
+
var _renderComponent10 = renderComponent({
|
|
254
|
+
formattedValue: '0-test',
|
|
255
|
+
categories: [{
|
|
256
|
+
value: 1,
|
|
257
|
+
label: 'test',
|
|
258
|
+
editable: false,
|
|
259
|
+
interactive: false
|
|
260
|
+
}]
|
|
261
|
+
}),
|
|
262
|
+
container = _renderComponent10.container;
|
|
263
|
+
var svg = container.querySelector('svg');
|
|
264
|
+
expect(svg).toBeInTheDocument();
|
|
265
|
+
expect(container.querySelector('g')).toBeInTheDocument();
|
|
266
|
+
});
|
|
267
|
+
it('renders MarkLabel component', function () {
|
|
268
|
+
var _renderComponent11 = renderComponent(),
|
|
269
|
+
getAllByTestId = _renderComponent11.getAllByTestId;
|
|
270
|
+
var markLabels = getAllByTestId('mark-label');
|
|
271
|
+
expect(markLabels.length).toBeGreaterThan(0);
|
|
272
|
+
});
|
|
273
|
+
it('renders foreignObject for labels', function () {
|
|
274
|
+
var _renderComponent12 = renderComponent(),
|
|
275
|
+
container = _renderComponent12.container;
|
|
276
|
+
var foreignObject = container.querySelector('foreignObject');
|
|
277
|
+
expect(foreignObject).toBeInTheDocument();
|
|
278
|
+
});
|
|
279
|
+
it('does not render when formattedValue is null', function () {
|
|
280
|
+
var _renderComponent13 = renderComponent({
|
|
281
|
+
formattedValue: null
|
|
282
|
+
}),
|
|
283
|
+
container = _renderComponent13.container;
|
|
284
|
+
var foreignObject = container.querySelector('foreignObject');
|
|
285
|
+
expect(foreignObject).not.toBeInTheDocument();
|
|
286
|
+
});
|
|
287
|
+
it('does not render when formattedValue is undefined', function () {
|
|
288
|
+
var _renderComponent14 = renderComponent({
|
|
289
|
+
formattedValue: undefined
|
|
290
|
+
}),
|
|
291
|
+
container = _renderComponent14.container;
|
|
292
|
+
var foreignObject = container.querySelector('foreignObject');
|
|
293
|
+
expect(foreignObject).not.toBeInTheDocument();
|
|
294
|
+
});
|
|
295
|
+
it('renders hidden label for longest category', function () {
|
|
296
|
+
var _renderComponent15 = renderComponent(),
|
|
297
|
+
getAllByTestId = _renderComponent15.getAllByTestId;
|
|
298
|
+
var markLabels = getAllByTestId('mark-label');
|
|
299
|
+
expect(markLabels.length).toBeGreaterThan(0);
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('category label editing', function () {
|
|
303
|
+
it('allows editing category label', function () {
|
|
304
|
+
var onChangeCategory = jest.fn();
|
|
305
|
+
var _renderComponent16 = renderComponent({
|
|
306
|
+
onChangeCategory: onChangeCategory
|
|
307
|
+
}),
|
|
308
|
+
getAllByTestId = _renderComponent16.getAllByTestId;
|
|
309
|
+
var inputs = getAllByTestId('mark-label-input');
|
|
310
|
+
var input = inputs[inputs.length - 1];
|
|
311
|
+
_testUtils.fireEvent.change(input, {
|
|
312
|
+
target: {
|
|
313
|
+
value: 'New Label'
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
expect(onChangeCategory).toHaveBeenCalled();
|
|
317
|
+
});
|
|
318
|
+
it('calls changeCategory with correct parameters', function () {
|
|
319
|
+
var onChangeCategory = jest.fn();
|
|
320
|
+
var _renderComponent17 = renderComponent({
|
|
321
|
+
onChangeCategory: onChangeCategory
|
|
322
|
+
}),
|
|
323
|
+
getAllByTestId = _renderComponent17.getAllByTestId;
|
|
324
|
+
var inputs = getAllByTestId('mark-label-input');
|
|
325
|
+
var input = inputs[inputs.length - 1];
|
|
326
|
+
_testUtils.fireEvent.change(input, {
|
|
327
|
+
target: {
|
|
328
|
+
value: 'Updated'
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
|
|
332
|
+
label: 'Updated'
|
|
333
|
+
}));
|
|
334
|
+
});
|
|
335
|
+
it('disables editing when editable is false', function () {
|
|
336
|
+
var categories = [{
|
|
337
|
+
value: 1,
|
|
338
|
+
label: 'test',
|
|
339
|
+
editable: false,
|
|
340
|
+
interactive: true
|
|
341
|
+
}];
|
|
342
|
+
var _renderComponent18 = renderComponent({
|
|
343
|
+
categories: categories,
|
|
344
|
+
formattedValue: '0-test'
|
|
345
|
+
}),
|
|
346
|
+
getAllByTestId = _renderComponent18.getAllByTestId;
|
|
347
|
+
var inputs = getAllByTestId('mark-label-input');
|
|
348
|
+
var input = inputs[inputs.length - 1];
|
|
349
|
+
expect(input).toBeDisabled();
|
|
350
|
+
});
|
|
351
|
+
it('enables editing in define chart mode', function () {
|
|
352
|
+
var categories = [{
|
|
353
|
+
value: 1,
|
|
354
|
+
label: 'test',
|
|
355
|
+
editable: true,
|
|
356
|
+
interactive: true
|
|
357
|
+
}];
|
|
358
|
+
var _renderComponent19 = renderComponent({
|
|
359
|
+
categories: categories,
|
|
360
|
+
formattedValue: '0-test',
|
|
361
|
+
defineChart: true
|
|
362
|
+
}),
|
|
363
|
+
getAllByTestId = _renderComponent19.getAllByTestId;
|
|
364
|
+
var inputs = getAllByTestId('mark-label-input');
|
|
365
|
+
var input = inputs[inputs.length - 1];
|
|
366
|
+
expect(input).not.toBeDisabled();
|
|
367
|
+
});
|
|
368
|
+
it('respects editable property when not in define chart mode', function () {
|
|
369
|
+
var categories = [{
|
|
370
|
+
value: 1,
|
|
371
|
+
label: 'test',
|
|
372
|
+
editable: true,
|
|
373
|
+
interactive: true
|
|
374
|
+
}];
|
|
375
|
+
var _renderComponent20 = renderComponent({
|
|
376
|
+
categories: categories,
|
|
377
|
+
formattedValue: '0-test',
|
|
378
|
+
defineChart: false
|
|
379
|
+
}),
|
|
380
|
+
getAllByTestId = _renderComponent20.getAllByTestId;
|
|
381
|
+
var inputs = getAllByTestId('mark-label-input');
|
|
382
|
+
var input = inputs[inputs.length - 1];
|
|
383
|
+
expect(input).not.toBeDisabled();
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
describe('interactive checkbox', function () {
|
|
387
|
+
it('shows warning when disabling interactive with correct answer', function () {
|
|
388
|
+
var categories = [{
|
|
389
|
+
value: 1,
|
|
390
|
+
label: 'test',
|
|
391
|
+
editable: true,
|
|
392
|
+
interactive: true,
|
|
393
|
+
correctness: {
|
|
394
|
+
value: 'correct'
|
|
395
|
+
}
|
|
396
|
+
}];
|
|
397
|
+
var component = new _axes.TickComponent({
|
|
398
|
+
categories: categories,
|
|
399
|
+
onChangeCategory: jest.fn()
|
|
400
|
+
});
|
|
401
|
+
component.setState = jest.fn();
|
|
402
|
+
component.changeInteractive(0, false);
|
|
403
|
+
expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
|
|
404
|
+
dialog: expect.objectContaining({
|
|
405
|
+
open: true,
|
|
406
|
+
title: 'Warning'
|
|
407
|
+
})
|
|
408
|
+
}));
|
|
409
|
+
});
|
|
410
|
+
it('changes interactive without warning when enabling', function () {
|
|
411
|
+
var onChangeCategory = jest.fn();
|
|
412
|
+
var categories = [{
|
|
413
|
+
value: 1,
|
|
414
|
+
label: 'test',
|
|
415
|
+
editable: true,
|
|
416
|
+
interactive: false
|
|
417
|
+
}];
|
|
418
|
+
var component = new _axes.TickComponent({
|
|
419
|
+
categories: categories,
|
|
420
|
+
onChangeCategory: onChangeCategory
|
|
421
|
+
});
|
|
422
|
+
component.changeInteractive(0, true);
|
|
423
|
+
expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
|
|
424
|
+
interactive: true
|
|
425
|
+
}));
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
describe('editable checkbox', function () {
|
|
429
|
+
it('shows warning when disabling editable with correct answer name', function () {
|
|
430
|
+
var categories = [{
|
|
431
|
+
value: 1,
|
|
432
|
+
label: 'test',
|
|
433
|
+
editable: true,
|
|
434
|
+
interactive: true,
|
|
435
|
+
correctness: {
|
|
436
|
+
value: 'correct'
|
|
437
|
+
}
|
|
438
|
+
}];
|
|
439
|
+
var component = new _axes.TickComponent({
|
|
440
|
+
categories: categories,
|
|
441
|
+
onChangeCategory: jest.fn()
|
|
442
|
+
});
|
|
443
|
+
component.setState = jest.fn();
|
|
444
|
+
component.changeEditable(0, false);
|
|
445
|
+
expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
|
|
446
|
+
dialog: expect.objectContaining({
|
|
447
|
+
open: true,
|
|
448
|
+
title: 'Warning'
|
|
449
|
+
})
|
|
450
|
+
}));
|
|
451
|
+
});
|
|
452
|
+
it('changes editable without warning when enabling', function () {
|
|
453
|
+
var onChangeCategory = jest.fn();
|
|
454
|
+
var categories = [{
|
|
455
|
+
value: 1,
|
|
456
|
+
label: 'test',
|
|
457
|
+
editable: false,
|
|
458
|
+
interactive: true
|
|
459
|
+
}];
|
|
460
|
+
var component = new _axes.TickComponent({
|
|
461
|
+
categories: categories,
|
|
462
|
+
onChangeCategory: onChangeCategory
|
|
463
|
+
});
|
|
464
|
+
component.changeEditable(0, true);
|
|
465
|
+
expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
|
|
466
|
+
editable: true
|
|
467
|
+
}));
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
describe('splitText method', function () {
|
|
471
|
+
it('splits text into chunks', function () {
|
|
472
|
+
var component = new _axes.TickComponent({
|
|
473
|
+
categories: []
|
|
474
|
+
});
|
|
475
|
+
var result = component.splitText('This is a long text', 10);
|
|
476
|
+
expect(result.length).toBeGreaterThan(1);
|
|
477
|
+
});
|
|
478
|
+
it('splits at word boundaries', function () {
|
|
479
|
+
var component = new _axes.TickComponent({
|
|
480
|
+
categories: []
|
|
481
|
+
});
|
|
482
|
+
var result = component.splitText('Hello world test', 11);
|
|
483
|
+
expect(result[0]).toBe('Hello world');
|
|
484
|
+
});
|
|
485
|
+
it('handles text shorter than max', function () {
|
|
486
|
+
var component = new _axes.TickComponent({
|
|
487
|
+
categories: []
|
|
488
|
+
});
|
|
489
|
+
var result = component.splitText('Short', 20);
|
|
490
|
+
expect(result).toEqual(['Short']);
|
|
491
|
+
});
|
|
492
|
+
it('handles empty text', function () {
|
|
493
|
+
var component = new _axes.TickComponent({
|
|
494
|
+
categories: []
|
|
495
|
+
});
|
|
496
|
+
var result = component.splitText('', 10);
|
|
497
|
+
expect(result).toEqual([]);
|
|
498
|
+
});
|
|
499
|
+
it('handles null text', function () {
|
|
500
|
+
var component = new _axes.TickComponent({
|
|
501
|
+
categories: []
|
|
502
|
+
});
|
|
503
|
+
var result = component.splitText(null, 10);
|
|
504
|
+
expect(result).toEqual([]);
|
|
505
|
+
});
|
|
506
|
+
it('forces split when no spaces', function () {
|
|
507
|
+
var component = new _axes.TickComponent({
|
|
508
|
+
categories: []
|
|
509
|
+
});
|
|
510
|
+
var result = component.splitText('verylongwordwithoutspaces', 10);
|
|
511
|
+
expect(result.length).toBeGreaterThan(1);
|
|
512
|
+
expect(result[0].length).toBeLessThanOrEqual(10);
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
describe('correctness display', function () {
|
|
516
|
+
it('renders correctness indicator when showCorrectness is true', function () {
|
|
517
|
+
var categories = [{
|
|
518
|
+
value: 1,
|
|
519
|
+
label: 'test',
|
|
520
|
+
editable: true,
|
|
521
|
+
interactive: true,
|
|
522
|
+
correctness: {
|
|
523
|
+
value: 'correct',
|
|
524
|
+
label: 'Correct!'
|
|
525
|
+
}
|
|
526
|
+
}];
|
|
527
|
+
var _renderComponent21 = renderComponent({
|
|
528
|
+
categories: categories,
|
|
529
|
+
formattedValue: '0-test',
|
|
530
|
+
showCorrectness: true
|
|
531
|
+
}),
|
|
532
|
+
getByTestId = _renderComponent21.getByTestId;
|
|
533
|
+
expect(getByTestId('tick-correctness-indicator')).toBeInTheDocument();
|
|
534
|
+
});
|
|
535
|
+
it('does not render correctness indicator when showCorrectness is false', function () {
|
|
536
|
+
var categories = [{
|
|
537
|
+
value: 1,
|
|
538
|
+
label: 'test',
|
|
539
|
+
editable: true,
|
|
540
|
+
interactive: true,
|
|
541
|
+
correctness: {
|
|
542
|
+
value: 'correct',
|
|
543
|
+
label: 'Correct!'
|
|
544
|
+
}
|
|
545
|
+
}];
|
|
546
|
+
var _renderComponent22 = renderComponent({
|
|
547
|
+
categories: categories,
|
|
548
|
+
formattedValue: '0-test',
|
|
549
|
+
showCorrectness: false
|
|
550
|
+
}),
|
|
551
|
+
queryByTestId = _renderComponent22.queryByTestId;
|
|
552
|
+
expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
|
|
553
|
+
});
|
|
554
|
+
it('does not render correctness indicator when not interactive', function () {
|
|
555
|
+
var categories = [{
|
|
556
|
+
value: 1,
|
|
557
|
+
label: 'test',
|
|
558
|
+
editable: true,
|
|
559
|
+
interactive: false,
|
|
560
|
+
correctness: {
|
|
561
|
+
value: 'correct',
|
|
562
|
+
label: 'Correct!'
|
|
563
|
+
}
|
|
564
|
+
}];
|
|
565
|
+
var _renderComponent23 = renderComponent({
|
|
566
|
+
categories: categories,
|
|
567
|
+
formattedValue: '0-test',
|
|
568
|
+
showCorrectness: true
|
|
569
|
+
}),
|
|
570
|
+
queryByTestId = _renderComponent23.queryByTestId;
|
|
571
|
+
expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
|
|
572
|
+
});
|
|
573
|
+
});
|
|
574
|
+
describe('error display', function () {
|
|
575
|
+
it('renders error message for first category', function () {
|
|
576
|
+
var error = {
|
|
577
|
+
0: 'Error message'
|
|
578
|
+
};
|
|
579
|
+
var _renderComponent24 = renderComponent({
|
|
580
|
+
error: error,
|
|
581
|
+
formattedValue: '0-test'
|
|
582
|
+
}),
|
|
583
|
+
getByTestId = _renderComponent24.getByTestId;
|
|
584
|
+
expect(getByTestId('mark-label-error')).toBeInTheDocument();
|
|
585
|
+
});
|
|
586
|
+
it('renders distinct error messages', function () {
|
|
587
|
+
var error = {
|
|
588
|
+
0: 'Error 1',
|
|
589
|
+
1: 'Error 1',
|
|
590
|
+
2: 'Error 2'
|
|
591
|
+
};
|
|
592
|
+
var _renderComponent25 = renderComponent({
|
|
593
|
+
error: error,
|
|
594
|
+
formattedValue: '0-test'
|
|
595
|
+
}),
|
|
596
|
+
container = _renderComponent25.container;
|
|
597
|
+
var errorText = container.querySelector('text');
|
|
598
|
+
expect(errorText).toBeInTheDocument();
|
|
599
|
+
});
|
|
600
|
+
it('does not render error when no error prop', function () {
|
|
601
|
+
var _renderComponent26 = renderComponent({
|
|
602
|
+
error: null
|
|
603
|
+
}),
|
|
604
|
+
queryByTestId = _renderComponent26.queryByTestId;
|
|
605
|
+
expect(queryByTestId('mark-label-error')).not.toBeInTheDocument();
|
|
606
|
+
});
|
|
607
|
+
});
|
|
608
|
+
describe('autoFocus handling', function () {
|
|
609
|
+
it('handles autoFocus prop', function () {
|
|
610
|
+
var onAutoFocusUsed = jest.fn();
|
|
611
|
+
var _renderComponent27 = renderComponent({
|
|
612
|
+
autoFocus: false,
|
|
613
|
+
onAutoFocusUsed: onAutoFocusUsed
|
|
614
|
+
}),
|
|
615
|
+
rerender = _renderComponent27.rerender;
|
|
616
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
|
|
617
|
+
theme: theme
|
|
618
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, {
|
|
619
|
+
graphProps: (0, _utils.graphProps)(),
|
|
620
|
+
xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
|
|
621
|
+
categories: defaultCategories,
|
|
622
|
+
formattedValue: '0-Category A',
|
|
623
|
+
bandWidth: 100,
|
|
624
|
+
barWidth: 100,
|
|
625
|
+
x: 50,
|
|
626
|
+
y: 50,
|
|
627
|
+
top: 0,
|
|
628
|
+
onChangeCategory: jest.fn(),
|
|
629
|
+
autoFocus: true,
|
|
630
|
+
onAutoFocusUsed: onAutoFocusUsed
|
|
631
|
+
}))));
|
|
632
|
+
expect(onAutoFocusUsed).toHaveBeenCalled();
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
describe('define chart mode', function () {
|
|
636
|
+
it('renders interactive checkboxes when changeInteractiveEnabled', function () {
|
|
637
|
+
var chartingOptions = {
|
|
638
|
+
changeInteractive: {
|
|
639
|
+
authoringLabel: 'Allow students to change'
|
|
640
|
+
}
|
|
641
|
+
};
|
|
642
|
+
var _renderComponent28 = renderComponent({
|
|
643
|
+
defineChart: true,
|
|
644
|
+
chartingOptions: chartingOptions,
|
|
645
|
+
changeInteractiveEnabled: true,
|
|
646
|
+
formattedValue: '0-test'
|
|
647
|
+
}),
|
|
648
|
+
container = _renderComponent28.container;
|
|
649
|
+
var text = container.querySelector('text');
|
|
650
|
+
expect(text).toBeInTheDocument();
|
|
651
|
+
});
|
|
652
|
+
it('renders editable checkboxes when changeEditableEnabled', function () {
|
|
653
|
+
var chartingOptions = {
|
|
654
|
+
changeEditable: {
|
|
655
|
+
authoringLabel: 'Allow label editing'
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
var _renderComponent29 = renderComponent({
|
|
659
|
+
defineChart: true,
|
|
660
|
+
chartingOptions: chartingOptions,
|
|
661
|
+
changeEditableEnabled: true,
|
|
662
|
+
formattedValue: '0-test'
|
|
663
|
+
}),
|
|
664
|
+
container = _renderComponent29.container;
|
|
665
|
+
var text = container.querySelector('text');
|
|
666
|
+
expect(text).toBeInTheDocument();
|
|
667
|
+
});
|
|
668
|
+
it('splits long authoring labels', function () {
|
|
669
|
+
var chartingOptions = {
|
|
670
|
+
changeInteractive: {
|
|
671
|
+
authoringLabel: 'This is a very long label that needs to be split'
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
var _renderComponent30 = renderComponent({
|
|
675
|
+
defineChart: true,
|
|
676
|
+
chartingOptions: chartingOptions,
|
|
677
|
+
changeInteractiveEnabled: true,
|
|
678
|
+
formattedValue: '0-test'
|
|
679
|
+
}),
|
|
680
|
+
container = _renderComponent30.container;
|
|
681
|
+
var tspans = container.querySelectorAll('tspan');
|
|
682
|
+
expect(tspans.length).toBeGreaterThan(1);
|
|
683
|
+
});
|
|
684
|
+
});
|
|
685
|
+
describe('edge cases', function () {
|
|
686
|
+
it('handles missing category', function () {
|
|
687
|
+
var _renderComponent31 = renderComponent({
|
|
688
|
+
categories: [],
|
|
689
|
+
formattedValue: '0-missing'
|
|
690
|
+
}),
|
|
691
|
+
container = _renderComponent31.container;
|
|
692
|
+
expect(container).toBeInTheDocument();
|
|
693
|
+
});
|
|
694
|
+
it('handles invalid formattedValue format', function () {
|
|
695
|
+
var _renderComponent32 = renderComponent({
|
|
696
|
+
formattedValue: 'invalid'
|
|
697
|
+
}),
|
|
698
|
+
container = _renderComponent32.container;
|
|
699
|
+
expect(container).toBeInTheDocument();
|
|
700
|
+
});
|
|
701
|
+
it('handles missing graphProps', function () {
|
|
702
|
+
var _renderComponent33 = renderComponent({
|
|
703
|
+
graphProps: null
|
|
704
|
+
}),
|
|
705
|
+
container = _renderComponent33.container;
|
|
706
|
+
expect(container).toBeInTheDocument();
|
|
707
|
+
});
|
|
708
|
+
it('handles zero barWidth', function () {
|
|
709
|
+
var _renderComponent34 = renderComponent({
|
|
710
|
+
barWidth: 0
|
|
711
|
+
}),
|
|
712
|
+
container = _renderComponent34.container;
|
|
713
|
+
expect(container).toBeInTheDocument();
|
|
714
|
+
});
|
|
715
|
+
it('handles negative coordinates', function () {
|
|
716
|
+
var _renderComponent35 = renderComponent({
|
|
717
|
+
x: -10,
|
|
718
|
+
y: -20
|
|
719
|
+
}),
|
|
720
|
+
container = _renderComponent35.container;
|
|
721
|
+
expect(container).toBeInTheDocument();
|
|
722
|
+
});
|
|
723
|
+
});
|
|
724
|
+
describe('componentDidUpdate', function () {
|
|
725
|
+
it('calls onAutoFocusUsed when autoFocus changes to true', function () {
|
|
726
|
+
var onAutoFocusUsed = jest.fn();
|
|
727
|
+
var component = new _axes.TickComponent({
|
|
728
|
+
autoFocus: false,
|
|
729
|
+
onAutoFocusUsed: onAutoFocusUsed
|
|
730
|
+
});
|
|
731
|
+
component.componentDidUpdate({
|
|
732
|
+
autoFocus: false
|
|
733
|
+
});
|
|
734
|
+
expect(onAutoFocusUsed).not.toHaveBeenCalled();
|
|
735
|
+
component.props = {
|
|
736
|
+
autoFocus: true,
|
|
737
|
+
onAutoFocusUsed: onAutoFocusUsed
|
|
738
|
+
};
|
|
739
|
+
component.componentDidUpdate({
|
|
740
|
+
autoFocus: false
|
|
741
|
+
});
|
|
742
|
+
expect(onAutoFocusUsed).toHaveBeenCalled();
|
|
743
|
+
});
|
|
744
|
+
});
|
|
745
|
+
});
|
|
746
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfc3R5bGVzIiwiX2F4ZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91dGlscyIsIl9leGNsdWRlZCIsIl9leGNsdWRlZDIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiamVzdCIsIm1vY2siLCJBeGlzTGVmdCIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJmb3JtYXR0ZWRWYWx1ZSIsIkF4aXNCb3R0b20iLCJfcmVmMiIsInRpY2tWYWx1ZXMiLCJtYXAiLCJ2IiwiaW5kZXgiLCJNYXJrTGFiZWwiLCJfcmVmMyIsIm1hcmsiLCJkaXNhYmxlZCIsIm9uQ2hhbmdlIiwiZXJyb3IiLCJhdXRvRm9jdXMiLCJpbnB1dFJlZiIsImNvcnJlY3RuZXNzSW5kaWNhdG9yIiwicmVmIiwidmFsdWUiLCJsYWJlbCIsInRhcmdldCIsIkFsZXJ0RGlhbG9nIiwiX3JlZjQiLCJvcGVuIiwidGl0bGUiLCJ0ZXh0Iiwib25DbG9zZSIsIm9uQ29uZmlybSIsIm9uQ2xpY2siLCJUaWNrQ29ycmVjdG5lc3NJbmRpY2F0b3IiLCJfcmVmNSIsImNvcnJlY3RuZXNzIiwiaW50ZXJhY3RpdmUiLCJyZW5kZXJNYXRoIiwiZm4iLCJ0aGVtZSIsImNyZWF0ZVRoZW1lIiwiZGVzY3JpYmUiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJncmFwaFByb3BzIiwieEJhbmQiLCJjcmVhdGVCYW5kU2NhbGUiLCJjYXRlZ29yaWVzIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwic3ZnIiwicXVlcnlTZWxlY3RvciIsImF4ZXNHcm91cCIsIl9yZW5kZXJDb21wb25lbnQzIiwiZ3JvdXBzIiwicXVlcnlTZWxlY3RvckFsbCIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXJDb21wb25lbnQ0IiwidW5kZWZpbmVkIiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsIlJhd0NoYXJ0QXhlcyIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJfcmVuZGVyQ29tcG9uZW50OSIsImxlZnRBeGlzIiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyQ29tcG9uZW50MCIsInF1ZXJ5QnlUZXN0SWQiLCJub3QiLCJkZWZhdWx0Q2F0ZWdvcmllcyIsImVkaXRhYmxlIiwiYmFuZFdpZHRoIiwiYmFyV2lkdGgiLCJ4IiwieSIsInRvcCIsIm9uQ2hhbmdlQ2F0ZWdvcnkiLCJUaWNrQ29tcG9uZW50IiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJnZXRBbGxCeVRlc3RJZCIsIm1hcmtMYWJlbHMiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJmb3JlaWduT2JqZWN0IiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwiX3JlbmRlckNvbXBvbmVudDE2IiwiaW5wdXRzIiwiaW5wdXQiLCJmaXJlRXZlbnQiLCJjaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlckNvbXBvbmVudDE3IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwiX3JlbmRlckNvbXBvbmVudDE4IiwidG9CZURpc2FibGVkIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiZGVmaW5lQ2hhcnQiLCJfcmVuZGVyQ29tcG9uZW50MjAiLCJjb21wb25lbnQiLCJzZXRTdGF0ZSIsImNoYW5nZUludGVyYWN0aXZlIiwiZGlhbG9nIiwiY2hhbmdlRWRpdGFibGUiLCJyZXN1bHQiLCJzcGxpdFRleHQiLCJ0b0JlIiwidG9FcXVhbCIsInRvQmVMZXNzVGhhbk9yRXF1YWwiLCJfcmVuZGVyQ29tcG9uZW50MjEiLCJzaG93Q29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJfcmVuZGVyQ29tcG9uZW50MjMiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJlcnJvclRleHQiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJvbkF1dG9Gb2N1c1VzZWQiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJyZXJlbmRlciIsImNoYXJ0aW5nT3B0aW9ucyIsImF1dGhvcmluZ0xhYmVsIiwiX3JlbmRlckNvbXBvbmVudDI4IiwiY2hhbmdlSW50ZXJhY3RpdmVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDI5IiwiY2hhbmdlRWRpdGFibGVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDMwIiwidHNwYW5zIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiX3JlbmRlckNvbXBvbmVudDMyIiwiX3JlbmRlckNvbXBvbmVudDMzIiwiX3JlbmRlckNvbXBvbmVudDM0IiwiX3JlbmRlckNvbXBvbmVudDM1IiwiY29tcG9uZW50RGlkVXBkYXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9heGVzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJlRXZlbnQsIHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVGhlbWUsIFRoZW1lUHJvdmlkZXIgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgQ2hhcnRBeGVzLCB7IFJhd0NoYXJ0QXhlcywgVGlja0NvbXBvbmVudCB9IGZyb20gJy4uL2F4ZXMnO1xuaW1wb3J0IHsgY3JlYXRlQmFuZFNjYWxlLCBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmplc3QubW9jaygnQHZpc3gvYXhpcycsICgpID0+ICh7XG4gIEF4aXNMZWZ0OiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfSkgPT4gKFxuICAgIDxnIGRhdGEtdGVzdGlkPVwiYXhpcy1sZWZ0XCIgey4uLnByb3BzfT5cbiAgICAgIHt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbih7IGZvcm1hdHRlZFZhbHVlOiAnNScgfSkgOiBjaGlsZHJlbn1cbiAgICA8L2c+XG4gICksXG4gIEF4aXNCb3R0b206ICh7IGNoaWxkcmVuLCB0aWNrVmFsdWVzLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGcgZGF0YS10ZXN0aWQ9XCJheGlzLWJvdHRvbVwiIHsuLi5wcm9wc30+XG4gICAgICB7dHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHRpY2tWYWx1ZXMgfHwgWycwLUEnLCAnMS1CJywgJzItQyddKS5tYXAoKHYsIGkpID0+IGNoaWxkcmVuKHsgZm9ybWF0dGVkVmFsdWU6IHYsIGluZGV4OiBpIH0pKVxuICAgICAgICA6IGNoaWxkcmVufVxuICAgIDwvZz5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9tYXJrLWxhYmVsJywgKCkgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gTWFya0xhYmVsKHsgbWFyaywgZGlzYWJsZWQsIG9uQ2hhbmdlLCBlcnJvciwgYXV0b0ZvY3VzLCBpbnB1dFJlZiwgY29ycmVjdG5lc3NJbmRpY2F0b3IgfSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1hcmstbGFiZWwtaW5wdXRcIlxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgdmFsdWU9e21hcms/LmxhYmVsIHx8ICcnfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlICYmIG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cbiAgICAgICAgLz5cbiAgICAgICAge2Vycm9yICYmIDxzcGFuIGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbC1lcnJvclwiPntlcnJvcn08L3NwYW4+fVxuICAgICAgICB7Y29ycmVjdG5lc3NJbmRpY2F0b3J9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgQWxlcnREaWFsb2c6ICh7IG9wZW4sIHRpdGxlLCB0ZXh0LCBvbkNsb3NlLCBvbkNvbmZpcm0gfSkgPT5cbiAgICBvcGVuID8gKFxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAgICA8aDI+e3RpdGxlfTwvaDI+XG4gICAgICAgIDxwPnt0ZXh0fTwvcD5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNhbmNlbFwiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNvbmZpcm1cIiBvbkNsaWNrPXtvbkNvbmZpcm19PlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApIDogbnVsbCxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9jb21tb24vY29ycmVjdG5lc3MtaW5kaWNhdG9ycycsICgpID0+ICh7XG4gIFRpY2tDb3JyZWN0bmVzc0luZGljYXRvcjogKHsgY29ycmVjdG5lc3MsIGludGVyYWN0aXZlIH0pID0+XG4gICAgY29ycmVjdG5lc3MgJiYgaW50ZXJhY3RpdmUgPyAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidGljay1jb3JyZWN0bmVzcy1pbmRpY2F0b3JcIj57Y29ycmVjdG5lc3MudmFsdWUgPT09ICdjb3JyZWN0JyA/ICfinJMnIDogJ+Kclyd9PC9kaXY+XG4gICAgKSA6IG51bGwsXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICByZW5kZXJNYXRoOiBqZXN0LmZuKCh0ZXh0KSA9PiB0ZXh0KSxcbn0pKTtcblxuY29uc3QgdGhlbWUgPSBjcmVhdGVUaGVtZSgpO1xuXG5kZXNjcmliZSgnQ2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGF4ZXMgY29udGFpbmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgU1ZHIHdpdGggYXhlcyBncm91cCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBjb25zdCBheGVzR3JvdXAgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGF4ZXNHcm91cCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGF4ZXMgZWxlbWVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBncm91cHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnZycpO1xuICAgICAgZXhwZWN0KGdyb3Vwcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyB4QmFuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4QmFuZDogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IGNhdGVnb3JpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbnVsbCBjYXRlZ29yaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNhdGVnb3JpZXM6IG51bGwgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnUmF3Q2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxSYXdDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHJhdyBheGVzIGNvbnRhaW5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIFNWRyB3aXRoIGF4ZXMgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBzdmcgPSBjb250YWluZXIucXVlcnlTZWxlY3Rvcignc3ZnJyk7XG4gICAgICBleHBlY3Qoc3ZnKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgY29uc3QgYXhlc0dyb3VwID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChheGVzR3JvdXApLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBib3RoIGF4ZXMgd2hlbiBsZWZ0QXhpcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IHRydWUgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdheGlzLWJvdHRvbScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgb25seSBib3R0b20gYXhpcyB3aGVuIGxlZnRBeGlzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnYXhpcy1ib3R0b20nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RpY2tDb21wb25lbnQnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRDYXRlZ29yaWVzID0gW1xuICAgIHsgdmFsdWU6IDEsIGxhYmVsOiAnQ2F0ZWdvcnkgQScsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQ2F0ZWdvcnkgQicsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIHhCYW5kOiBjcmVhdGVCYW5kU2NhbGUoWydhJywgJ2InLCAnYyddLCBbMCwgNDAwXSksXG4gICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC1DYXRlZ29yeSBBJyxcbiAgICAgIGJhbmRXaWR0aDogMTAwLFxuICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgIHg6IDUwLFxuICAgICAgeTogNTAsXG4gICAgICB0b3A6IDAsXG4gICAgICBvbkNoYW5nZUNhdGVnb3J5OiBqZXN0LmZuKCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxUaWNrQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB0aWNrIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY2F0ZWdvcmllcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGNhdGVnb3JpZXM6IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiBmYWxzZSB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgZXhwZWN0KHN2ZykudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgTWFya0xhYmVsIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgY29uc3QgbWFya0xhYmVscyA9IGdldEFsbEJ5VGVzdElkKCdtYXJrLWxhYmVsJyk7XG4gICAgICBleHBlY3QobWFya0xhYmVscy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGZvcmVpZ25PYmplY3QgZm9yIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gZm9ybWF0dGVkVmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogbnVsbCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciB3aGVuIGZvcm1hdHRlZFZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBoaWRkZW4gbGFiZWwgZm9yIGxvbmdlc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IG1hcmtMYWJlbHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbCcpO1xuICAgICAgZXhwZWN0KG1hcmtMYWJlbHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYXRlZ29yeSBsYWJlbCBlZGl0aW5nJywgKCkgPT4ge1xuICAgIGl0KCdhbGxvd3MgZWRpdGluZyBjYXRlZ29yeSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlQ2F0ZWdvcnkgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoeyBvbkNoYW5nZUNhdGVnb3J5IH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdOZXcgTGFiZWwnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZUNhdGVnb3J5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgY2hhbmdlQ2F0ZWdvcnkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DaGFuZ2VDYXRlZ29yeSB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnVXBkYXRlZCcgfSB9KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgbGFiZWw6ICdVcGRhdGVkJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgZWRpdGluZyB3aGVuIGVkaXRhYmxlIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllcywgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0JlRGlzYWJsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmFibGVzIGVkaXRpbmcgaW4gZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAndGVzdCcsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9XTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgZGVmaW5lQ2hhcnQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGV4cGVjdChpbnB1dCkubm90LnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Jlc3BlY3RzIGVkaXRhYmxlIHByb3BlcnR5IHdoZW4gbm90IGluIGRlZmluZSBjaGFydCBtb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IHRydWUgfV07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGRlZmluZUNoYXJ0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS5ub3QudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlcmFjdGl2ZSBjaGVja2JveCcsICgpID0+IHtcbiAgICBpdCgnc2hvd3Mgd2FybmluZyB3aGVuIGRpc2FibGluZyBpbnRlcmFjdGl2ZSB3aXRoIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgaW50ZXJhY3RpdmUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IGZhbHNlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaW50ZXJhY3RpdmU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRpdGFibGUgY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3dzIHdhcm5pbmcgd2hlbiBkaXNhYmxpbmcgZWRpdGFibGUgd2l0aCBjb3JyZWN0IGFuc3dlciBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgZWRpdGFibGUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgZWRpdGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3BsaXRUZXh0IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgnc3BsaXRzIHRleHQgaW50byBjaHVua3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnVGhpcyBpcyBhIGxvbmcgdGV4dCcsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzcGxpdHMgYXQgd29yZCBib3VuZGFyaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ0hlbGxvIHdvcmxkIHRlc3QnLCAxMSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ0hlbGxvIHdvcmxkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB0ZXh0IHNob3J0ZXIgdGhhbiBtYXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnU2hvcnQnLCAyMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWydTaG9ydCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IHRleHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnJywgMTApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG51bGwgdGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wb25lbnQuc3BsaXRUZXh0KG51bGwsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yY2VzIHNwbGl0IHdoZW4gbm8gc3BhY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ3Zlcnlsb25nd29yZHdpdGhvdXRzcGFjZXMnLCAxMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgICBleHBlY3QocmVzdWx0WzBdLmxlbmd0aCkudG9CZUxlc3NUaGFuT3JFcXVhbCgxMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0bmVzcyBkaXNwbGF5JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICBsYWJlbDogJ3Rlc3QnLFxuICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCEnIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBjb3JyZWN0bmVzcyBpbmRpY2F0b3Igd2hlbiBub3QgaW50ZXJhY3RpdmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgbGFiZWw6ICd0ZXN0JyxcbiAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgc2hvd0NvcnJlY3RuZXNzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCd0aWNrLWNvcnJlY3RuZXNzLWluZGljYXRvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIGRpc3BsYXknLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZXJyb3IgbWVzc2FnZSBmb3IgZmlyc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIG1lc3NhZ2UnIH07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBlcnJvcixcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZGlzdGluY3QgZXJyb3IgbWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIDEnLCAxOiAnRXJyb3IgMScsIDI6ICdFcnJvciAyJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGVycm9yLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKTtcbiAgICAgIGV4cGVjdChlcnJvclRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGVycm9yIHdoZW4gbm8gZXJyb3IgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZXJyb3I6IG51bGwgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F1dG9Gb2N1cyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBhdXRvRm9jdXMgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQXV0b0ZvY3VzVXNlZCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgIG9uQXV0b0ZvY3VzVXNlZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgICA8c3ZnPlxuICAgICAgICAgICAgPFRpY2tDb21wb25lbnRcbiAgICAgICAgICAgICAgey4uLntcbiAgICAgICAgICAgICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICAgICAgICAgICAgeEJhbmQ6IGNyZWF0ZUJhbmRTY2FsZShbJ2EnLCAnYicsICdjJ10sIFswLCA0MDBdKSxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtQ2F0ZWdvcnkgQScsXG4gICAgICAgICAgICAgICAgYmFuZFdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgICAgICAgICAgICB4OiA1MCxcbiAgICAgICAgICAgICAgICB5OiA1MCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KG9uQXV0b0ZvY3VzVXNlZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgaW50ZXJhY3RpdmUgY2hlY2tib3hlcyB3aGVuIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdBbGxvdyBzdHVkZW50cyB0byBjaGFuZ2UnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlZGl0YWJsZSBjaGVja2JveGVzIHdoZW4gY2hhbmdlRWRpdGFibGVFbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hhcnRpbmdPcHRpb25zID0ge1xuICAgICAgICBjaGFuZ2VFZGl0YWJsZTogeyBhdXRob3JpbmdMYWJlbDogJ0FsbG93IGxhYmVsIGVkaXRpbmcnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUVkaXRhYmxlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3BsaXRzIGxvbmcgYXV0aG9yaW5nIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdUaGlzIGlzIGEgdmVyeSBsb25nIGxhYmVsIHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRzcGFucyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0c3BhbicpO1xuICAgICAgZXhwZWN0KHRzcGFucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyBjYXRlZ29yeScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzOiBbXSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLW1pc3NpbmcnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgaW52YWxpZCBmb3JtYXR0ZWRWYWx1ZSBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICdpbnZhbGlkJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1pc3NpbmcgZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBncmFwaFByb3BzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgemVybyBiYXJXaWR0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBiYXJXaWR0aDogMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHg6IC0xMCxcbiAgICAgICAgeTogLTIwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tcG9uZW50RGlkVXBkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkF1dG9Gb2N1c1VzZWQgd2hlbiBhdXRvRm9jdXMgY2hhbmdlcyB0byB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25BdXRvRm9jdXNVc2VkID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZFVwZGF0ZSh7IGF1dG9Gb2N1czogZmFsc2UgfSk7XG4gICAgICBleHBlY3Qob25BdXRvRm9jdXNVc2VkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBjb21wb25lbnQucHJvcHMgPSB7IGF1dG9Gb2N1czogdHJ1ZSwgb25BdXRvRm9jdXNVc2VkIH07XG4gICAgICBjb21wb25lbnQuY29tcG9uZW50RGlkVXBkYXRlKHsgYXV0b0ZvY3VzOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChvbkF1dG9Gb2N1c1VzZWQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFzRCxJQUFBTSxTQUFBO0VBQUFDLFVBQUE7QUFBQSxTQUFBSCx3QkFBQUksQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFB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
|