@pie-element/hotspot 4.10.13 → 4.10.16-next.1
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 +0 -35
- package/configure/CHANGELOG.md +0 -32
- package/configure/lib/__tests__/hotspot-container.test.js +281 -0
- package/configure/lib/__tests__/hotspot-drawable.test.js +241 -0
- package/configure/lib/__tests__/index.test.js +224 -0
- package/configure/lib/__tests__/root.test.js +443 -0
- package/configure/lib/__tests__/utils.test.js +335 -0
- package/configure/lib/button.js +1 -1
- package/configure/lib/defaults.js +6 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-container.js +3 -3
- package/configure/lib/hotspot-drawable.js +3 -3
- package/configure/lib/hotspot-drawable.js.map +1 -1
- 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 +3 -3
- package/configure/lib/root.js +61 -10
- package/configure/lib/root.js.map +1 -1
- package/configure/lib/upload-control.js +1 -1
- package/configure/lib/utils.js +4 -4
- package/configure/package.json +3 -3
- package/configure/src/__tests__/__snapshots__/root.test.js.snap +6 -0
- package/configure/src/defaults.js +5 -0
- package/configure/src/root.jsx +43 -3
- package/controller/lib/__tests__/index.test.js +921 -0
- package/controller/lib/__tests__/utils.test.js +8 -0
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +40 -4
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -1
- package/controller/src/index.js +26 -0
- package/docs/demo/pie.manifest.json +11 -0
- package/docs/pie-schema.json +6 -0
- package/docs/pie-schema.json.md +4 -0
- package/lib/__tests__/container-test.js +185 -0
- package/lib/__tests__/image-test.js +63 -0
- package/lib/__tests__/polygon-test.js +99 -0
- package/lib/__tests__/rectangle-test.js +92 -0
- package/lib/__tests__/session-updater-test.js +78 -0
- 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 +5 -1
- package/lib/hotspot/index.js.map +1 -1
- package/lib/hotspot/polygon.js +1 -1
- package/lib/hotspot/rectangle.js +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/session-updater.js +1 -1
- package/package.json +4 -4
- package/src/hotspot/index.jsx +4 -0
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,921 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiaW1hZ2VVcmwiLCJkaW1lbnNpb25zIiwiaGVpZ2h0Iiwid2lkdGgiLCJvdXRsaW5lQ29sb3IiLCJob3RzcG90Q29sb3IiLCJzaGFwZXMiLCJyZWN0YW5nbGVzIiwiaWQiLCJjb3JyZWN0IiwicG9seWdvbnMiLCJtdWx0aXBsZUNvcnJlY3QiLCJwYXJ0aWFsU2NvcmluZyIsIml0IiwicmVzcG9uc2UiLCJleHBlY3QiLCJ0b0VxdWFsIiwic2NvcmUiLCJlbXB0eSIsImFuc3dlcnMiLCJjb25jYXQiLCJhc3NlcnRPdXRjb21lIiwibWVzc2FnZSIsImV4dHJhIiwic2Vzc2lvblZhbHVlIiwiZXhwZWN0ZWQiLCJvYmplY3RDb250YWluaW5nIiwibW9kZSIsInJldHVybk91dGNvbWUiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwiZGlzYWJsZWQiLCJhcnJheUNvbnRhaW5pbmciLCJyZXNwb25zZUNvcnJlY3QiLCJ0b0JlIiwicmV0dXJuSXNSZXNwb25zZUNvcmVjdCIsInJvbGUiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFNO0FBQzNCLE1BQUlDLE1BQUosRUFBWUMsUUFBWixFQUFzQkMsT0FBdEIsRUFBK0JDLEdBQS9CO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2ZILElBQUFBLFFBQVEsR0FBRztBQUNUSSxNQUFBQSxNQUFNLEVBQUUsUUFEQztBQUVUQyxNQUFBQSxhQUFhLEVBQUUsSUFGTjtBQUdUQyxNQUFBQSxRQUFRLEVBQUUsRUFIRDtBQUlUQyxNQUFBQSxVQUFVLEVB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LGVBQXZDLENBRFM7O0FBQUE7QUFDMUJFLGNBQUFBLFFBRDBCO0FBS2hDeEIsY0FBQUEsTUFBTSxDQUFDd0IsUUFBRCxDQUFOLENBQWlCQyxRQUFqQjs7QUFMZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBaEMsR0FBRjtBQU9ELEdBaEJPLENBQVI7QUFpQkQsQ0EvWE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNSZXNwb25zZUNvcnJlY3QgfSBmcm9tICcuLi91dGlscyc7XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgcmVzdWx0LCBxdWVzdGlvbiwgc2Vzc2lvbiwgZW52O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHF1ZXN0aW9uID0ge1xuICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBpbWFnZVVybDogJycsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICB9LFxuICAgICAgb3V0bGluZUNvbG9yOiAnYmx1ZScsXG4gICAgICBob3RzcG90Q29sb3I6ICdsaWdodGJsdWUnLFxuICAgICAgc2hhcGVzOiB7XG4gICAgICAgIHJlY3RhbmdsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBvbHlnb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICc0JyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZUNvcnJlY3Q6IHRydWUsXG4gICAgICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG4gICAgfTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUgcGFydGlhbFNjb3JpbmcgdGVzdCcsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdoYW5naW5nIGNvbnRyb2xsZXInLCAoKT0+IHtcblxuICAgICAgaXQoJ2RvZXNudCBoYW5nIGlmIGFuc3dlcnMgaXMgbWlzc2luZycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvdXRjb21lKHt9LCB7aWQ6IFwiMVwifSwge30pO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoe3Njb3JlOiAwLCBlbXB0eTogdHJ1ZX0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzbnQgaGFuZyBpZiB0aGUgcmVzdCBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG91dGNvbWUoe30sIHtpZDogXCIxXCIsIGFuc3dlcnM6IHt9fSwge30pO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoe3Njb3JlOiAwIH0pO1xuICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjb25zdCByZWN0YW5nbGVzID0gcXVlc3Rpb24uc2hhcGVzLnJlY3RhbmdsZXMuY29uY2F0KHtcbiAgICAgICAgaWQ6ICc1JyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICBzaGFwZXM6IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbi5zaGFwZXMsXG4gICAgICAgICAgcmVjdGFuZ2xlcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCBzZXNzaW9uVmFsdWUsIGVudiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7IC4uLnF1ZXN0aW9uLCAuLi5leHRyYSB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnZcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAgfVxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAgfVxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScsIHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHNjb3JlOiAwIH1cbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScsIHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyBzY29yZTogMCB9XG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgc2NvcmUgb2YgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgYW5zd2VyczogW3sgaWQ6ICcyJyB9XSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBzY29yZSBvZiAxIChwYXJ0aWFsU2NvcmluZzogZmFsc2UsIGFuc3dlcnMgaW4gb3JkZXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc0JyB9XSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHNjb3JlIG9mIDEgKHBhcnRpYWxTY29yaW5nOiBmYWxzZSwgYW5zd2VycyBub3QgaW4gb3JkZXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzQnIH0sIHsgaWQ6ICcxJyB9XSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwYXJ0aWFsIHNjb3JpbmcnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlcyA9IHF1ZXN0aW9uLnNoYXBlcy5yZWN0YW5nbGVzLmNvbmNhdCh7XG4gICAgICAgICAgaWQ6ICc1JyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgaWQ6ICc2JyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICAgICAgc2hhcGVzOiB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbi5zaGFwZXMsXG4gICAgICAgICAgICByZWN0YW5nbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyBhbnN3ZXJzOiBbeyBpZDogJzInIH1dIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC4yNSBmb3IgMS80IGNvcnJlY3QgYW5zd2VycyBhbmQgMCBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnMicgfSwgeyBpZDogJzUnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjI1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuMjUsIGV2ZW4gaWYgYW5zd2VycyBhcmUgbm90IGluIG9yZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgYW5zd2VyczogW3sgaWQ6ICc1JyB9LCB7IGlkOiAnMicgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuMjUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAyLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAwIGluY29ycmVjdCBhbnN3ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IGFuc3dlcnM6IFt7IGlkOiAnNScgfSwgeyBpZDogJzQnfV0gfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC43NSBmb3IgMy80IGNvcnJlY3QgYW5zd2VycyBhbmQgMCBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc1JyB9LCB7IGlkOiAnNCd9XSB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDEgZm9yIDQvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDAgaW5jb3JyZWN0IGFuc3dlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzYnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuMjUgZm9yIDEvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDIgaW5jb3JyZWN0IGFuc3dlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuMjUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAyLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAyIGluY29ycmVjdCBhbnN3ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgYW5zd2VyczogW3sgaWQ6ICcxJyB9LCB7IGlkOiAnNCcgfSwgeyBpZDogJzInIH0sIHsgaWQ6ICczJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNSBmb3IgMi80IGNvcnJlY3QgYW5zd2VycyBhbmQgMiBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnMScgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuNSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgYSBzY29yZSBvZiAwLjc1IGZvciAzLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAxIGluY29ycmVjdCBhbnN3ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzYnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnMScgfSwgeyBpZDogJzMnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNzUgZm9yIDMvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDEgaW5jb3JyZWN0IGFuc3dlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcxJyB9LCB7IGlkOiAnMycgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDAuNzUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGEgc2NvcmUgb2YgMC41IGZvciAzLzQgY29ycmVjdCBhbnN3ZXJzIGFuZCAyIGluY29ycmVjdCBhbnN3ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHtcbiAgICAgICAgICBhbnN3ZXJzOiBbeyBpZDogJzYnIH0sIHsgaWQ6ICc0JyB9LCB7IGlkOiAnMicgfSwgeyBpZDogJzMnIH0sIHsgaWQ6ICcxJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNzUgZm9yIDQvNCBjb3JyZWN0IGFuc3dlcnMgYW5kIDEgaW5jb3JyZWN0IGFuc3dlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzEnIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwLjc1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBhIHNjb3JlIG9mIDAuNSBmb3IgNC80IGNvcnJlY3QgYW5zd2VycyBhbmQgMiBpbmNvcnJlY3QgYW5zd2VycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge1xuICAgICAgICAgIGFuc3dlcnM6IFt7IGlkOiAnNicgfSwgeyBpZDogJzQnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnNScgfSwgeyBpZDogJzEnIH0sIHsgaWQ6ICczJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMC41KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuT3V0Y29tZSA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgcmV0dXJucyBlbXB0eTogdHJ1ZSB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgc2Vzc2lvblxuICAgICAgKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHNlc3Npb24pO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5OiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk91dGNvbWUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5PdXRjb21lKG51bGwpO1xuICAgIHJldHVybk91dGNvbWUoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ21vZGU6IGdhdGhlcicsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIG1vZGUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQubW9kZSkudG9FcXVhbCgnZ2F0aGVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnByb21wdCkudG9FcXVhbCgncHJvbXB0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGltZW5zaW9ucycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaW1lbnNpb25zKS50b0VxdWFsKHsgaGVpZ2h0OiAwLCB3aWR0aDogMCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBvdXRsaW5lQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQub3V0bGluZUNvbG9yKS50b0VxdWFsKCdibHVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgaG90c3BvdENvbG9yJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmhvdHNwb3RDb2xvcikudG9FcXVhbCgnbGlnaHRibHVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbXVsdGlwbGVDb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0Lm11bHRpcGxlQ29ycmVjdCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBzaGFwZXMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2hhcGVzLnJlY3RhbmdsZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7IGlkOiAnMScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIHsgaWQ6ICcyJyB9LFxuICAgICAgICAgICAgeyBpZDogJzMnIH0sXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zaGFwZXMucG9seWdvbnMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbeyBpZDogJzQnLCBjb3JyZWN0OiB0cnVlIH1dKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZXR1cm4gcmVzcG9uc2VDb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnJlc3BvbnNlQ29ycmVjdCkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogdmlldycsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmRpc2FibGVkKS50b0VxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbW9kZTogZXZhbHVhdGUnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHsgYW5zd2VyczogW10gfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zaGFwZXMucmVjdGFuZ2xlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHsgaWQ6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBpZDogJzInIH0sXG4gICAgICAgICAgICB7IGlkOiAnMycgfSxcbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgICBleHBlY3QocmVzdWx0LnNoYXBlcy5wb2x5Z29ucykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFt7IGlkOiAnNCcsIGNvcnJlY3Q6IHRydWUgfV0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgaXMgcmVzcG9uc2UgY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZUNvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1Jlc3BvbnNlQ29ycmVjdCcsICgpID0+IHtcbiAgICBjb25zdCByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0ID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGByZXNwb25zZSBpcyBub3QgY29ycmVjdCBpZiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHNlc3Npb25cbiAgICAgICl9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QoaXNSZXNwb25zZUNvcnJlY3QocXVlc3Rpb24sIHNlc3Npb24pKS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0KHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuSXNSZXNwb25zZUNvcmVjdChudWxsKTtcbiAgICByZXR1cm5Jc1Jlc3BvbnNlQ29yZWN0KHt9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiBlbnYgaXMgY29ycmVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgYW5zd2VyczogW3sgaWQ6ICcxJyB9LCB7IGlkOiAnNCcgfV0sIGlkOiAnMScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnc3R1ZGVudCcsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|