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