@pie-element/hotspot 4.10.16-next.1 → 4.11.0
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/CHANGELOG.md +88 -0
- package/LICENSE.md +5 -0
- package/configure/CHANGELOG.md +75 -0
- package/configure/lib/button.js +1 -1
- package/configure/lib/defaults.js +3 -2
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-container.js +1 -1
- package/configure/lib/hotspot-drawable.js +2 -2
- package/configure/lib/hotspot-palette.js +1 -1
- package/configure/lib/hotspot-polygon.js +1 -1
- package/configure/lib/hotspot-rectangle.js +1 -1
- package/configure/lib/index.js +1 -1
- package/configure/lib/root.js +23 -18
- package/configure/lib/root.js.map +1 -1
- package/configure/lib/upload-control.js +1 -1
- package/configure/lib/utils.js +14 -2
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +3 -3
- package/configure/src/__tests__/__snapshots__/root.test.js.snap +32 -4
- package/configure/src/defaults.js +2 -1
- package/configure/src/hotspot-drawable.jsx +1 -1
- package/configure/src/root.jsx +33 -26
- package/configure/src/utils.js +23 -1
- package/controller/CHANGELOG.md +12 -0
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +1 -1
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -1
- package/controller/package.json +1 -1
- package/lib/hotspot/container.js +1 -1
- package/lib/hotspot/icons.js +1 -1
- package/lib/hotspot/image.js +1 -1
- package/lib/hotspot/index.js +1 -1
- package/lib/hotspot/polygon.js +1 -1
- package/lib/hotspot/rectangle.js +1 -1
- package/lib/index.js +4 -1
- package/lib/session-updater.js +1 -1
- package/package.json +4 -4
- package/src/index.js +5 -0
- package/configure/lib/__tests__/hotspot-container.test.js +0 -281
- package/configure/lib/__tests__/hotspot-drawable.test.js +0 -241
- package/configure/lib/__tests__/index.test.js +0 -224
- package/configure/lib/__tests__/root.test.js +0 -443
- package/configure/lib/__tests__/utils.test.js +0 -335
- package/controller/lib/__tests__/index.test.js +0 -921
- package/controller/lib/__tests__/utils.test.js +0 -8
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/container-test.js +0 -185
- package/lib/__tests__/image-test.js +0 -63
- package/lib/__tests__/polygon-test.js +0 -99
- package/lib/__tests__/rectangle-test.js +0 -92
- package/lib/__tests__/session-updater-test.js +0 -78
|
@@ -1,921 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
-
|
|
7
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
-
|
|
9
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
-
|
|
11
|
-
var _index = require("../index");
|
|
12
|
-
|
|
13
|
-
var _utils = require("../utils");
|
|
14
|
-
|
|
15
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
16
|
-
|
|
17
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
18
|
-
|
|
19
|
-
describe('controller', function () {
|
|
20
|
-
var result, question, session, env;
|
|
21
|
-
beforeEach(function () {
|
|
22
|
-
question = {
|
|
23
|
-
prompt: 'prompt',
|
|
24
|
-
promptEnabled: true,
|
|
25
|
-
imageUrl: '',
|
|
26
|
-
dimensions: {
|
|
27
|
-
height: 0,
|
|
28
|
-
width: 0
|
|
29
|
-
},
|
|
30
|
-
outlineColor: 'blue',
|
|
31
|
-
hotspotColor: 'lightblue',
|
|
32
|
-
shapes: {
|
|
33
|
-
rectangles: [{
|
|
34
|
-
id: '1',
|
|
35
|
-
correct: true
|
|
36
|
-
}, {
|
|
37
|
-
id: '2'
|
|
38
|
-
}, {
|
|
39
|
-
id: '3'
|
|
40
|
-
}],
|
|
41
|
-
polygons: [{
|
|
42
|
-
id: '4',
|
|
43
|
-
correct: true
|
|
44
|
-
}]
|
|
45
|
-
},
|
|
46
|
-
multipleCorrect: true,
|
|
47
|
-
partialScoring: false
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
describe('outcome partialScoring test', function () {
|
|
51
|
-
describe('hanging controller', function () {
|
|
52
|
-
it('doesnt hang if answers is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
53
|
-
var response;
|
|
54
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
55
|
-
while (1) {
|
|
56
|
-
switch (_context.prev = _context.next) {
|
|
57
|
-
case 0:
|
|
58
|
-
_context.next = 2;
|
|
59
|
-
return (0, _index.outcome)({}, {
|
|
60
|
-
id: "1"
|
|
61
|
-
}, {});
|
|
62
|
-
|
|
63
|
-
case 2:
|
|
64
|
-
response = _context.sent;
|
|
65
|
-
expect(response).toEqual({
|
|
66
|
-
score: 0,
|
|
67
|
-
empty: true
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
case 4:
|
|
71
|
-
case "end":
|
|
72
|
-
return _context.stop();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}, _callee);
|
|
76
|
-
})));
|
|
77
|
-
it('doesnt hang if the rest is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
78
|
-
var response;
|
|
79
|
-
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
80
|
-
while (1) {
|
|
81
|
-
switch (_context2.prev = _context2.next) {
|
|
82
|
-
case 0:
|
|
83
|
-
_context2.next = 2;
|
|
84
|
-
return (0, _index.outcome)({}, {
|
|
85
|
-
id: "1",
|
|
86
|
-
answers: {}
|
|
87
|
-
}, {});
|
|
88
|
-
|
|
89
|
-
case 2:
|
|
90
|
-
response = _context2.sent;
|
|
91
|
-
expect(response).toEqual({
|
|
92
|
-
score: 0
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
case 4:
|
|
96
|
-
case "end":
|
|
97
|
-
return _context2.stop();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}, _callee2);
|
|
101
|
-
})));
|
|
102
|
-
});
|
|
103
|
-
beforeEach(function () {
|
|
104
|
-
var rectangles = question.shapes.rectangles.concat({
|
|
105
|
-
id: '5',
|
|
106
|
-
correct: true
|
|
107
|
-
});
|
|
108
|
-
question = _objectSpread(_objectSpread({}, question), {}, {
|
|
109
|
-
shapes: _objectSpread(_objectSpread({}, question.shapes), {}, {
|
|
110
|
-
rectangles: rectangles
|
|
111
|
-
})
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
|
|
116
|
-
it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
117
|
-
var result;
|
|
118
|
-
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
119
|
-
while (1) {
|
|
120
|
-
switch (_context3.prev = _context3.next) {
|
|
121
|
-
case 0:
|
|
122
|
-
_context3.next = 2;
|
|
123
|
-
return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
|
|
124
|
-
|
|
125
|
-
case 2:
|
|
126
|
-
result = _context3.sent;
|
|
127
|
-
expect(result).toEqual(expect.objectContaining(expected));
|
|
128
|
-
|
|
129
|
-
case 4:
|
|
130
|
-
case "end":
|
|
131
|
-
return _context3.stop();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}, _callee3);
|
|
135
|
-
})));
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
assertOutcome('element.partialScoring = true', {
|
|
139
|
-
partialScoring: true
|
|
140
|
-
}, {
|
|
141
|
-
answers: [{
|
|
142
|
-
id: '2'
|
|
143
|
-
}]
|
|
144
|
-
}, {
|
|
145
|
-
mode: 'evaluate'
|
|
146
|
-
}, {
|
|
147
|
-
score: 0
|
|
148
|
-
});
|
|
149
|
-
assertOutcome('element.partialScoring = false', {
|
|
150
|
-
partialScoring: false
|
|
151
|
-
}, {
|
|
152
|
-
answers: [{
|
|
153
|
-
id: '2'
|
|
154
|
-
}]
|
|
155
|
-
}, {
|
|
156
|
-
mode: 'evaluate'
|
|
157
|
-
}, {
|
|
158
|
-
score: 0
|
|
159
|
-
});
|
|
160
|
-
assertOutcome('element.partialScoring = false, env.partialScoring = true', {
|
|
161
|
-
partialScoring: false
|
|
162
|
-
}, {
|
|
163
|
-
answers: [{
|
|
164
|
-
id: '2'
|
|
165
|
-
}]
|
|
166
|
-
}, {
|
|
167
|
-
mode: 'evaluate',
|
|
168
|
-
partialScoring: true
|
|
169
|
-
}, {
|
|
170
|
-
score: 0
|
|
171
|
-
});
|
|
172
|
-
assertOutcome('element.partialScoring = true, env.partialScoring = false', {
|
|
173
|
-
partialScoring: true
|
|
174
|
-
}, {
|
|
175
|
-
answers: [{
|
|
176
|
-
id: '2'
|
|
177
|
-
}]
|
|
178
|
-
}, {
|
|
179
|
-
mode: 'evaluate',
|
|
180
|
-
partialScoring: false
|
|
181
|
-
}, {
|
|
182
|
-
score: 0
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
describe('outcome', function () {
|
|
186
|
-
it('returns score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
187
|
-
var result;
|
|
188
|
-
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
189
|
-
while (1) {
|
|
190
|
-
switch (_context4.prev = _context4.next) {
|
|
191
|
-
case 0:
|
|
192
|
-
_context4.next = 2;
|
|
193
|
-
return (0, _index.outcome)(question, {
|
|
194
|
-
answers: [{
|
|
195
|
-
id: '2'
|
|
196
|
-
}]
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
case 2:
|
|
200
|
-
result = _context4.sent;
|
|
201
|
-
expect(result.score).toEqual(0);
|
|
202
|
-
|
|
203
|
-
case 4:
|
|
204
|
-
case "end":
|
|
205
|
-
return _context4.stop();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}, _callee4);
|
|
209
|
-
})));
|
|
210
|
-
it('returns score of 1 (partialScoring: false, answers in order)', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
211
|
-
var result;
|
|
212
|
-
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
213
|
-
while (1) {
|
|
214
|
-
switch (_context5.prev = _context5.next) {
|
|
215
|
-
case 0:
|
|
216
|
-
_context5.next = 2;
|
|
217
|
-
return (0, _index.outcome)(question, {
|
|
218
|
-
answers: [{
|
|
219
|
-
id: '1'
|
|
220
|
-
}, {
|
|
221
|
-
id: '4'
|
|
222
|
-
}]
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
case 2:
|
|
226
|
-
result = _context5.sent;
|
|
227
|
-
expect(result.score).toEqual(1);
|
|
228
|
-
|
|
229
|
-
case 4:
|
|
230
|
-
case "end":
|
|
231
|
-
return _context5.stop();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}, _callee5);
|
|
235
|
-
})));
|
|
236
|
-
it('returns score of 1 (partialScoring: false, answers not in order)', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
237
|
-
var result;
|
|
238
|
-
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
239
|
-
while (1) {
|
|
240
|
-
switch (_context6.prev = _context6.next) {
|
|
241
|
-
case 0:
|
|
242
|
-
_context6.next = 2;
|
|
243
|
-
return (0, _index.outcome)(question, {
|
|
244
|
-
answers: [{
|
|
245
|
-
id: '4'
|
|
246
|
-
}, {
|
|
247
|
-
id: '1'
|
|
248
|
-
}]
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
case 2:
|
|
252
|
-
result = _context6.sent;
|
|
253
|
-
expect(result.score).toEqual(1);
|
|
254
|
-
|
|
255
|
-
case 4:
|
|
256
|
-
case "end":
|
|
257
|
-
return _context6.stop();
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}, _callee6);
|
|
261
|
-
})));
|
|
262
|
-
describe('partial scoring', function () {
|
|
263
|
-
beforeEach(function () {
|
|
264
|
-
var rectangles = question.shapes.rectangles.concat({
|
|
265
|
-
id: '5',
|
|
266
|
-
correct: true
|
|
267
|
-
}, {
|
|
268
|
-
id: '6',
|
|
269
|
-
correct: true
|
|
270
|
-
});
|
|
271
|
-
question = _objectSpread(_objectSpread({}, question), {}, {
|
|
272
|
-
partialScoring: true,
|
|
273
|
-
shapes: _objectSpread(_objectSpread({}, question.shapes), {}, {
|
|
274
|
-
rectangles: rectangles
|
|
275
|
-
})
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
it('returns a score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
279
|
-
var result;
|
|
280
|
-
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
281
|
-
while (1) {
|
|
282
|
-
switch (_context7.prev = _context7.next) {
|
|
283
|
-
case 0:
|
|
284
|
-
_context7.next = 2;
|
|
285
|
-
return (0, _index.outcome)(question, {
|
|
286
|
-
answers: [{
|
|
287
|
-
id: '2'
|
|
288
|
-
}]
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
case 2:
|
|
292
|
-
result = _context7.sent;
|
|
293
|
-
expect(result.score).toEqual(0);
|
|
294
|
-
|
|
295
|
-
case 4:
|
|
296
|
-
case "end":
|
|
297
|
-
return _context7.stop();
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}, _callee7);
|
|
301
|
-
})));
|
|
302
|
-
it('returns a score of 0.25 for 1/4 correct answers and 0 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
303
|
-
var result;
|
|
304
|
-
return _regenerator["default"].wrap(function _callee8$(_context8) {
|
|
305
|
-
while (1) {
|
|
306
|
-
switch (_context8.prev = _context8.next) {
|
|
307
|
-
case 0:
|
|
308
|
-
_context8.next = 2;
|
|
309
|
-
return (0, _index.outcome)(question, {
|
|
310
|
-
answers: [{
|
|
311
|
-
id: '2'
|
|
312
|
-
}, {
|
|
313
|
-
id: '5'
|
|
314
|
-
}]
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
case 2:
|
|
318
|
-
result = _context8.sent;
|
|
319
|
-
expect(result.score).toEqual(0.25);
|
|
320
|
-
|
|
321
|
-
case 4:
|
|
322
|
-
case "end":
|
|
323
|
-
return _context8.stop();
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}, _callee8);
|
|
327
|
-
})));
|
|
328
|
-
it('returns a score of 0.25, even if answers are not in order', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
329
|
-
var result;
|
|
330
|
-
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
331
|
-
while (1) {
|
|
332
|
-
switch (_context9.prev = _context9.next) {
|
|
333
|
-
case 0:
|
|
334
|
-
_context9.next = 2;
|
|
335
|
-
return (0, _index.outcome)(question, {
|
|
336
|
-
answers: [{
|
|
337
|
-
id: '5'
|
|
338
|
-
}, {
|
|
339
|
-
id: '2'
|
|
340
|
-
}]
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
case 2:
|
|
344
|
-
result = _context9.sent;
|
|
345
|
-
expect(result.score).toEqual(0.25);
|
|
346
|
-
|
|
347
|
-
case 4:
|
|
348
|
-
case "end":
|
|
349
|
-
return _context9.stop();
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}, _callee9);
|
|
353
|
-
})));
|
|
354
|
-
it('returns a score of 0.5 for 2/4 correct answers and 0 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
355
|
-
var result;
|
|
356
|
-
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
357
|
-
while (1) {
|
|
358
|
-
switch (_context10.prev = _context10.next) {
|
|
359
|
-
case 0:
|
|
360
|
-
_context10.next = 2;
|
|
361
|
-
return (0, _index.outcome)(question, {
|
|
362
|
-
answers: [{
|
|
363
|
-
id: '5'
|
|
364
|
-
}, {
|
|
365
|
-
id: '4'
|
|
366
|
-
}]
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
case 2:
|
|
370
|
-
result = _context10.sent;
|
|
371
|
-
expect(result.score).toEqual(0.5);
|
|
372
|
-
|
|
373
|
-
case 4:
|
|
374
|
-
case "end":
|
|
375
|
-
return _context10.stop();
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}, _callee10);
|
|
379
|
-
})));
|
|
380
|
-
it('returns a score of 0.75 for 3/4 correct answers and 0 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
381
|
-
var result;
|
|
382
|
-
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
383
|
-
while (1) {
|
|
384
|
-
switch (_context11.prev = _context11.next) {
|
|
385
|
-
case 0:
|
|
386
|
-
_context11.next = 2;
|
|
387
|
-
return (0, _index.outcome)(question, {
|
|
388
|
-
answers: [{
|
|
389
|
-
id: '1'
|
|
390
|
-
}, {
|
|
391
|
-
id: '5'
|
|
392
|
-
}, {
|
|
393
|
-
id: '4'
|
|
394
|
-
}]
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
case 2:
|
|
398
|
-
result = _context11.sent;
|
|
399
|
-
expect(result.score).toEqual(0.75);
|
|
400
|
-
|
|
401
|
-
case 4:
|
|
402
|
-
case "end":
|
|
403
|
-
return _context11.stop();
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}, _callee11);
|
|
407
|
-
})));
|
|
408
|
-
it('returns a score of 1 for 4/4 correct answers and 0 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
409
|
-
var result;
|
|
410
|
-
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
411
|
-
while (1) {
|
|
412
|
-
switch (_context12.prev = _context12.next) {
|
|
413
|
-
case 0:
|
|
414
|
-
_context12.next = 2;
|
|
415
|
-
return (0, _index.outcome)(question, {
|
|
416
|
-
answers: [{
|
|
417
|
-
id: '1'
|
|
418
|
-
}, {
|
|
419
|
-
id: '4'
|
|
420
|
-
}, {
|
|
421
|
-
id: '5'
|
|
422
|
-
}, {
|
|
423
|
-
id: '6'
|
|
424
|
-
}]
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
case 2:
|
|
428
|
-
result = _context12.sent;
|
|
429
|
-
expect(result.score).toEqual(1);
|
|
430
|
-
|
|
431
|
-
case 4:
|
|
432
|
-
case "end":
|
|
433
|
-
return _context12.stop();
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}, _callee12);
|
|
437
|
-
})));
|
|
438
|
-
it('returns a score of 0.25 for 1/4 correct answers and 2 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
|
|
439
|
-
var result;
|
|
440
|
-
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
441
|
-
while (1) {
|
|
442
|
-
switch (_context13.prev = _context13.next) {
|
|
443
|
-
case 0:
|
|
444
|
-
_context13.next = 2;
|
|
445
|
-
return (0, _index.outcome)(question, {
|
|
446
|
-
answers: [{
|
|
447
|
-
id: '1'
|
|
448
|
-
}, {
|
|
449
|
-
id: '2'
|
|
450
|
-
}, {
|
|
451
|
-
id: '3'
|
|
452
|
-
}]
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
case 2:
|
|
456
|
-
result = _context13.sent;
|
|
457
|
-
expect(result.score).toEqual(0.25);
|
|
458
|
-
|
|
459
|
-
case 4:
|
|
460
|
-
case "end":
|
|
461
|
-
return _context13.stop();
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}, _callee13);
|
|
465
|
-
})));
|
|
466
|
-
it('returns a score of 0.5 for 2/4 correct answers and 2 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
|
|
467
|
-
var result;
|
|
468
|
-
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
469
|
-
while (1) {
|
|
470
|
-
switch (_context14.prev = _context14.next) {
|
|
471
|
-
case 0:
|
|
472
|
-
_context14.next = 2;
|
|
473
|
-
return (0, _index.outcome)(question, {
|
|
474
|
-
answers: [{
|
|
475
|
-
id: '1'
|
|
476
|
-
}, {
|
|
477
|
-
id: '4'
|
|
478
|
-
}, {
|
|
479
|
-
id: '2'
|
|
480
|
-
}, {
|
|
481
|
-
id: '3'
|
|
482
|
-
}]
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
case 2:
|
|
486
|
-
result = _context14.sent;
|
|
487
|
-
expect(result.score).toEqual(0.5);
|
|
488
|
-
|
|
489
|
-
case 4:
|
|
490
|
-
case "end":
|
|
491
|
-
return _context14.stop();
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
}, _callee14);
|
|
495
|
-
})));
|
|
496
|
-
it('returns a score of 0.5 for 2/4 correct answers and 2 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
|
|
497
|
-
var result;
|
|
498
|
-
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
499
|
-
while (1) {
|
|
500
|
-
switch (_context15.prev = _context15.next) {
|
|
501
|
-
case 0:
|
|
502
|
-
_context15.next = 2;
|
|
503
|
-
return (0, _index.outcome)(question, {
|
|
504
|
-
answers: [{
|
|
505
|
-
id: '1'
|
|
506
|
-
}, {
|
|
507
|
-
id: '4'
|
|
508
|
-
}, {
|
|
509
|
-
id: '2'
|
|
510
|
-
}, {
|
|
511
|
-
id: '3'
|
|
512
|
-
}]
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
case 2:
|
|
516
|
-
result = _context15.sent;
|
|
517
|
-
expect(result.score).toEqual(0.5);
|
|
518
|
-
|
|
519
|
-
case 4:
|
|
520
|
-
case "end":
|
|
521
|
-
return _context15.stop();
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}, _callee15);
|
|
525
|
-
})));
|
|
526
|
-
it('returns a score of 0.75 for 3/4 correct answers and 1 incorrect answer', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
|
|
527
|
-
var result;
|
|
528
|
-
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
529
|
-
while (1) {
|
|
530
|
-
switch (_context16.prev = _context16.next) {
|
|
531
|
-
case 0:
|
|
532
|
-
_context16.next = 2;
|
|
533
|
-
return (0, _index.outcome)(question, {
|
|
534
|
-
answers: [{
|
|
535
|
-
id: '6'
|
|
536
|
-
}, {
|
|
537
|
-
id: '4'
|
|
538
|
-
}, {
|
|
539
|
-
id: '1'
|
|
540
|
-
}, {
|
|
541
|
-
id: '3'
|
|
542
|
-
}]
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
case 2:
|
|
546
|
-
result = _context16.sent;
|
|
547
|
-
expect(result.score).toEqual(0.75);
|
|
548
|
-
|
|
549
|
-
case 4:
|
|
550
|
-
case "end":
|
|
551
|
-
return _context16.stop();
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
}, _callee16);
|
|
555
|
-
})));
|
|
556
|
-
it('returns a score of 0.75 for 3/4 correct answers and 1 incorrect answer', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17() {
|
|
557
|
-
var result;
|
|
558
|
-
return _regenerator["default"].wrap(function _callee17$(_context17) {
|
|
559
|
-
while (1) {
|
|
560
|
-
switch (_context17.prev = _context17.next) {
|
|
561
|
-
case 0:
|
|
562
|
-
_context17.next = 2;
|
|
563
|
-
return (0, _index.outcome)(question, {
|
|
564
|
-
answers: [{
|
|
565
|
-
id: '6'
|
|
566
|
-
}, {
|
|
567
|
-
id: '4'
|
|
568
|
-
}, {
|
|
569
|
-
id: '1'
|
|
570
|
-
}, {
|
|
571
|
-
id: '3'
|
|
572
|
-
}]
|
|
573
|
-
});
|
|
574
|
-
|
|
575
|
-
case 2:
|
|
576
|
-
result = _context17.sent;
|
|
577
|
-
expect(result.score).toEqual(0.75);
|
|
578
|
-
|
|
579
|
-
case 4:
|
|
580
|
-
case "end":
|
|
581
|
-
return _context17.stop();
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}, _callee17);
|
|
585
|
-
})));
|
|
586
|
-
it('returns a score of 0.5 for 3/4 correct answers and 2 incorrect answer', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18() {
|
|
587
|
-
var result;
|
|
588
|
-
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
589
|
-
while (1) {
|
|
590
|
-
switch (_context18.prev = _context18.next) {
|
|
591
|
-
case 0:
|
|
592
|
-
_context18.next = 2;
|
|
593
|
-
return (0, _index.outcome)(question, {
|
|
594
|
-
answers: [{
|
|
595
|
-
id: '6'
|
|
596
|
-
}, {
|
|
597
|
-
id: '4'
|
|
598
|
-
}, {
|
|
599
|
-
id: '2'
|
|
600
|
-
}, {
|
|
601
|
-
id: '3'
|
|
602
|
-
}, {
|
|
603
|
-
id: '1'
|
|
604
|
-
}]
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
case 2:
|
|
608
|
-
result = _context18.sent;
|
|
609
|
-
expect(result.score).toEqual(0.5);
|
|
610
|
-
|
|
611
|
-
case 4:
|
|
612
|
-
case "end":
|
|
613
|
-
return _context18.stop();
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
}, _callee18);
|
|
617
|
-
})));
|
|
618
|
-
it('returns a score of 0.75 for 4/4 correct answers and 1 incorrect answer', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
|
|
619
|
-
var result;
|
|
620
|
-
return _regenerator["default"].wrap(function _callee19$(_context19) {
|
|
621
|
-
while (1) {
|
|
622
|
-
switch (_context19.prev = _context19.next) {
|
|
623
|
-
case 0:
|
|
624
|
-
_context19.next = 2;
|
|
625
|
-
return (0, _index.outcome)(question, {
|
|
626
|
-
answers: [{
|
|
627
|
-
id: '6'
|
|
628
|
-
}, {
|
|
629
|
-
id: '4'
|
|
630
|
-
}, {
|
|
631
|
-
id: '2'
|
|
632
|
-
}, {
|
|
633
|
-
id: '5'
|
|
634
|
-
}, {
|
|
635
|
-
id: '1'
|
|
636
|
-
}]
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
case 2:
|
|
640
|
-
result = _context19.sent;
|
|
641
|
-
expect(result.score).toEqual(0.75);
|
|
642
|
-
|
|
643
|
-
case 4:
|
|
644
|
-
case "end":
|
|
645
|
-
return _context19.stop();
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
}, _callee19);
|
|
649
|
-
})));
|
|
650
|
-
it('returns a score of 0.5 for 4/4 correct answers and 2 incorrect answers', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
|
|
651
|
-
var result;
|
|
652
|
-
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
653
|
-
while (1) {
|
|
654
|
-
switch (_context20.prev = _context20.next) {
|
|
655
|
-
case 0:
|
|
656
|
-
_context20.next = 2;
|
|
657
|
-
return (0, _index.outcome)(question, {
|
|
658
|
-
answers: [{
|
|
659
|
-
id: '6'
|
|
660
|
-
}, {
|
|
661
|
-
id: '4'
|
|
662
|
-
}, {
|
|
663
|
-
id: '2'
|
|
664
|
-
}, {
|
|
665
|
-
id: '5'
|
|
666
|
-
}, {
|
|
667
|
-
id: '1'
|
|
668
|
-
}, {
|
|
669
|
-
id: '3'
|
|
670
|
-
}]
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
case 2:
|
|
674
|
-
result = _context20.sent;
|
|
675
|
-
expect(result.score).toEqual(0.5);
|
|
676
|
-
|
|
677
|
-
case 4:
|
|
678
|
-
case "end":
|
|
679
|
-
return _context20.stop();
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
}, _callee20);
|
|
683
|
-
})));
|
|
684
|
-
});
|
|
685
|
-
|
|
686
|
-
var returnOutcome = function returnOutcome(session) {
|
|
687
|
-
it("returns empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
|
|
688
|
-
var result;
|
|
689
|
-
return _regenerator["default"].wrap(function _callee21$(_context21) {
|
|
690
|
-
while (1) {
|
|
691
|
-
switch (_context21.prev = _context21.next) {
|
|
692
|
-
case 0:
|
|
693
|
-
_context21.next = 2;
|
|
694
|
-
return (0, _index.outcome)(question, session);
|
|
695
|
-
|
|
696
|
-
case 2:
|
|
697
|
-
result = _context21.sent;
|
|
698
|
-
expect(result).toEqual({
|
|
699
|
-
score: 0,
|
|
700
|
-
empty: true
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
case 4:
|
|
704
|
-
case "end":
|
|
705
|
-
return _context21.stop();
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
}, _callee21);
|
|
709
|
-
})));
|
|
710
|
-
};
|
|
711
|
-
|
|
712
|
-
returnOutcome(undefined);
|
|
713
|
-
returnOutcome(null);
|
|
714
|
-
returnOutcome({});
|
|
715
|
-
});
|
|
716
|
-
describe('model', function () {
|
|
717
|
-
describe('mode: gather', function () {
|
|
718
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
|
|
719
|
-
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
720
|
-
while (1) {
|
|
721
|
-
switch (_context22.prev = _context22.next) {
|
|
722
|
-
case 0:
|
|
723
|
-
session = {};
|
|
724
|
-
env = {
|
|
725
|
-
mode: 'gather'
|
|
726
|
-
};
|
|
727
|
-
_context22.next = 4;
|
|
728
|
-
return (0, _index.model)(question, session, env);
|
|
729
|
-
|
|
730
|
-
case 4:
|
|
731
|
-
result = _context22.sent;
|
|
732
|
-
|
|
733
|
-
case 5:
|
|
734
|
-
case "end":
|
|
735
|
-
return _context22.stop();
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
}, _callee22);
|
|
739
|
-
})));
|
|
740
|
-
it('returns disabled', function () {
|
|
741
|
-
expect(result.disabled).toEqual(false);
|
|
742
|
-
});
|
|
743
|
-
it('returns mode', function () {
|
|
744
|
-
expect(result.mode).toEqual('gather');
|
|
745
|
-
});
|
|
746
|
-
it('returns prompt', function () {
|
|
747
|
-
expect(result.prompt).toEqual('prompt');
|
|
748
|
-
});
|
|
749
|
-
it('returns dimensions', function () {
|
|
750
|
-
expect(result.dimensions).toEqual({
|
|
751
|
-
height: 0,
|
|
752
|
-
width: 0
|
|
753
|
-
});
|
|
754
|
-
});
|
|
755
|
-
it('returns outlineColor', function () {
|
|
756
|
-
expect(result.outlineColor).toEqual('blue');
|
|
757
|
-
});
|
|
758
|
-
it('returns hotspotColor', function () {
|
|
759
|
-
expect(result.hotspotColor).toEqual('lightblue');
|
|
760
|
-
});
|
|
761
|
-
it('returns multipleCorrect', function () {
|
|
762
|
-
expect(result.multipleCorrect).toEqual(true);
|
|
763
|
-
});
|
|
764
|
-
it('returns shapes', function () {
|
|
765
|
-
expect(result.shapes.rectangles).toEqual(expect.arrayContaining([{
|
|
766
|
-
id: '1',
|
|
767
|
-
correct: true
|
|
768
|
-
}, {
|
|
769
|
-
id: '2'
|
|
770
|
-
}, {
|
|
771
|
-
id: '3'
|
|
772
|
-
}]));
|
|
773
|
-
expect(result.shapes.polygons).toEqual(expect.arrayContaining([{
|
|
774
|
-
id: '4',
|
|
775
|
-
correct: true
|
|
776
|
-
}]));
|
|
777
|
-
});
|
|
778
|
-
it('does not return responseCorrect', function () {
|
|
779
|
-
expect(result.responseCorrect).toBe(undefined);
|
|
780
|
-
});
|
|
781
|
-
});
|
|
782
|
-
describe('mode: view', function () {
|
|
783
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
|
|
784
|
-
return _regenerator["default"].wrap(function _callee23$(_context23) {
|
|
785
|
-
while (1) {
|
|
786
|
-
switch (_context23.prev = _context23.next) {
|
|
787
|
-
case 0:
|
|
788
|
-
session = {};
|
|
789
|
-
env = {
|
|
790
|
-
mode: 'view'
|
|
791
|
-
};
|
|
792
|
-
_context23.next = 4;
|
|
793
|
-
return (0, _index.model)(question, session, env);
|
|
794
|
-
|
|
795
|
-
case 4:
|
|
796
|
-
result = _context23.sent;
|
|
797
|
-
|
|
798
|
-
case 5:
|
|
799
|
-
case "end":
|
|
800
|
-
return _context23.stop();
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
}, _callee23);
|
|
804
|
-
})));
|
|
805
|
-
it('returns disabled', function () {
|
|
806
|
-
expect(result.disabled).toEqual(true);
|
|
807
|
-
});
|
|
808
|
-
});
|
|
809
|
-
describe('mode: evaluate', function () {
|
|
810
|
-
beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
|
|
811
|
-
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
812
|
-
while (1) {
|
|
813
|
-
switch (_context24.prev = _context24.next) {
|
|
814
|
-
case 0:
|
|
815
|
-
session = {
|
|
816
|
-
answers: []
|
|
817
|
-
};
|
|
818
|
-
env = {
|
|
819
|
-
mode: 'evaluate'
|
|
820
|
-
};
|
|
821
|
-
_context24.next = 4;
|
|
822
|
-
return (0, _index.model)(question, session, env);
|
|
823
|
-
|
|
824
|
-
case 4:
|
|
825
|
-
result = _context24.sent;
|
|
826
|
-
return _context24.abrupt("return", result);
|
|
827
|
-
|
|
828
|
-
case 6:
|
|
829
|
-
case "end":
|
|
830
|
-
return _context24.stop();
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
}, _callee24);
|
|
834
|
-
})));
|
|
835
|
-
it('returns choices w/ correct', function () {
|
|
836
|
-
expect(result.shapes.rectangles).toEqual(expect.arrayContaining([{
|
|
837
|
-
id: '1',
|
|
838
|
-
correct: true
|
|
839
|
-
}, {
|
|
840
|
-
id: '2'
|
|
841
|
-
}, {
|
|
842
|
-
id: '3'
|
|
843
|
-
}]));
|
|
844
|
-
expect(result.shapes.polygons).toEqual(expect.arrayContaining([{
|
|
845
|
-
id: '4',
|
|
846
|
-
correct: true
|
|
847
|
-
}]));
|
|
848
|
-
});
|
|
849
|
-
it('returns is response correct', function () {
|
|
850
|
-
expect(result.responseCorrect).toEqual(false);
|
|
851
|
-
});
|
|
852
|
-
});
|
|
853
|
-
});
|
|
854
|
-
describe('isResponseCorrect', function () {
|
|
855
|
-
var returnIsResponseCorect = function returnIsResponseCorect(session) {
|
|
856
|
-
it("response is not correct if session is ".concat(JSON.stringify(session)), function () {
|
|
857
|
-
expect((0, _utils.isResponseCorrect)(question, session)).toEqual(false);
|
|
858
|
-
});
|
|
859
|
-
};
|
|
860
|
-
|
|
861
|
-
returnIsResponseCorect(undefined);
|
|
862
|
-
returnIsResponseCorect(null);
|
|
863
|
-
returnIsResponseCorect({});
|
|
864
|
-
});
|
|
865
|
-
describe('correct response', function () {
|
|
866
|
-
it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25() {
|
|
867
|
-
var sess;
|
|
868
|
-
return _regenerator["default"].wrap(function _callee25$(_context25) {
|
|
869
|
-
while (1) {
|
|
870
|
-
switch (_context25.prev = _context25.next) {
|
|
871
|
-
case 0:
|
|
872
|
-
_context25.next = 2;
|
|
873
|
-
return (0, _index.createCorrectResponseSession)(question, {
|
|
874
|
-
mode: 'gather',
|
|
875
|
-
role: 'instructor'
|
|
876
|
-
});
|
|
877
|
-
|
|
878
|
-
case 2:
|
|
879
|
-
sess = _context25.sent;
|
|
880
|
-
expect(sess).toEqual({
|
|
881
|
-
answers: [{
|
|
882
|
-
id: '1'
|
|
883
|
-
}, {
|
|
884
|
-
id: '4'
|
|
885
|
-
}],
|
|
886
|
-
id: '1'
|
|
887
|
-
});
|
|
888
|
-
|
|
889
|
-
case 4:
|
|
890
|
-
case "end":
|
|
891
|
-
return _context25.stop();
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
}, _callee25);
|
|
895
|
-
})));
|
|
896
|
-
it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26() {
|
|
897
|
-
var noResult;
|
|
898
|
-
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
899
|
-
while (1) {
|
|
900
|
-
switch (_context26.prev = _context26.next) {
|
|
901
|
-
case 0:
|
|
902
|
-
_context26.next = 2;
|
|
903
|
-
return (0, _index.createCorrectResponseSession)(question, {
|
|
904
|
-
mode: 'gather',
|
|
905
|
-
role: 'student'
|
|
906
|
-
});
|
|
907
|
-
|
|
908
|
-
case 2:
|
|
909
|
-
noResult = _context26.sent;
|
|
910
|
-
expect(noResult).toBeNull();
|
|
911
|
-
|
|
912
|
-
case 4:
|
|
913
|
-
case "end":
|
|
914
|
-
return _context26.stop();
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
}, _callee26);
|
|
918
|
-
})));
|
|
919
|
-
});
|
|
920
|
-
});
|
|
921
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiaW1hZ2VVcmwiLCJkaW1lbnNpb25zIiwiaGVpZ2h0Iiwid2lkdGgiLCJvdXRsaW5lQ29sb3IiLCJob3RzcG90Q29sb3IiLCJzaGFwZXMiLCJyZWN0YW5nbGVzIiwiaWQiLCJjb3JyZWN0IiwicG9seWdvbnMiLCJtdWx0aXBsZUNvcnJlY3QiLCJwYXJ0aWFsU2NvcmluZyIsIml0IiwicmVzcG9uc2UiLCJleHBlY3QiLCJ0b0VxdWFsIiwic2NvcmUiLCJlbXB0eSIsImFuc3dlcnMiLCJjb25jYXQiLCJhc3NlcnRPdXRjb21lIiwibWVzc2FnZSIsImV4dHJhIiwic2Vzc2lvblZhbHVlIiwiZXhwZWN0ZWQiLCJvYmplY3RDb250YWluaW5nIiwibW9kZSIsInJldHVybk91dGNvbWUiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwiZGlzYWJsZWQiLCJhcnJheUNvbnRhaW5pbmciLCJyZXNwb25zZUNvcnJlY3QiLCJ0b0JlIiwicmV0dXJuSXNSZXNwb25zZUNvcmVjdCIsInJvbGUiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFNO0FBQzNCLE1BQUlDLE1BQUosRUFBWUMsUUFBWixFQUFzQkMsT0FBdEIsRUFBK0JDLEdBQS9CO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2ZILElBQUFBLFFBQVEsR0FBRztBQUNUSSxNQUFBQSxNQUFNLEVBQUUsUUFEQztBQUVUQyxNQUFBQSxhQUFhLEVBQUUsSUFGTjtBQUdUQyxNQUFBQSxRQUFRLEVBQUUsRUFIRDtBQUlUQyxNQUFBQSxVQUFVLEVBQUU7QUFDVkMsUUFBQUEsTUFBTSxFQUFFLENBREU7QUFFVkMsUUFBQUEsS0FBSyxFQUFFO0FBRkcsT0FKSDtBQVFUQyxNQUFBQSxZQUFZLEVBQUUsTUFSTDtBQVNUQyxNQUFBQSxZQUFZLEVBQUUsV0FUTDtBQVVUQyxNQUFBQSxNQUFNLEVBQUU7QUFDTkMsUUFBQUEsVUFBVSxFQUFFLENBQ1Y7QUFDRUMsVUFBQUEsRUFBRSxFQUFFLEdBRE47QUFFRUMsVUFBQUEsT0FBTyxFQUFFO0FBRlgsU0FEVSxFQUtWO0FBQ0VELFVBQUFBLEVBQUUsRUFBRTtBQUROLFNBTFUsRUFRVjtBQUNFQSxVQUFBQSxFQUFFLEVBQUU7QUFETixTQVJVLENBRE47QUFhTkUsUUFBQUEsUUFBUSxFQUFFLENBQ1I7QUFDRUYsVUFBQUEsRUFBRSxFQUFFLEdBRE47QUFFRUMsVUFBQUEsT0FBTyxFQUFFO0FBRlgsU0FEUTtBQWJKLE9BVkM7QUE4QlRFLE1BQUFBLGVBQWUsRUFBRSxJQTlCUjtBQStCVEMsTUFBQUEsY0FBYyxFQUFFO0FBL0JQLEtBQVg7QUFpQ0QsR0FsQ1MsQ0FBVjtBQW9DQXBCLEVBQUFBLFFBQVEsQ0FBQyw2QkFBRCxFQUFnQyxZQUFNO0FBRTVDQSxJQUFBQSxRQUFRLENBQUMsb0JBQUQsRUFBdUIsWUFBSztBQUVsQ3FCLE1BQUFBLEVBQUUsQ0FBQyxtQ0FBRCw2RkFBc0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDZixvQkFBUSxFQUFSLEVBQVk7QUFBQ0wsa0JBQUFBLEVBQUUsRUFBRTtBQUFMLGlCQUFaLEVBQXVCLEVBQXZCLENBRGU7O0FBQUE7QUFDaENNLGdCQUFBQSxRQURnQztBQUV0Q0MsZ0JBQUFBLE1BQU0sQ0FBQ0QsUUFBRCxDQUFOLENBQWlCRSxPQUFqQixDQUF5QjtBQUFDQyxrQkFBQUEsS0FBSyxFQUFFLENBQVI7QUFBV0Msa0JBQUFBLEtBQUssRUFBRTtBQUFsQixpQkFBekI7O0FBRnNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQXRDLEdBQUY7QUFLQUwsTUFBQUEsRUFBRSxDQUFDLG9DQUFELDZGQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUNoQixvQkFBUSxFQUFSLEVBQVk7QUFBQ0wsa0JBQUFBLEVBQUUsRUFBRSxHQUFMO0FBQVVXLGtCQUFBQSxPQUFPLEVBQUU7QUFBbkIsaUJBQVosRUFBb0MsRUFBcEMsQ0FEZ0I7O0FBQUE7QUFDakNMLGdCQUFBQSxRQURpQztBQUV2Q0MsZ0JBQUFBLE1BQU0sQ0FBQ0QsUUFBRCxDQUFOLENBQWlCRSxPQUFqQixDQUF5QjtBQUFDQyxrQkFBQUEsS0FBSyxFQUFFO0FBQVIsaUJBQXpCOztBQUZ1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUF2QyxHQUFGO0FBS0QsS0FaTyxDQUFSO0FBY0FwQixJQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNmLFVBQU1VLFVBQVUsR0FBR2IsUUFBUSxDQUFDWSxNQUFULENBQWdCQyxVQUFoQixDQUEyQmEsTUFBM0IsQ0FBa0M7QUFDbkRaLFFBQUFBLEVBQUUsRUFBRSxHQUQrQztBQUVuREMsUUFBQUEsT0FBTyxFQUFFO0FBRjBDLE9BQWxDLENBQW5CO0FBSUFmLE1BQUFBLFFBQVEsbUNBQ0hBLFFBREc7QUFFTlksUUFBQUEsTUFBTSxrQ0FDRFosUUFBUSxDQUFDWSxNQURSO0FBRUpDLFVBQUFBLFVBQVUsRUFBVkE7QUFGSTtBQUZBLFFBQVI7QUFPRCxLQVpTLENBQVY7O0FBY0EsUUFBTWMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUFDQyxPQUFELEVBQVVDLEtBQVYsRUFBaUJDLFlBQWpCLEVBQStCNUIsR0FBL0IsRUFBb0M2QixRQUFwQyxFQUFpRDtBQUNyRVosTUFBQUEsRUFBRSxDQUFDUyxPQUFELDZGQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ1csb0RBQ2Q1QixRQURjLEdBQ0Q2QixLQURDLEdBRW5CQyxZQUZtQixFQUduQjVCLEdBSG1CLENBRFg7O0FBQUE7QUFDSkgsZ0JBQUFBLE1BREk7QUFNVnNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFELENBQU4sQ0FBZXVCLE9BQWYsQ0FBdUJELE1BQU0sQ0FBQ1csZ0JBQVAsQ0FBd0JELFFBQXhCLENBQXZCOztBQU5VO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQVYsR0FBRjtBQVFELEtBVEQ7O0FBV0FKLElBQUFBLGFBQWEsQ0FDWCwrQkFEVyxFQUVYO0FBQUVULE1BQUFBLGNBQWMsRUFBRTtBQUFsQixLQUZXLEVBR1g7QUFBRU8sTUFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsUUFBQUEsRUFBRSxFQUFFO0FBQU4sT0FBRDtBQUFYLEtBSFcsRUFJWDtBQUFFbUIsTUFBQUEsSUFBSSxFQUFFO0FBQVIsS0FKVyxFQUtYO0FBQUVWLE1BQUFBLEtBQUssRUFBRTtBQUFULEtBTFcsQ0FBYjtBQVFBSSxJQUFBQSxhQUFhLENBQ1gsZ0NBRFcsRUFFWDtBQUFFVCxNQUFBQSxjQUFjLEVBQUU7QUFBbEIsS0FGVyxFQUdYO0FBQUVPLE1BQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLFFBQUFBLEVBQUUsRUFBRTtBQUFOLE9BQUQ7QUFBWCxLQUhXLEVBSVg7QUFBRW1CLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBSlcsRUFLWDtBQUFFVixNQUFBQSxLQUFLLEVBQUU7QUFBVCxLQUxXLENBQWI7QUFRQUksSUFBQUEsYUFBYSxDQUNYLDJEQURXLEVBRVg7QUFBRVQsTUFBQUEsY0FBYyxFQUFFO0FBQWxCLEtBRlcsRUFHWDtBQUFFTyxNQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxRQUFBQSxFQUFFLEVBQUU7QUFBTixPQUFEO0FBQVgsS0FIVyxFQUlYO0FBQUVtQixNQUFBQSxJQUFJLEVBQUUsVUFBUjtBQUFvQmYsTUFBQUEsY0FBYyxFQUFFO0FBQXBDLEtBSlcsRUFLWDtBQUFFSyxNQUFBQSxLQUFLLEVBQUU7QUFBVCxLQUxXLENBQWI7QUFRQUksSUFBQUEsYUFBYSxDQUNYLDJEQURXLEVBRVg7QUFBRVQsTUFBQUEsY0FBYyxFQUFFO0FBQWxCLEtBRlcsRUFHWDtBQUFFTyxNQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxRQUFBQSxFQUFFLEVBQUU7QUFBTixPQUFEO0FBQVgsS0FIVyxFQUlYO0FBQUVtQixNQUFBQSxJQUFJLEVBQUUsVUFBUjtBQUFvQmYsTUFBQUEsY0FBYyxFQUFFO0FBQXBDLEtBSlcsRUFLWDtBQUFFSyxNQUFBQSxLQUFLLEVBQUU7QUFBVCxLQUxXLENBQWI7QUFPRCxHQXhFTyxDQUFSO0FBMEVBekIsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFNO0FBQ3hCcUIsSUFBQUEsRUFBRSxDQUFDLG9CQUFELDZGQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNGLG9CQUFRbkIsUUFBUixFQUFrQjtBQUFFeUIsZ0JBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLGtCQUFBQSxFQUFFLEVBQUU7QUFBTixpQkFBRDtBQUFYLGVBQWxCLENBREU7O0FBQUE7QUFDakJmLGNBQUFBLE1BRGlCO0FBRXZCc0IsY0FBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixDQUE3Qjs7QUFGdUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBdkIsR0FBRjtBQUtBSCxJQUFBQSxFQUFFLENBQUMsOERBQUQsNkZBQWlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQzVDLG9CQUFRbkIsUUFBUixFQUFrQjtBQUNyQ3lCLGdCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQUQsRUFBYztBQUFFQSxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQWQ7QUFENEIsZUFBbEIsQ0FENEM7O0FBQUE7QUFDM0RmLGNBQUFBLE1BRDJEO0FBSWpFc0IsY0FBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixDQUE3Qjs7QUFKaUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBakUsR0FBRjtBQU9BSCxJQUFBQSxFQUFFLENBQUMsa0VBQUQsNkZBQXFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ2hELG9CQUFRbkIsUUFBUixFQUFrQjtBQUNyQ3lCLGdCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQUQsRUFBYztBQUFFQSxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQWQ7QUFENEIsZUFBbEIsQ0FEZ0Q7O0FBQUE7QUFDL0RmLGNBQUFBLE1BRCtEO0FBSXJFc0IsY0FBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixDQUE3Qjs7QUFKcUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBckUsR0FBRjtBQU9BeEIsSUFBQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLFlBQU07QUFDaENLLE1BQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2YsWUFBTVUsVUFBVSxHQUFHYixRQUFRLENBQUNZLE1BQVQsQ0FBZ0JDLFVBQWhCLENBQTJCYSxNQUEzQixDQUFrQztBQUNuRFosVUFBQUEsRUFBRSxFQUFFLEdBRCtDO0FBRW5EQyxVQUFBQSxPQUFPLEVBQUU7QUFGMEMsU0FBbEMsRUFHaEI7QUFDREQsVUFBQUEsRUFBRSxFQUFFLEdBREg7QUFFREMsVUFBQUEsT0FBTyxFQUFFO0FBRlIsU0FIZ0IsQ0FBbkI7QUFPQWYsUUFBQUEsUUFBUSxtQ0FDSEEsUUFERztBQUVOa0IsVUFBQUEsY0FBYyxFQUFFLElBRlY7QUFHTk4sVUFBQUEsTUFBTSxrQ0FDRFosUUFBUSxDQUFDWSxNQURSO0FBRUpDLFlBQUFBLFVBQVUsRUFBVkE7QUFGSTtBQUhBLFVBQVI7QUFRRCxPQWhCUyxDQUFWO0FBaUJBTSxNQUFBQSxFQUFFLENBQUMsc0JBQUQsNkZBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ0osb0JBQVFuQixRQUFSLEVBQWtCO0FBQUV5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFEO0FBQVgsaUJBQWxCLENBREk7O0FBQUE7QUFDbkJmLGdCQUFBQSxNQURtQjtBQUV6QnNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN3QixLQUFSLENBQU4sQ0FBcUJELE9BQXJCLENBQTZCLENBQTdCOztBQUZ5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUF6QixHQUFGO0FBS0FILE1BQUFBLEVBQUUsQ0FBQyx5RUFBRCw2RkFBNEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDdkQsb0JBQVFuQixRQUFSLEVBQWtCO0FBQ3JDeUIsa0JBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBRCxFQUFjO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBZDtBQUQ0QixpQkFBbEIsQ0FEdUQ7O0FBQUE7QUFDdEVmLGdCQUFBQSxNQURzRTtBQUk1RXNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN3QixLQUFSLENBQU4sQ0FBcUJELE9BQXJCLENBQTZCLElBQTdCOztBQUo0RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUE1RSxHQUFGO0FBT0FILE1BQUFBLEVBQUUsQ0FBQywyREFBRCw2RkFBOEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDekMsb0JBQVFuQixRQUFSLEVBQWtCO0FBQ3JDeUIsa0JBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBRCxFQUFjO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBZDtBQUQ0QixpQkFBbEIsQ0FEeUM7O0FBQUE7QUFDeERmLGdCQUFBQSxNQUR3RDtBQUk5RHNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN3QixLQUFSLENBQU4sQ0FBcUJELE9BQXJCLENBQTZCLElBQTdCOztBQUo4RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUE5RCxHQUFGO0FBT0FILE1BQUFBLEVBQUUsQ0FBQyx3RUFBRCw2RkFBMkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDdEQsb0JBQVFuQixRQUFSLEVBQWtCO0FBQUV5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkO0FBQVgsaUJBQWxCLENBRHNEOztBQUFBO0FBQ3JFZixnQkFBQUEsTUFEcUU7QUFFM0VzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixHQUE3Qjs7QUFGMkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBM0UsR0FBRjtBQU1BSCxNQUFBQSxFQUFFLENBQUMseUVBQUQsNkZBQTRFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ3ZELG9CQUFRbkIsUUFBUixFQUFrQjtBQUFFeUIsa0JBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBRCxFQUFjO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBZCxFQUEyQjtBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQTNCO0FBQVgsaUJBQWxCLENBRHVEOztBQUFBO0FBQ3RFZixnQkFBQUEsTUFEc0U7QUFFNUVzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixJQUE3Qjs7QUFGNEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBNUUsR0FBRjtBQUtBSCxNQUFBQSxFQUFFLENBQUMsc0VBQUQsNkZBQXlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ3BELG9CQUFRbkIsUUFBUixFQUFrQjtBQUNyQ3lCLGtCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQUQsRUFBYztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQWQsRUFBMkI7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUEzQixFQUF3QztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXhDO0FBRDRCLGlCQUFsQixDQURvRDs7QUFBQTtBQUNuRWYsZ0JBQUFBLE1BRG1FO0FBSXpFc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3dCLEtBQVIsQ0FBTixDQUFxQkQsT0FBckIsQ0FBNkIsQ0FBN0I7O0FBSnlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQXpFLEdBQUY7QUFPQUgsTUFBQUEsRUFBRSxDQUFDLHlFQUFELDZGQUE0RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUN2RCxvQkFBUW5CLFFBQVIsRUFBa0I7QUFDckN5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkLEVBQTJCO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBM0I7QUFENEIsaUJBQWxCLENBRHVEOztBQUFBO0FBQ3RFZixnQkFBQUEsTUFEc0U7QUFJNUVzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixJQUE3Qjs7QUFKNEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBNUUsR0FBRjtBQU9BSCxNQUFBQSxFQUFFLENBQUMsd0VBQUQsNkZBQTJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ3RELG9CQUFRbkIsUUFBUixFQUFrQjtBQUNyQ3lCLGtCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQUQsRUFBYztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQWQsRUFBMkI7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUEzQixFQUF3QztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXhDO0FBRDRCLGlCQUFsQixDQURzRDs7QUFBQTtBQUNyRWYsZ0JBQUFBLE1BRHFFO0FBSTNFc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3dCLEtBQVIsQ0FBTixDQUFxQkQsT0FBckIsQ0FBNkIsR0FBN0I7O0FBSjJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQTNFLEdBQUY7QUFPQUgsTUFBQUEsRUFBRSxDQUFDLHdFQUFELDZGQUEyRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUN0RCxvQkFBUW5CLFFBQVIsRUFBa0I7QUFDckN5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkLEVBQTJCO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBM0IsRUFBd0M7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUF4QztBQUQ0QixpQkFBbEIsQ0FEc0Q7O0FBQUE7QUFDckVmLGdCQUFBQSxNQURxRTtBQUkzRXNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN3QixLQUFSLENBQU4sQ0FBcUJELE9BQXJCLENBQTZCLEdBQTdCOztBQUoyRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUEzRSxHQUFGO0FBT0FILE1BQUFBLEVBQUUsQ0FBQyx3RUFBRCw2RkFBMkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDdEQsb0JBQVFuQixRQUFSLEVBQWtCO0FBQ3JDeUIsa0JBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQUVYLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBRCxFQUFjO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBZCxFQUEyQjtBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQTNCLEVBQXdDO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBeEM7QUFENEIsaUJBQWxCLENBRHNEOztBQUFBO0FBQ3JFZixnQkFBQUEsTUFEcUU7QUFJM0VzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixJQUE3Qjs7QUFKMkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBM0UsR0FBRjtBQU9BSCxNQUFBQSxFQUFFLENBQUMsd0VBQUQsNkZBQTJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ3RELG9CQUFRbkIsUUFBUixFQUFrQjtBQUNyQ3lCLGtCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQUQsRUFBYztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQWQsRUFBMkI7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUEzQixFQUF3QztBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXhDO0FBRDRCLGlCQUFsQixDQURzRDs7QUFBQTtBQUNyRWYsZ0JBQUFBLE1BRHFFO0FBSTNFc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3dCLEtBQVIsQ0FBTixDQUFxQkQsT0FBckIsQ0FBNkIsSUFBN0I7O0FBSjJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQTNFLEdBQUY7QUFPQUgsTUFBQUEsRUFBRSxDQUFDLHVFQUFELDZGQUEwRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUNyRCxvQkFBUW5CLFFBQVIsRUFBa0I7QUFDckN5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkLEVBQTJCO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBM0IsRUFBd0M7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUF4QyxFQUFxRDtBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXJEO0FBRDRCLGlCQUFsQixDQURxRDs7QUFBQTtBQUNwRWYsZ0JBQUFBLE1BRG9FO0FBSTFFc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3dCLEtBQVIsQ0FBTixDQUFxQkQsT0FBckIsQ0FBNkIsR0FBN0I7O0FBSjBFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQTFFLEdBQUY7QUFPQUgsTUFBQUEsRUFBRSxDQUFDLHdFQUFELDZGQUEyRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUN0RCxvQkFBUW5CLFFBQVIsRUFBa0I7QUFDckN5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkLEVBQTJCO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBM0IsRUFBd0M7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUF4QyxFQUFxRDtBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXJEO0FBRDRCLGlCQUFsQixDQURzRDs7QUFBQTtBQUNyRWYsZ0JBQUFBLE1BRHFFO0FBSTNFc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3dCLEtBQVIsQ0FBTixDQUFxQkQsT0FBckIsQ0FBNkIsSUFBN0I7O0FBSjJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQTNFLEdBQUY7QUFPQUgsTUFBQUEsRUFBRSxDQUFDLHdFQUFELDZGQUEyRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUN0RCxvQkFBUW5CLFFBQVIsRUFBa0I7QUFDckN5QixrQkFBQUEsT0FBTyxFQUFFLENBQUM7QUFBRVgsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFELEVBQWM7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUFkLEVBQTJCO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBM0IsRUFBd0M7QUFBRUEsb0JBQUFBLEVBQUUsRUFBRTtBQUFOLG1CQUF4QyxFQUFxRDtBQUFFQSxvQkFBQUEsRUFBRSxFQUFFO0FBQU4sbUJBQXJELEVBQWtFO0FBQUVBLG9CQUFBQSxFQUFFLEVBQUU7QUFBTixtQkFBbEU7QUFENEIsaUJBQWxCLENBRHNEOztBQUFBO0FBQ3JFZixnQkFBQUEsTUFEcUU7QUFJM0VzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDd0IsS0FBUixDQUFOLENBQXFCRCxPQUFyQixDQUE2QixHQUE3Qjs7QUFKMkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBM0UsR0FBRjtBQU1ELEtBOUdPLENBQVI7O0FBZ0hBLFFBQU1ZLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0IsQ0FBQ2pDLE9BQUQsRUFBYTtBQUNqQ2tCLE1BQUFBLEVBQUUsK0NBQXdDZ0IsSUFBSSxDQUFDQyxTQUFMLENBQ3hDbkMsT0FEd0MsQ0FBeEMsOEZBRUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDa0Isb0JBQVFELFFBQVIsRUFBa0JDLE9BQWxCLENBRGxCOztBQUFBO0FBQ0dGLGdCQUFBQSxNQURIO0FBRUhzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBRCxDQUFOLENBQWV1QixPQUFmLENBQXVCO0FBQUVDLGtCQUFBQSxLQUFLLEVBQUUsQ0FBVDtBQUFZQyxrQkFBQUEsS0FBSyxFQUFFO0FBQW5CLGlCQUF2Qjs7QUFGRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUZILEdBQUY7QUFNRCxLQVBEOztBQVNBVSxJQUFBQSxhQUFhLENBQUNHLFNBQUQsQ0FBYjtBQUNBSCxJQUFBQSxhQUFhLENBQUMsSUFBRCxDQUFiO0FBQ0FBLElBQUFBLGFBQWEsQ0FBQyxFQUFELENBQWI7QUFDRCxHQWhKTyxDQUFSO0FBa0pBcEMsRUFBQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFNO0FBQ3RCQSxJQUFBQSxRQUFRLENBQUMsY0FBRCxFQUFpQixZQUFNO0FBQzdCSyxNQUFBQSxVQUFVLDZGQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDVEYsZ0JBQUFBLE9BQU8sR0FBRyxFQUFWO0FBQ0FDLGdCQUFBQSxHQUFHLEdBQUc7QUFBRStCLGtCQUFBQSxJQUFJLEVBQUU7QUFBUixpQkFBTjtBQUZTO0FBQUEsdUJBR00sa0JBQU1qQyxRQUFOLEVBQWdCQyxPQUFoQixFQUF5QkMsR0FBekIsQ0FITjs7QUFBQTtBQUdUSCxnQkFBQUEsTUFIUzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFELEdBQVY7QUFNQW9CLE1BQUFBLEVBQUUsQ0FBQyxrQkFBRCxFQUFxQixZQUFNO0FBQzNCRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN1QyxRQUFSLENBQU4sQ0FBd0JoQixPQUF4QixDQUFnQyxLQUFoQztBQUNELE9BRkMsQ0FBRjtBQUlBSCxNQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFNO0FBQ3ZCRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUNrQyxJQUFSLENBQU4sQ0FBb0JYLE9BQXBCLENBQTRCLFFBQTVCO0FBQ0QsT0FGQyxDQUFGO0FBSUFILE1BQUFBLEVBQUUsQ0FBQyxnQkFBRCxFQUFtQixZQUFNO0FBQ3pCRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUNLLE1BQVIsQ0FBTixDQUFzQmtCLE9BQXRCLENBQThCLFFBQTlCO0FBQ0QsT0FGQyxDQUFGO0FBSUFILE1BQUFBLEVBQUUsQ0FBQyxvQkFBRCxFQUF1QixZQUFNO0FBQzdCRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUNRLFVBQVIsQ0FBTixDQUEwQmUsT0FBMUIsQ0FBa0M7QUFBRWQsVUFBQUEsTUFBTSxFQUFFLENBQVY7QUFBYUMsVUFBQUEsS0FBSyxFQUFFO0FBQXBCLFNBQWxDO0FBQ0QsT0FGQyxDQUFGO0FBSUFVLE1BQUFBLEVBQUUsQ0FBQyxzQkFBRCxFQUF5QixZQUFNO0FBQy9CRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUNXLFlBQVIsQ0FBTixDQUE0QlksT0FBNUIsQ0FBb0MsTUFBcEM7QUFDRCxPQUZDLENBQUY7QUFJQUgsTUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLFlBQU07QUFDL0JFLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ1ksWUFBUixDQUFOLENBQTRCVyxPQUE1QixDQUFvQyxXQUFwQztBQUNELE9BRkMsQ0FBRjtBQUlBSCxNQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsWUFBTTtBQUNsQ0UsUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDa0IsZUFBUixDQUFOLENBQStCSyxPQUEvQixDQUF1QyxJQUF2QztBQUNELE9BRkMsQ0FBRjtBQUlBSCxNQUFBQSxFQUFFLENBQUMsZ0JBQUQsRUFBbUIsWUFBTTtBQUN6QkUsUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDYSxNQUFQLENBQWNDLFVBQWYsQ0FBTixDQUFpQ1MsT0FBakMsQ0FDRUQsTUFBTSxDQUFDa0IsZUFBUCxDQUF1QixDQUNyQjtBQUFFekIsVUFBQUEsRUFBRSxFQUFFLEdBQU47QUFBV0MsVUFBQUEsT0FBTyxFQUFFO0FBQXBCLFNBRHFCLEVBRXJCO0FBQUVELFVBQUFBLEVBQUUsRUFBRTtBQUFOLFNBRnFCLEVBR3JCO0FBQUVBLFVBQUFBLEVBQUUsRUFBRTtBQUFOLFNBSHFCLENBQXZCLENBREY7QUFPQU8sUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDYSxNQUFQLENBQWNJLFFBQWYsQ0FBTixDQUErQk0sT0FBL0IsQ0FDRUQsTUFBTSxDQUFDa0IsZUFBUCxDQUF1QixDQUFDO0FBQUV6QixVQUFBQSxFQUFFLEVBQUUsR0FBTjtBQUFXQyxVQUFBQSxPQUFPLEVBQUU7QUFBcEIsU0FBRCxDQUF2QixDQURGO0FBR0QsT0FYQyxDQUFGO0FBYUFJLE1BQUFBLEVBQUUsQ0FBQyxpQ0FBRCxFQUFvQyxZQUFNO0FBQzFDRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN5QyxlQUFSLENBQU4sQ0FBK0JDLElBQS9CLENBQW9DSixTQUFwQztBQUNELE9BRkMsQ0FBRjtBQUdELEtBbkRPLENBQVI7QUFxREF2QyxJQUFBQSxRQUFRLENBQUMsWUFBRCxFQUFlLFlBQU07QUFDM0JLLE1BQUFBLFVBQVUsNkZBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNURixnQkFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDQUMsZ0JBQUFBLEdBQUcsR0FBRztBQUFFK0Isa0JBQUFBLElBQUksRUFBRTtBQUFSLGlCQUFOO0FBRlM7QUFBQSx1QkFHTSxrQkFBTWpDLFFBQU4sRUFBZ0JDLE9BQWhCLEVBQXlCQyxHQUF6QixDQUhOOztBQUFBO0FBR1RILGdCQUFBQSxNQUhTOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUQsR0FBVjtBQU1Bb0IsTUFBQUEsRUFBRSxDQUFDLGtCQUFELEVBQXFCLFlBQU07QUFDM0JFLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3VDLFFBQVIsQ0FBTixDQUF3QmhCLE9BQXhCLENBQWdDLElBQWhDO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0FWTyxDQUFSO0FBWUF4QixJQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBTTtBQUMvQkssTUFBQUEsVUFBVSw2RkFBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1RGLGdCQUFBQSxPQUFPLEdBQUc7QUFBRXdCLGtCQUFBQSxPQUFPLEVBQUU7QUFBWCxpQkFBVjtBQUNBdkIsZ0JBQUFBLEdBQUcsR0FBRztBQUFFK0Isa0JBQUFBLElBQUksRUFBRTtBQUFSLGlCQUFOO0FBRlM7QUFBQSx1QkFHTSxrQkFBTWpDLFFBQU4sRUFBZ0JDLE9BQWhCLEVBQXlCQyxHQUF6QixDQUhOOztBQUFBO0FBR1RILGdCQUFBQSxNQUhTO0FBQUEsbURBSUZBLE1BSkU7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBRCxHQUFWO0FBT0FvQixNQUFBQSxFQUFFLENBQUMsNEJBQUQsRUFBK0IsWUFBTTtBQUNyQ0UsUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDYSxNQUFQLENBQWNDLFVBQWYsQ0FBTixDQUFpQ1MsT0FBakMsQ0FDRUQsTUFBTSxDQUFDa0IsZUFBUCxDQUF1QixDQUNyQjtBQUFFekIsVUFBQUEsRUFBRSxFQUFFLEdBQU47QUFBV0MsVUFBQUEsT0FBTyxFQUFFO0FBQXBCLFNBRHFCLEVBRXJCO0FBQUVELFVBQUFBLEVBQUUsRUFBRTtBQUFOLFNBRnFCLEVBR3JCO0FBQUVBLFVBQUFBLEVBQUUsRUFBRTtBQUFOLFNBSHFCLENBQXZCLENBREY7QUFPQU8sUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDYSxNQUFQLENBQWNJLFFBQWYsQ0FBTixDQUErQk0sT0FBL0IsQ0FDRUQsTUFBTSxDQUFDa0IsZUFBUCxDQUF1QixDQUFDO0FBQUV6QixVQUFBQSxFQUFFLEVBQUUsR0FBTjtBQUFXQyxVQUFBQSxPQUFPLEVBQUU7QUFBcEIsU0FBRCxDQUF2QixDQURGO0FBR0QsT0FYQyxDQUFGO0FBYUFJLE1BQUFBLEVBQUUsQ0FBQyw2QkFBRCxFQUFnQyxZQUFNO0FBQ3RDRSxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN5QyxlQUFSLENBQU4sQ0FBK0JsQixPQUEvQixDQUF1QyxLQUF2QztBQUNELE9BRkMsQ0FBRjtBQUdELEtBeEJPLENBQVI7QUF5QkQsR0EzRk8sQ0FBUjtBQTZGQXhCLEVBQUFBLFFBQVEsQ0FBQyxtQkFBRCxFQUFzQixZQUFNO0FBQ2xDLFFBQU00QyxzQkFBc0IsR0FBRyxTQUF6QkEsc0JBQXlCLENBQUN6QyxPQUFELEVBQWE7QUFDMUNrQixNQUFBQSxFQUFFLGlEQUEwQ2dCLElBQUksQ0FBQ0MsU0FBTCxDQUMxQ25DLE9BRDBDLENBQTFDLEdBRUcsWUFBTTtBQUNUb0IsUUFBQUEsTUFBTSxDQUFDLDhCQUFrQnJCLFFBQWxCLEVBQTRCQyxPQUE1QixDQUFELENBQU4sQ0FBNkNxQixPQUE3QyxDQUFxRCxLQUFyRDtBQUNELE9BSkMsQ0FBRjtBQUtELEtBTkQ7O0FBUUFvQixJQUFBQSxzQkFBc0IsQ0FBQ0wsU0FBRCxDQUF0QjtBQUNBSyxJQUFBQSxzQkFBc0IsQ0FBQyxJQUFELENBQXRCO0FBQ0FBLElBQUFBLHNCQUFzQixDQUFDLEVBQUQsQ0FBdEI7QUFDRCxHQVpPLENBQVI7QUFjQTVDLEVBQUFBLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixZQUFNO0FBQ2pDcUIsSUFBQUEsRUFBRSxDQUFDLDRDQUFELDZGQUErQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUM1Qix5Q0FBNkJuQixRQUE3QixFQUF1QztBQUN4RGlDLGdCQUFBQSxJQUFJLEVBQUUsUUFEa0Q7QUFFeERVLGdCQUFBQSxJQUFJLEVBQUU7QUFGa0QsZUFBdkMsQ0FENEI7O0FBQUE7QUFDekNDLGNBQUFBLElBRHlDO0FBSy9DdkIsY0FBQUEsTUFBTSxDQUFDdUIsSUFBRCxDQUFOLENBQWF0QixPQUFiLENBQXFCO0FBQUVHLGdCQUFBQSxPQUFPLEVBQUUsQ0FBQztBQUFFWCxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQUQsRUFBYztBQUFFQSxrQkFBQUEsRUFBRSxFQUFFO0FBQU4saUJBQWQsQ0FBWDtBQUF1Q0EsZ0JBQUFBLEVBQUUsRUFBRTtBQUEzQyxlQUFyQjs7QUFMK0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBL0MsR0FBRjtBQVFBSyxJQUFBQSxFQUFFLENBQUMsNkJBQUQsNkZBQWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ1QseUNBQTZCbkIsUUFBN0IsRUFBdUM7QUFDNURpQyxnQkFBQUEsSUFBSSxFQUFFLFFBRHNEO0FBRTVEVSxnQkFBQUEsSUFBSSxFQUFFO0FBRnNELGVBQXZDLENBRFM7O0FBQUE7QUFDMUJFLGNBQUFBLFFBRDBCO0FBS2hDeEIsY0FBQUEsTUFBTSxDQUFDd0IsUUFBRCxDQUFOLENBQWlCQyxRQUFqQjs7QUFMZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBaEMsR0FBRjtBQU9ELEdBaEJPLENBQVI7QUFpQkQsQ0EvWE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNSZXNwb25zZUNvcnJlY3QgfSBmcm9tICcuLi91dGlscyc7XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgcmVzdWx0LCBxdWVzdGlvbiwgc2Vzc2lvbiwgZW52O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHF1ZXN0aW9uID0ge1xuICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBpbWFnZVVybDogJycsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICB9LFxuICAgICAgb3V0bGluZUNvbG9yOiAnYmx1ZScsXG4gICAgICBob3RzcG90Q29sb3I6ICdsaWdodGJsdWUnLFxuICAgICAgc2hhcGVzOiB7XG4gICAgICAgIHJlY3RhbmdsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBvbHlnb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICc0JyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZUNvcnJlY3Q6IHRydWUsXG4gICAgICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG4gICAgfTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUgcGFydGlhbFNjb3JpbmcgdGVzdCcsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdoYW5naW5nIGNvbnRyb2xsZXInLCAoKT0+IHtcblxuICAgICAgaXQoJ2RvZXNudCBoYW5nIGlmIGFuc3dlcnMgaXMgbWlzc2luZycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvdXRjb21lKHt9LCB7aWQ6IFwiMVwifSwge30pO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoe3Njb3JlOiAwLCBlbXB0eTogdHJ1ZX0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzbnQgaGFuZyBpZiB0aGUgcmVzdCBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG91dGNvbWUoe30sIHtpZDogXCIxXCIsIGFuc3dlcnM6IHt9fSwge30pO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoe3Njb3JlOiAwIH0pO1xuICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjb25zdCByZWN0YW5nbGVzID0gcXVlc3Rpb24uc2hhcGVzLnJlY3RhbmdsZXMuY29uY2F0KHtcbiAgICAgICAgaWQ6ICc1JyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICBzaGFwZXM6IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbi5zaGFwZXMsXG4gICAgICAgICAgcmVjdGFuZ2xlcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCBzZXNzaW9uVmFsdWUsIGVudiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7IC4uLnF1ZXN0aW9uLCAuLi5leHRyYSB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnZcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAgfVxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAgfVxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScsIHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHNjb3JlOiAwIH1cbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScsIHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBzY29yZTogMCB9XG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgc2NvcmUgb2YgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgYW5zd2VyczogW3sgaWQ6ICcyJyB9XSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBzY29yZSBvZiAxIChwYXJ0aWFsU2NvcmluZzogZmFsc2UsIGFuc3dlcnMgaW4gb3JkZXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc0JyB9XSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHNjb3JlIG9mIDEgKHBhcnRpYWxTY29yaW5nOiBmYWxzZSwgYW5zd2VycyBub3QgaW4gb3JkZXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzQnIH0sIHsgaWQ6ICcxJyB9XSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwYXJ0aWFsIHNjb3JpbmcnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlcyA9IHF1ZXN0aW9uLnNoYXBlcy5yZWN0YW5nbGVzLmNvbmNhdCh7XG4gICAgICAgICAgaWQ6ICc1JyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICc2JyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICAgICAgc2hhcGVzOiB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbi5zaGFwZXMsXG4gICAgICAgICAgICByZWN0YW5nbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC4yNSBmb3IgMS80IGNvcnJlY3QgYW5zd2VycyBhbmQgMCBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnMicgfSwgeyBpZDogJzUnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjI1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuMjUsIGV2ZW4gaWYgYW5zd2VycyBhcmUgbm90IGluIG9yZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgYW5zd2VyczogW3sgaWQ6ICc1JyB9LCB7IGlkOiAnMicgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuMjUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAyLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAwIGluY29ycmVjdCBhbnN3ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IGFuc3dlcnM6IFt7IGlkOiAnNScgfSwgeyBpZDogJzQnfV0gfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC43NSBmb3IgMy80IGNvcnJlY3QgYW5zd2VycyBhbmQgMCBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc1JyB9LCB7IGlkOiAnNCd9XSB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDEgZm9yIDQvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDAgaW5jb3JyZWN0IGFuc3dlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzYnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuMjUgZm9yIDEvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDIgaW5jb3JyZWN0IGFuc3dlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuMjUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAyLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAyIGluY29ycmVjdCBhbnN3ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgYW5zd2VyczogW3sgaWQ6ICcxJyB9LCB7IGlkOiAnNCcgfSwgeyBpZDogJzInIH0sIHsgaWQ6ICczJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNSBmb3IgMi80IGNvcnJlY3QgYW5zd2VycyBhbmQgMiBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnMScgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuNSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgYSBzY29yZSBvZiAwLjc1IGZvciAzLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAxIGluY29ycmVjdCBhbnN3ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzYnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnMScgfSwgeyBpZDogJzMnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNzUgZm9yIDMvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDEgaW5jb3JyZWN0IGFuc3dlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcxJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuNzUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAzLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAyIGluY29ycmVjdCBhbnN3ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzYnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnMicgfSwgeyBpZDogJzMnIH0sIHsgaWQ6ICcxJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNzUgZm9yIDQvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDEgaW5jb3JyZWN0IGFuc3dlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzEnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNSBmb3IgNC80IGNvcnJlY3QgYW5zd2VycyBhbmQgMiBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzEnIH0sIHsgaWQ6ICczJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuT3V0Y29tZSA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgcmV0dXJucyBlbXB0eTogdHJ1ZSB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgc2Vzc2lvblxuICAgICAgKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHNlc3Npb24pO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5OiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk91dGNvbWUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5PdXRjb21lKG51bGwpO1xuICAgIHJldHVybk91dGNvbWUoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ21vZGU6IGdhdGhlcicsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIG1vZGUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQubW9kZSkudG9FcXVhbCgnZ2F0aGVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnByb21wdCkudG9FcXVhbCgncHJvbXB0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGltZW5zaW9ucycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaW1lbnNpb25zKS50b0VxdWFsKHsgaGVpZ2h0OiAwLCB3aWR0aDogMCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBvdXRsaW5lQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQub3V0bGluZUNvbG9yKS50b0VxdWFsKCdibHVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgaG90c3BvdENvbG9yJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmhvdHNwb3RDb2xvcikudG9FcXVhbCgnbGlnaHRibHVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbXVsdGlwbGVDb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0Lm11bHRpcGxlQ29ycmVjdCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBzaGFwZXMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2hhcGVzLnJlY3RhbmdsZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7IGlkOiAnMScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIHsgaWQ6ICcyJyB9LFxuICAgICAgICAgICAgeyBpZDogJzMnIH0sXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zaGFwZXMucG9seWdvbnMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbeyBpZDogJzQnLCBjb3JyZWN0OiB0cnVlIH1dKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZXR1cm4gcmVzcG9uc2VDb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnJlc3BvbnNlQ29ycmVjdCkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogdmlldycsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmRpc2FibGVkKS50b0VxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogZXZhbHVhdGUnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHsgYW5zd2VyczogW10gfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zaGFwZXMucmVjdGFuZ2xlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHsgaWQ6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBpZDogJzInIH0sXG4gICAgICAgICAgICB7IGlkOiAnMycgfSxcbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNoYXBlcy5wb2x5Z29ucykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFt7IGlkOiAnNCcsIGNvcnJlY3Q6IHRydWUgfV0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgaXMgcmVzcG9uc2UgY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZUNvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1Jlc3BvbnNlQ29ycmVjdCcsICgpID0+IHtcbiAgICBjb25zdCByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0ID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGByZXNwb25zZSBpcyBub3QgY29ycmVjdCBpZiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHNlc3Npb25cbiAgICAgICl9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QoaXNSZXNwb25zZUNvcnJlY3QocXVlc3Rpb24sIHNlc3Npb24pKS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0KHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuSXNSZXNwb25zZUNvcmVjdChudWxsKTtcbiAgICByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0KHt9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiBlbnYgaXMgY29ycmVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgYW5zd2VyczogW3sgaWQ6ICcxJyB9LCB7IGlkOiAnNCcgfV0sIGlkOiAnMScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnc3R1ZGVudCcsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|