@pie-element/multiple-choice 9.18.0 → 9.19.0-beta.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/configure/CHANGELOG.md +8 -0
  3. package/configure/lib/__tests__/root.test.js +271 -0
  4. package/configure/lib/defaults.js +1 -1
  5. package/configure/lib/index.js +2 -2
  6. package/configure/lib/main.js +7 -7
  7. package/configure/lib/utils.js +1 -1
  8. package/configure/package.json +4 -2
  9. package/controller/CHANGELOG.md +8 -0
  10. package/controller/lib/__tests__/index.test.js +867 -0
  11. package/controller/lib/__tests__/utils.test.js +8 -0
  12. package/controller/lib/defaults.js +1 -1
  13. package/controller/lib/index.js +2 -2
  14. package/controller/lib/utils.js +1 -1
  15. package/controller/package.json +2 -2
  16. package/docs/demo/pie.manifest.json +11 -0
  17. package/lib/__tests__/choice-input-test.js +131 -0
  18. package/lib/__tests__/index-test.js +183 -0
  19. package/lib/__tests__/key-events-test.js +98 -0
  20. package/lib/__tests__/multiple-choice-test.js +235 -0
  21. package/lib/__tests__/session-updater-test.js +72 -0
  22. package/lib/choice-input.js +2 -2
  23. package/lib/choice.js +1 -1
  24. package/lib/feedback-tick.js +2 -2
  25. package/lib/index.js +3 -3
  26. package/lib/main.js +2 -2
  27. package/lib/multiple-choice.js +5 -5
  28. package/lib/print.js +2 -2
  29. package/lib/session-updater.js +1 -1
  30. package/package.json +6 -3
  31. package/configure/lib/defaults.js.map +0 -1
  32. package/configure/lib/index.js.map +0 -1
  33. package/configure/lib/main.js.map +0 -1
  34. package/configure/lib/utils.js.map +0 -1
  35. package/controller/lib/defaults.js.map +0 -1
  36. package/controller/lib/index.js.map +0 -1
  37. package/controller/lib/utils.js.map +0 -1
  38. package/lib/choice-input.js.map +0 -1
  39. package/lib/choice.js.map +0 -1
  40. package/lib/feedback-tick.js.map +0 -1
  41. package/lib/index.js.map +0 -1
  42. package/lib/main.js.map +0 -1
  43. package/lib/multiple-choice.js.map +0 -1
  44. package/lib/print.js.map +0 -1
  45. package/lib/session-updater.js.map +0 -1
  46. package/module/configure.js +0 -11070
  47. package/module/controller.js +0 -3601
  48. package/module/demo.js +0 -86
  49. package/module/element.js +0 -13448
  50. package/module/index.html +0 -21
  51. package/module/manifest.json +0 -14
  52. package/module/print-demo.js +0 -124
  53. package/module/print.html +0 -18
  54. package/module/print.js +0 -13204
@@ -0,0 +1,867 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
6
+
7
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
+
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+
13
+ var _index = require("../index");
14
+
15
+ var _utils = require("../utils");
16
+
17
+ var _defaults = _interopRequireDefault(require("../defaults"));
18
+
19
+ var _templateObject, _templateObject2, _templateObject3;
20
+
21
+ 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; }
22
+
23
+ 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; }
24
+
25
+ jest.mock('../utils', function () {
26
+ return {
27
+ isResponseCorrect: jest.fn()
28
+ };
29
+ });
30
+ describe('controller', function () {
31
+ var result, question, session, env;
32
+ beforeEach(function () {
33
+ question = {
34
+ id: '1',
35
+ element: 'multiple-choice',
36
+ prompt: 'prompt',
37
+ promptEnabled: true,
38
+ choicePrefix: 'letters',
39
+ choiceMode: 'radio',
40
+ feedbackEnabled: true,
41
+ choices: [{
42
+ label: 'a',
43
+ value: 'apple',
44
+ correct: true,
45
+ feedback: {
46
+ type: 'custom',
47
+ value: 'foo'
48
+ }
49
+ }, {
50
+ label: 'b',
51
+ value: 'banana',
52
+ feedback: {
53
+ type: 'default'
54
+ }
55
+ }]
56
+ };
57
+ });
58
+ var stringify = JSON.stringify;
59
+ describe('model', function () {
60
+ describe('mode: gather', function () {
61
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
62
+ return _regenerator["default"].wrap(function _callee$(_context) {
63
+ while (1) {
64
+ switch (_context.prev = _context.next) {
65
+ case 0:
66
+ session = {};
67
+ env = {
68
+ mode: 'gather'
69
+ };
70
+ _context.next = 4;
71
+ return (0, _index.model)(question, session, env);
72
+
73
+ case 4:
74
+ result = _context.sent;
75
+
76
+ case 5:
77
+ case "end":
78
+ return _context.stop();
79
+ }
80
+ }
81
+ }, _callee);
82
+ })));
83
+ it('returns disabled', function () {
84
+ expect(result.disabled).toEqual(false);
85
+ });
86
+ it('returns mode', function () {
87
+ expect(result.mode).toEqual('gather');
88
+ });
89
+ it('returns prompt', function () {
90
+ expect(result.prompt).toEqual('prompt');
91
+ });
92
+ it('returns choiceMode', function () {
93
+ expect(result.choiceMode).toEqual('radio');
94
+ });
95
+ it('returns choicePrefix', function () {
96
+ expect(result.keyMode).toEqual('letters');
97
+ });
98
+ it('returns choices', function () {
99
+ expect(result.choices).toEqual(expect.arrayContaining([{
100
+ label: 'a',
101
+ value: 'apple',
102
+ rationale: null
103
+ }, {
104
+ label: 'b',
105
+ value: 'banana',
106
+ rationale: null
107
+ }]));
108
+ });
109
+ it('does not return responseCorrect', function () {
110
+ expect(result.responseCorrect).toBe(undefined);
111
+ });
112
+ });
113
+ describe('model - with updateSession', function () {
114
+ it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
115
+ var updateSession;
116
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
117
+ while (1) {
118
+ switch (_context2.prev = _context2.next) {
119
+ case 0:
120
+ session = {
121
+ id: '1',
122
+ element: 'multiple-choice'
123
+ };
124
+ env = {
125
+ mode: 'gather'
126
+ };
127
+ question = _objectSpread(_objectSpread({}, question), {}, {
128
+ lockChoiceOrder: false
129
+ });
130
+ updateSession = jest.fn().mockResolvedValue();
131
+ _context2.next = 6;
132
+ return (0, _index.model)(question, session, env, updateSession);
133
+
134
+ case 6:
135
+ expect(updateSession).toHaveBeenCalledWith('1', 'multiple-choice', {
136
+ shuffledValues: expect.arrayContaining(['apple', 'banana'])
137
+ });
138
+
139
+ case 7:
140
+ case "end":
141
+ return _context2.stop();
142
+ }
143
+ }
144
+ }, _callee2);
145
+ })));
146
+ });
147
+ describe('mode: view', function () {
148
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
149
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
150
+ while (1) {
151
+ switch (_context3.prev = _context3.next) {
152
+ case 0:
153
+ session = {};
154
+ env = {
155
+ mode: 'view'
156
+ };
157
+ _context3.next = 4;
158
+ return (0, _index.model)(question, session, env);
159
+
160
+ case 4:
161
+ result = _context3.sent;
162
+
163
+ case 5:
164
+ case "end":
165
+ return _context3.stop();
166
+ }
167
+ }
168
+ }, _callee3);
169
+ })));
170
+ it('returns disabled', function () {
171
+ expect(result.disabled).toEqual(true);
172
+ });
173
+ });
174
+ describe('mode: evaluate', function () {
175
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
176
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
177
+ while (1) {
178
+ switch (_context4.prev = _context4.next) {
179
+ case 0:
180
+ session = {};
181
+ env = {
182
+ mode: 'evaluate'
183
+ };
184
+
185
+ _utils.isResponseCorrect.mockReturnValue(false);
186
+
187
+ _context4.next = 5;
188
+ return (0, _index.model)(question, session, env);
189
+
190
+ case 5:
191
+ result = _context4.sent;
192
+ return _context4.abrupt("return", result);
193
+
194
+ case 7:
195
+ case "end":
196
+ return _context4.stop();
197
+ }
198
+ }
199
+ }, _callee4);
200
+ })));
201
+ it('returns choices w/ correct', function () {
202
+ expect(result.choices).toEqual(expect.arrayContaining([{
203
+ label: 'a',
204
+ value: 'apple',
205
+ correct: true,
206
+ feedback: 'foo',
207
+ rationale: null
208
+ }, {
209
+ label: 'b',
210
+ value: 'banana',
211
+ correct: false,
212
+ feedback: 'Incorrect',
213
+ rationale: null
214
+ }]));
215
+ });
216
+ it('returns choices w/ correct even if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
217
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
218
+ while (1) {
219
+ switch (_context5.prev = _context5.next) {
220
+ case 0:
221
+ _context5.next = 2;
222
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
223
+ feedbackEnabled: false
224
+ }), session, env, jest.fn());
225
+
226
+ case 2:
227
+ result = _context5.sent;
228
+ expect(result.choices).toEqual(expect.arrayContaining([{
229
+ label: 'a',
230
+ value: 'apple',
231
+ correct: true,
232
+ feedback: undefined,
233
+ rationale: null
234
+ }, {
235
+ label: 'b',
236
+ value: 'banana',
237
+ correct: false,
238
+ feedback: undefined,
239
+ rationale: null
240
+ }]));
241
+
242
+ case 4:
243
+ case "end":
244
+ return _context5.stop();
245
+ }
246
+ }
247
+ }, _callee5);
248
+ })));
249
+ it('returns feedback undefined if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
250
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
251
+ while (1) {
252
+ switch (_context6.prev = _context6.next) {
253
+ case 0:
254
+ _context6.next = 2;
255
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
256
+ feedbackEnabled: false
257
+ }), session, env, jest.fn());
258
+
259
+ case 2:
260
+ result = _context6.sent;
261
+ expect(result.choices).toEqual(expect.arrayContaining([{
262
+ label: 'a',
263
+ value: 'apple',
264
+ correct: true,
265
+ feedback: undefined,
266
+ rationale: null
267
+ }, {
268
+ label: 'b',
269
+ value: 'banana',
270
+ correct: false,
271
+ feedback: undefined,
272
+ rationale: null
273
+ }]));
274
+
275
+ case 4:
276
+ case "end":
277
+ return _context6.stop();
278
+ }
279
+ }
280
+ }, _callee6);
281
+ })));
282
+ it('returns proper feedback if feedbackEnabled is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
283
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
284
+ while (1) {
285
+ switch (_context7.prev = _context7.next) {
286
+ case 0:
287
+ _context7.next = 2;
288
+ return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
289
+ feedbackEnabled: true
290
+ }), session, env, jest.fn());
291
+
292
+ case 2:
293
+ result = _context7.sent;
294
+ expect(result.choices).toEqual(expect.arrayContaining([{
295
+ label: 'a',
296
+ value: 'apple',
297
+ correct: true,
298
+ feedback: 'foo',
299
+ rationale: null
300
+ }, {
301
+ label: 'b',
302
+ value: 'banana',
303
+ correct: false,
304
+ feedback: 'Incorrect',
305
+ rationale: null
306
+ }]));
307
+
308
+ case 4:
309
+ case "end":
310
+ return _context7.stop();
311
+ }
312
+ }
313
+ }, _callee7);
314
+ })));
315
+ it('returns is response correct', function () {
316
+ expect(result.responseCorrect).toEqual(false);
317
+ });
318
+
319
+ var returnsCorrectness = function returnsCorrectness(sess) {
320
+ it("returns responseCorrect: false if session is ".concat(stringify(sess)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
321
+ var o;
322
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
323
+ while (1) {
324
+ switch (_context8.prev = _context8.next) {
325
+ case 0:
326
+ _context8.next = 2;
327
+ return (0, _index.model)(question, sess, env);
328
+
329
+ case 2:
330
+ o = _context8.sent;
331
+ expect(o.responseCorrect).toEqual(false);
332
+
333
+ case 4:
334
+ case "end":
335
+ return _context8.stop();
336
+ }
337
+ }
338
+ }, _callee8);
339
+ })));
340
+ };
341
+
342
+ returnsCorrectness(undefined);
343
+ returnsCorrectness(null);
344
+ returnsCorrectness({});
345
+ });
346
+ describe('choicePrefix is undefined', function () {
347
+ var question = {
348
+ id: '1',
349
+ element: 'multiple-choice',
350
+ prompt: 'prompt',
351
+ promptEnabled: true,
352
+ choiceMode: 'radio',
353
+ feedbackEnabled: true,
354
+ choices: [{
355
+ label: 'a',
356
+ value: 'apple',
357
+ correct: true,
358
+ feedback: {
359
+ type: 'custom',
360
+ value: 'foo'
361
+ }
362
+ }, {
363
+ label: 'b',
364
+ value: 'banana',
365
+ feedback: {
366
+ type: 'default'
367
+ }
368
+ }]
369
+ };
370
+ beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
371
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
372
+ while (1) {
373
+ switch (_context9.prev = _context9.next) {
374
+ case 0:
375
+ session = {};
376
+ env = {
377
+ mode: 'gather'
378
+ };
379
+ _context9.next = 4;
380
+ return (0, _index.model)(question, session, env);
381
+
382
+ case 4:
383
+ result = _context9.sent;
384
+
385
+ case 5:
386
+ case "end":
387
+ return _context9.stop();
388
+ }
389
+ }
390
+ }, _callee9);
391
+ })));
392
+ it('returns default letters', function () {
393
+ expect(result.keyMode).toEqual('letters');
394
+ });
395
+ });
396
+ });
397
+ describe('getScore', function () {
398
+ it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expectedDychotomous | expectedPartialScoring\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n "])), undefined, 0, 0, null, 0, 0, [], 0, 0, ['a'], 0, 0.5, ['e'], 0, 0.5, ['a', 'b'], 0, 0.5, ['a', 'c'], 0, 0.5, ['a', 'd'], 0, 0.5, ['a', 'e'], 1, 1, ['a', 'b', 'c'], 0, 0, ['a', 'b', 'd'], 0, 0, ['a', 'b', 'e'], 0, 0.5, ['a', 'b', 'c', 'd'], 0, 0, ['a', 'b', 'c', 'e'], 0, 0, ['a', 'b', 'c', 'd', 'e'], 0, 0, ['a', 'c', 'd', 'e'], 0, 0, ['a', 'd', 'e'], 0, 0.5)('session = $sessionValue; partial scoring = true => score = $expectedPartialScoring / partial scoring = false => score = $expectedDychotomous', /*#__PURE__*/function () {
399
+ var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(_ref10) {
400
+ var sessionValue, expectedPartialScoring, expectedDychotomous, q, resultPS, resultD;
401
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
402
+ while (1) {
403
+ switch (_context10.prev = _context10.next) {
404
+ case 0:
405
+ sessionValue = _ref10.sessionValue, expectedPartialScoring = _ref10.expectedPartialScoring, expectedDychotomous = _ref10.expectedDychotomous;
406
+ q = {
407
+ choiceMode: 'checkbox',
408
+ choices: [{
409
+ label: 'a',
410
+ value: 'a',
411
+ correct: true
412
+ }, {
413
+ label: 'b',
414
+ value: 'b'
415
+ }, {
416
+ label: 'c',
417
+ value: 'c'
418
+ }, {
419
+ label: 'd',
420
+ value: 'd'
421
+ }, {
422
+ label: 'e',
423
+ value: 'e',
424
+ correct: true
425
+ }]
426
+ };
427
+ _context10.next = 4;
428
+ return (0, _index.outcome)(q, {
429
+ value: sessionValue
430
+ }, {
431
+ mode: 'evaluate '
432
+ });
433
+
434
+ case 4:
435
+ resultPS = _context10.sent;
436
+ expect(resultPS.score).toEqual(expectedPartialScoring);
437
+ _context10.next = 8;
438
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, q), {}, {
439
+ partialScoring: false
440
+ }), {
441
+ value: sessionValue
442
+ }, {
443
+ mode: 'evaluate '
444
+ });
445
+
446
+ case 8:
447
+ resultD = _context10.sent;
448
+ expect(resultD.score).toEqual(expectedDychotomous);
449
+
450
+ case 10:
451
+ case "end":
452
+ return _context10.stop();
453
+ }
454
+ }
455
+ }, _callee10);
456
+ }));
457
+
458
+ return function (_x) {
459
+ return _ref11.apply(this, arguments);
460
+ };
461
+ }());
462
+ });
463
+ describe('outcome', function () {
464
+ it('returns score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
465
+ var result;
466
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
467
+ while (1) {
468
+ switch (_context11.prev = _context11.next) {
469
+ case 0:
470
+ _context11.next = 2;
471
+ return (0, _index.outcome)(question, {
472
+ value: ['banana']
473
+ }, {
474
+ mode: 'gather'
475
+ });
476
+
477
+ case 2:
478
+ result = _context11.sent;
479
+ expect(result.score).toEqual(0);
480
+
481
+ case 4:
482
+ case "end":
483
+ return _context11.stop();
484
+ }
485
+ }
486
+ }, _callee11);
487
+ })));
488
+ it('returns score of 1', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
489
+ var result;
490
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
491
+ while (1) {
492
+ switch (_context12.prev = _context12.next) {
493
+ case 0:
494
+ _context12.next = 2;
495
+ return (0, _index.outcome)(question, {
496
+ value: ['apple']
497
+ }, {
498
+ mode: 'gather'
499
+ });
500
+
501
+ case 2:
502
+ result = _context12.sent;
503
+ expect(result.score).toEqual(1);
504
+
505
+ case 4:
506
+ case "end":
507
+ return _context12.stop();
508
+ }
509
+ }
510
+ }, _callee12);
511
+ })));
512
+ describe('partial scoring', function () {
513
+ describe('choiceMode:radio is disabled', function () {
514
+ it('with defaults', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
515
+ var result;
516
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
517
+ while (1) {
518
+ switch (_context13.prev = _context13.next) {
519
+ case 0:
520
+ _context13.next = 2;
521
+ return (0, _index.outcome)(question, {}, {});
522
+
523
+ case 2:
524
+ result = _context13.sent;
525
+ expect(result.score).toEqual(0);
526
+
527
+ case 4:
528
+ case "end":
529
+ return _context13.stop();
530
+ }
531
+ }
532
+ }, _callee13);
533
+ })));
534
+ it('with defaults and correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
535
+ var result;
536
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
537
+ while (1) {
538
+ switch (_context14.prev = _context14.next) {
539
+ case 0:
540
+ _context14.next = 2;
541
+ return (0, _index.outcome)(question, {
542
+ value: ['apple']
543
+ }, {});
544
+
545
+ case 2:
546
+ result = _context14.sent;
547
+ expect(result.score).toEqual(1);
548
+
549
+ case 4:
550
+ case "end":
551
+ return _context14.stop();
552
+ }
553
+ }
554
+ }, _callee14);
555
+ })));
556
+ it('with env.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
557
+ var result;
558
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
559
+ while (1) {
560
+ switch (_context15.prev = _context15.next) {
561
+ case 0:
562
+ _context15.next = 2;
563
+ return (0, _index.outcome)(question, {
564
+ partialScoring: true
565
+ }, {});
566
+
567
+ case 2:
568
+ result = _context15.sent;
569
+ expect(result.score).toEqual(0);
570
+
571
+ case 4:
572
+ case "end":
573
+ return _context15.stop();
574
+ }
575
+ }
576
+ }, _callee15);
577
+ })));
578
+ it('with env.partialScoring: true + config.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
579
+ var result;
580
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
581
+ while (1) {
582
+ switch (_context16.prev = _context16.next) {
583
+ case 0:
584
+ _context16.next = 2;
585
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
586
+ partialScoring: true
587
+ }), {
588
+ partialScoring: true
589
+ }, {});
590
+
591
+ case 2:
592
+ result = _context16.sent;
593
+ expect(result.score).toEqual(0);
594
+
595
+ case 4:
596
+ case "end":
597
+ return _context16.stop();
598
+ }
599
+ }
600
+ }, _callee16);
601
+ })));
602
+ });
603
+ describe('checkbox', function () {
604
+ beforeEach(function () {
605
+ var choices = question.choices.concat({
606
+ value: 'c',
607
+ correct: true
608
+ });
609
+ question = _objectSpread(_objectSpread({}, question), {}, {
610
+ choiceMode: 'checkbox',
611
+ partialScoring: true,
612
+ choices: choices
613
+ });
614
+ });
615
+ it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expected\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, 0, null, 0, [], 0, ['apple'], 0.25, ['apple', 'cherry'], 0.5, ['apple', 'banana'], 0.5, ['apple', 'banana', 'cherry'], 0.75, ['apple', 'banana', 'grapes'], 0.75, ['apple', 'banana', 'grapes', 'cherry'], 1, ['cherry', 'banana', 'grapes'], 0.75, ['apple', 'durian'], 0.25, ['apple', 'durian', 'elderberries'], 0.25, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit'], 0, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit', 'kiwi'], 0.25, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit'], 0.5, ['apple', 'cherry', 'banana', 'grapes', 'durian'], 0.75)('outcome: partial scoring = true, sessionValue = $sessionValue => expected = $expected', /*#__PURE__*/function () {
616
+ var _ref19 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(_ref18) {
617
+ var sessionValue, expected, q, result;
618
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
619
+ while (1) {
620
+ switch (_context17.prev = _context17.next) {
621
+ case 0:
622
+ sessionValue = _ref18.sessionValue, expected = _ref18.expected;
623
+ q = {
624
+ choiceMode: 'checkbox',
625
+ choices: [{
626
+ label: 'a',
627
+ value: 'apple',
628
+ correct: true
629
+ }, {
630
+ label: 'b',
631
+ value: 'banana',
632
+ correct: true
633
+ }, {
634
+ label: 'c',
635
+ value: 'cherry',
636
+ correct: true
637
+ }, {
638
+ label: 'd',
639
+ value: 'durian'
640
+ }, {
641
+ label: 'e',
642
+ value: 'elderberries'
643
+ }, {
644
+ label: 'f',
645
+ value: 'feijoa'
646
+ }, {
647
+ label: 'g',
648
+ value: 'grapes',
649
+ correct: true
650
+ }, {
651
+ label: 'j',
652
+ value: 'jackfruit'
653
+ }, {
654
+ label: 'k',
655
+ value: 'kiwi'
656
+ }]
657
+ };
658
+ _context17.next = 4;
659
+ return (0, _index.outcome)(q, {
660
+ value: sessionValue
661
+ }, {
662
+ mode: 'evaluate '
663
+ });
664
+
665
+ case 4:
666
+ result = _context17.sent;
667
+ expect(result.score).toEqual(expected);
668
+
669
+ case 6:
670
+ case "end":
671
+ return _context17.stop();
672
+ }
673
+ }
674
+ }, _callee17);
675
+ }));
676
+
677
+ return function (_x2) {
678
+ return _ref19.apply(this, arguments);
679
+ };
680
+ }());
681
+ });
682
+ });
683
+ it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n session | empty\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, true, null, true, {}, true, {
684
+ value: []
685
+ }, false)('returns score: 0 and empty: true if session is $session', /*#__PURE__*/function () {
686
+ var _ref21 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(_ref20) {
687
+ var session, empty, o;
688
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
689
+ while (1) {
690
+ switch (_context18.prev = _context18.next) {
691
+ case 0:
692
+ session = _ref20.session, empty = _ref20.empty;
693
+ _context18.next = 3;
694
+ return (0, _index.outcome)(question, session, {
695
+ mode: 'evaluate'
696
+ });
697
+
698
+ case 3:
699
+ o = _context18.sent;
700
+ expect(o).toEqual({
701
+ score: 0,
702
+ empty: empty
703
+ });
704
+
705
+ case 5:
706
+ case "end":
707
+ return _context18.stop();
708
+ }
709
+ }
710
+ }, _callee18);
711
+ }));
712
+
713
+ return function (_x3) {
714
+ return _ref21.apply(this, arguments);
715
+ };
716
+ }());
717
+ });
718
+ describe('correct response', function () {
719
+ it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
720
+ var sess;
721
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
722
+ while (1) {
723
+ switch (_context19.prev = _context19.next) {
724
+ case 0:
725
+ _context19.next = 2;
726
+ return (0, _index.createCorrectResponseSession)(question, {
727
+ mode: 'gather',
728
+ role: 'instructor'
729
+ });
730
+
731
+ case 2:
732
+ sess = _context19.sent;
733
+ expect(sess).toEqual({
734
+ id: '1',
735
+ value: ['apple']
736
+ });
737
+
738
+ case 4:
739
+ case "end":
740
+ return _context19.stop();
741
+ }
742
+ }
743
+ }, _callee19);
744
+ })));
745
+ it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
746
+ var noResult;
747
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
748
+ while (1) {
749
+ switch (_context20.prev = _context20.next) {
750
+ case 0:
751
+ _context20.next = 2;
752
+ return (0, _index.createCorrectResponseSession)(question, {
753
+ mode: 'gather',
754
+ role: 'student'
755
+ });
756
+
757
+ case 2:
758
+ noResult = _context20.sent;
759
+ expect(noResult).toBeNull();
760
+
761
+ case 4:
762
+ case "end":
763
+ return _context20.stop();
764
+ }
765
+ }
766
+ }, _callee20);
767
+ })));
768
+ });
769
+ describe('normalize', function () {
770
+ it('sets choicesLayout: horizontal if verticalMode: false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
771
+ var sess;
772
+ return _regenerator["default"].wrap(function _callee21$(_context21) {
773
+ while (1) {
774
+ switch (_context21.prev = _context21.next) {
775
+ case 0:
776
+ _context21.next = 2;
777
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
778
+ verticalMode: false
779
+ }));
780
+
781
+ case 2:
782
+ sess = _context21.sent;
783
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
784
+ choicesLayout: 'horizontal'
785
+ }));
786
+
787
+ case 4:
788
+ case "end":
789
+ return _context21.stop();
790
+ }
791
+ }
792
+ }, _callee21);
793
+ })));
794
+ it('sets choicesLayout: vertical if verticalMode: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
795
+ var sess;
796
+ return _regenerator["default"].wrap(function _callee22$(_context22) {
797
+ while (1) {
798
+ switch (_context22.prev = _context22.next) {
799
+ case 0:
800
+ _context22.next = 2;
801
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
802
+ verticalMode: true
803
+ }));
804
+
805
+ case 2:
806
+ sess = _context22.sent;
807
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
808
+ choicesLayout: 'vertical'
809
+ }));
810
+
811
+ case 4:
812
+ case "end":
813
+ return _context22.stop();
814
+ }
815
+ }
816
+ }, _callee22);
817
+ })));
818
+ it('sets choicesLayout: grid if verticalMode: true && choicesLayout: grid', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
819
+ var sess;
820
+ return _regenerator["default"].wrap(function _callee23$(_context23) {
821
+ while (1) {
822
+ switch (_context23.prev = _context23.next) {
823
+ case 0:
824
+ _context23.next = 2;
825
+ return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
826
+ verticalMode: true,
827
+ choicesLayout: 'grid'
828
+ }));
829
+
830
+ case 2:
831
+ sess = _context23.sent;
832
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
833
+ choicesLayout: 'grid'
834
+ }));
835
+
836
+ case 4:
837
+ case "end":
838
+ return _context23.stop();
839
+ }
840
+ }
841
+ }, _callee23);
842
+ })));
843
+ it('sets choicesLayout: vertical', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
844
+ var sess;
845
+ return _regenerator["default"].wrap(function _callee24$(_context24) {
846
+ while (1) {
847
+ switch (_context24.prev = _context24.next) {
848
+ case 0:
849
+ _context24.next = 2;
850
+ return (0, _index.normalize)(question);
851
+
852
+ case 2:
853
+ sess = _context24.sent;
854
+ expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
855
+ choicesLayout: 'vertical'
856
+ }));
857
+
858
+ case 4:
859
+ case "end":
860
+ return _context24.stop();
861
+ }
862
+ }
863
+ }, _callee24);
864
+ })));
865
+ });
866
+ });
867
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJpZCIsImVsZW1lbnQiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiY2hvaWNlUHJlZml4IiwiY2hvaWNlTW9kZSIsImZlZWRiYWNrRW5hYmxlZCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwiY29ycmVjdCIsImZlZWRiYWNrIiwidHlwZSIsInN0cmluZ2lmeSIsIkpTT04iLCJtb2RlIiwiaXQiLCJleHBlY3QiLCJkaXNhYmxlZCIsInRvRXF1YWwiLCJrZXlNb2RlIiwiYXJyYXlDb250YWluaW5nIiwicmF0aW9uYWxlIiwicmVzcG9uc2VDb3JyZWN0IiwidG9CZSIsInVuZGVmaW5lZCIsImxvY2tDaG9pY2VPcmRlciIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJtb2NrUmV0dXJuVmFsdWUiLCJyZXR1cm5zQ29ycmVjdG5lc3MiLCJzZXNzIiwibyIsImVhY2giLCJzZXNzaW9uVmFsdWUiLCJleHBlY3RlZFBhcnRpYWxTY29yaW5nIiwiZXhwZWN0ZWREeWNob3RvbW91cyIsInEiLCJyZXN1bHRQUyIsInNjb3JlIiwicGFydGlhbFNjb3JpbmciLCJyZXN1bHREIiwiY29uY2F0IiwiZXhwZWN0ZWQiLCJlbXB0eSIsInJvbGUiLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwidmVydGljYWxNb2RlIiwiZGVmYXVsdHMiLCJjaG9pY2VzTGF5b3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsVUFBVixFQUFzQjtBQUFBLFNBQU87QUFDM0JDLElBQUFBLGlCQUFpQixFQUFFRixJQUFJLENBQUNHLEVBQUw7QUFEUSxHQUFQO0FBQUEsQ0FBdEI7QUFJQUMsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFNO0FBQzNCLE1BQUlDLE1BQUosRUFBWUMsUUFBWixFQUFzQkMsT0FBdEIsRUFBK0JDLEdBQS9CO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2ZILElBQUFBLFFBQVEsR0FBRztBQUNUSSxNQUFBQSxFQUFFLEVBQUUsR0FESztBQUVUQyxNQUFBQSxPQUFPLEVBQUUsaUJBRkE7QUFHVEMsTUFBQUEsTUFBTSxFQUFFLFFBSEM7QUFJVEMsTUFBQUEsYUFBYSxFQUFFLElBSk47QUFLVEMsTUFBQUEsWUFBWSxFQUFFLFNBTEw7QUFNVEMsTUFBQUEsVUFBVSxFQUFFLE9BTkg7QUFPVEMsTUFBQUEsZUFBZSxFQUFFLElBUFI7QUFRVEMsTUFBQUEsT0FBTyxFQUFFLENBQ1A7QUFDRUMsUUFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsUUFBQUEsS0FBSyxFQUFFLE9BRlQ7QUFHRUMsUUFBQUEsT0FBTyxFQUFFLElBSFg7QUFJRUMsUUFBQUEsUUFBUSxFQUFFO0FBQ1JDLFVBQUFBLElBQUksRUFBRSxRQURFO0FBRVJILFVBQUFBLEtBQUssRUFBRTtBQUZDO0FBSlosT0FETyxFQVVQO0FBQ0VELFFBQUFBLEtBQUssRUFBRSxHQURUO0FBRUVDLFFBQUFBLEtBQUssRUFBRSxRQUZUO0FBR0VFLFFBQUFBLFFBQVEsRUFBRTtBQUNSQyxVQUFBQSxJQUFJLEVBQUU7QUFERTtBQUhaLE9BVk87QUFSQSxLQUFYO0FBMkJELEdBNUJTLENBQVY7QUE4QkEsTUFBUUMsU0FBUixHQUFzQkMsSUFBdEIsQ0FBUUQsU0FBUjtBQUVBbkIsRUFBQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFNO0FBQ3RCQSxJQUFBQSxRQUFRLENBQUMsY0FBRCxFQUFpQixZQUFNO0FBQzdCSyxNQUFBQSxVQUFVLDZGQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDVEYsZ0JBQUFBLE9BQU8sR0FBRyxFQUFWO0FBQ0FDLGdCQUFBQSxHQUFHLEdBQUc7QUFBRWlCLGtCQUFBQSxJQUFJLEVBQUU7QUFBUixpQkFBTjtBQUZTO0FBQUEsdUJBR00sa0JBQU1uQixRQUFOLEVBQWdCQyxPQUFoQixFQUF5QkMsR0FBekIsQ0FITjs7QUFBQTtBQUdUSCxnQkFBQUEsTUFIUzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFELEdBQVY7QUFNQXFCLE1BQUFBLEVBQUUsQ0FBQyxrQkFBRCxFQUFxQixZQUFNO0FBQzNCQyxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN1QixRQUFSLENBQU4sQ0FBd0JDLE9BQXhCLENBQWdDLEtBQWhDO0FBQ0QsT0FGQyxDQUFGO0FBSUFILE1BQUFBLEVBQUUsQ0FBQyxjQUFELEVBQWlCLFlBQU07QUFDdkJDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ29CLElBQVIsQ0FBTixDQUFvQkksT0FBcEIsQ0FBNEIsUUFBNUI7QUFDRCxPQUZDLENBQUY7QUFJQUgsTUFBQUEsRUFBRSxDQUFDLGdCQUFELEVBQW1CLFlBQU07QUFDekJDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ08sTUFBUixDQUFOLENBQXNCaUIsT0FBdEIsQ0FBOEIsUUFBOUI7QUFDRCxPQUZDLENBQUY7QUFJQUgsTUFBQUEsRUFBRSxDQUFDLG9CQUFELEVBQXVCLFlBQU07QUFDN0JDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ1UsVUFBUixDQUFOLENBQTBCYyxPQUExQixDQUFrQyxPQUFsQztBQUNELE9BRkMsQ0FBRjtBQUlBSCxNQUFBQSxFQUFFLENBQUMsc0JBQUQsRUFBeUIsWUFBTTtBQUMvQkMsUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDeUIsT0FBUixDQUFOLENBQXVCRCxPQUF2QixDQUErQixTQUEvQjtBQUNELE9BRkMsQ0FBRjtBQUlBSCxNQUFBQSxFQUFFLENBQUMsaUJBQUQsRUFBb0IsWUFBTTtBQUMxQkMsUUFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDWSxPQUFSLENBQU4sQ0FBdUJZLE9BQXZCLENBQ0VGLE1BQU0sQ0FBQ0ksZUFBUCxDQUF1QixDQUNyQjtBQUFFYixVQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyxVQUFBQSxLQUFLLEVBQUUsT0FBckI7QUFBOEJhLFVBQUFBLFNBQVMsRUFBRTtBQUF6QyxTQURxQixFQUVyQjtBQUFFZCxVQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyxVQUFBQSxLQUFLLEVBQUUsUUFBckI7QUFBK0JhLFVBQUFBLFNBQVMsRUFBRTtBQUExQyxTQUZxQixDQUF2QixDQURGO0FBTUQsT0FQQyxDQUFGO0FBU0FOLE1BQUFBLEVBQUUsQ0FBQyxpQ0FBRCxFQUFvQyxZQUFNO0FBQzFDQyxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUM0QixlQUFSLENBQU4sQ0FBK0JDLElBQS9CLENBQW9DQyxTQUFwQztBQUNELE9BRkMsQ0FBRjtBQUdELEtBdkNPLENBQVI7QUF5Q0EvQixJQUFBQSxRQUFRLENBQUMsNEJBQUQsRUFBK0IsWUFBTTtBQUMzQ3NCLE1BQUFBLEVBQUUsQ0FBQyxxQkFBRCw2RkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ3hCbkIsZ0JBQUFBLE9BQU8sR0FBRztBQUFFRyxrQkFBQUEsRUFBRSxFQUFFLEdBQU47QUFBV0Msa0JBQUFBLE9BQU8sRUFBRTtBQUFwQixpQkFBVjtBQUNBSCxnQkFBQUEsR0FBRyxHQUFHO0FBQUVpQixrQkFBQUEsSUFBSSxFQUFFO0FBQVIsaUJBQU47QUFDQW5CLGdCQUFBQSxRQUFRLG1DQUFRQSxRQUFSO0FBQWtCOEIsa0JBQUFBLGVBQWUsRUFBRTtBQUFuQyxrQkFBUjtBQUNNQyxnQkFBQUEsYUFKa0IsR0FJRnJDLElBQUksQ0FBQ0csRUFBTCxHQUFVbUMsaUJBQVYsRUFKRTtBQUFBO0FBQUEsdUJBTWxCLGtCQUFNaEMsUUFBTixFQUFnQkMsT0FBaEIsRUFBeUJDLEdBQXpCLEVBQThCNkIsYUFBOUIsQ0FOa0I7O0FBQUE7QUFReEJWLGdCQUFBQSxNQUFNLENBQUNVLGFBQUQsQ0FBTixDQUFzQkUsb0JBQXRCLENBQTJDLEdBQTNDLEVBQWdELGlCQUFoRCxFQUFtRTtBQUNqRUMsa0JBQUFBLGNBQWMsRUFBRWIsTUFBTSxDQUFDSSxlQUFQLENBQXVCLENBQUMsT0FBRCxFQUFVLFFBQVYsQ0FBdkI7QUFEaUQsaUJBQW5FOztBQVJ3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUF4QixHQUFGO0FBWUQsS0FiTyxDQUFSO0FBZUEzQixJQUFBQSxRQUFRLENBQUMsWUFBRCxFQUFlLFlBQU07QUFDM0JLLE1BQUFBLFVBQVUsNkZBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNURixnQkFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDQUMsZ0JBQUFBLEdBQUcsR0FBRztBQUFFaUIsa0JBQUFBLElBQUksRUFBRTtBQUFSLGlCQUFOO0FBRlM7QUFBQSx1QkFHTSxrQkFBTW5CLFFBQU4sRUFBZ0JDLE9BQWhCLEVBQXlCQyxHQUF6QixDQUhOOztBQUFBO0FBR1RILGdCQUFBQSxNQUhTOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUQsR0FBVjtBQU1BcUIsTUFBQUEsRUFBRSxDQUFDLGtCQUFELEVBQXFCLFlBQU07QUFDM0JDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ3VCLFFBQVIsQ0FBTixDQUF3QkMsT0FBeEIsQ0FBZ0MsSUFBaEM7QUFDRCxPQUZDLENBQUY7QUFHRCxLQVZPLENBQVI7QUFZQXpCLElBQUFBLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZQUFNO0FBQy9CSyxNQUFBQSxVQUFVLDZGQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDVEYsZ0JBQUFBLE9BQU8sR0FBRyxFQUFWO0FBQ0FDLGdCQUFBQSxHQUFHLEdBQUc7QUFBRWlCLGtCQUFBQSxJQUFJLEVBQUU7QUFBUixpQkFBTjs7QUFDQXZCLHlDQUFrQnVDLGVBQWxCLENBQWtDLEtBQWxDOztBQUhTO0FBQUEsdUJBSU0sa0JBQU1uQyxRQUFOLEVBQWdCQyxPQUFoQixFQUF5QkMsR0FBekIsQ0FKTjs7QUFBQTtBQUlUSCxnQkFBQUEsTUFKUztBQUFBLGtEQUtGQSxNQUxFOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUQsR0FBVjtBQVFBcUIsTUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLFlBQU07QUFDckNDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ1ksT0FBUixDQUFOLENBQXVCWSxPQUF2QixDQUNFRixNQUFNLENBQUNJLGVBQVAsQ0FBdUIsQ0FDckI7QUFDRWIsVUFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLE9BRlQ7QUFHRUMsVUFBQUEsT0FBTyxFQUFFLElBSFg7QUFJRUMsVUFBQUEsUUFBUSxFQUFFLEtBSlo7QUFLRVcsVUFBQUEsU0FBUyxFQUFFO0FBTGIsU0FEcUIsRUFRckI7QUFDRWQsVUFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFFBRlQ7QUFHRUMsVUFBQUEsT0FBTyxFQUFFLEtBSFg7QUFJRUMsVUFBQUEsUUFBUSxFQUFFLFdBSlo7QUFLRVcsVUFBQUEsU0FBUyxFQUFFO0FBTGIsU0FScUIsQ0FBdkIsQ0FERjtBQWtCRCxPQW5CQyxDQUFGO0FBcUJBTixNQUFBQSxFQUFFLENBQUMsNkRBQUQsNkZBQWdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUNqRCxrREFFUnBCLFFBRlE7QUFHWFUsa0JBQUFBLGVBQWUsRUFBRTtBQUhOLG9CQUtiVCxPQUxhLEVBTWJDLEdBTmEsRUFPYlIsSUFBSSxDQUFDRyxFQUFMLEVBUGEsQ0FEaUQ7O0FBQUE7QUFDaEVFLGdCQUFBQSxNQURnRTtBQVdoRXNCLGdCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUNZLE9BQVIsQ0FBTixDQUF1QlksT0FBdkIsQ0FDRUYsTUFBTSxDQUFDSSxlQUFQLENBQXVCLENBQ3JCO0FBQ0ViLGtCQUFBQSxLQUFLLEVBQUUsR0FEVDtBQUVFQyxrQkFBQUEsS0FBSyxFQUFFLE9BRlQ7QUFHRUMsa0JBQUFBLE9BQU8sRUFBRSxJQUhYO0FBSUVDLGtCQUFBQSxRQUFRLEVBQUVjLFNBSlo7QUFLRUgsa0JBQUFBLFNBQVMsRUFBRTtBQUxiLGlCQURxQixFQVFyQjtBQUNFZCxrQkFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsa0JBQUFBLEtBQUssRUFBRSxRQUZUO0FBR0VDLGtCQUFBQSxPQUFPLEVBQUUsS0FIWDtBQUlFQyxrQkFBQUEsUUFBUSxFQUFFYyxTQUpaO0FBS0VILGtCQUFBQSxTQUFTLEVBQUU7QUFMYixpQkFScUIsQ0FBdkIsQ0FERjs7QUFYZ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBaEUsR0FBRjtBQStCQU4sTUFBQUEsRUFBRSxDQUFDLHdEQUFELDZGQUEyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFDNUMsa0RBRVJwQixRQUZRO0FBR1hVLGtCQUFBQSxlQUFlLEVBQUU7QUFITixvQkFLYlQsT0FMYSxFQU1iQyxHQU5hLEVBT2JSLElBQUksQ0FBQ0csRUFBTCxFQVBhLENBRDRDOztBQUFBO0FBQzNERSxnQkFBQUEsTUFEMkQ7QUFXM0RzQixnQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDWSxPQUFSLENBQU4sQ0FBdUJZLE9BQXZCLENBQ0VGLE1BQU0sQ0FBQ0ksZUFBUCxDQUF1QixDQUNyQjtBQUNFYixrQkFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsa0JBQUFBLEtBQUssRUFBRSxPQUZUO0FBR0VDLGtCQUFBQSxPQUFPLEVBQUUsSUFIWDtBQUlFQyxrQkFBQUEsUUFBUSxFQUFFYyxTQUpaO0FBS0VILGtCQUFBQSxTQUFTLEVBQUU7QUFMYixpQkFEcUIsRUFRckI7QUFDRWQsa0JBQUFBLEtBQUssRUFBRSxHQURUO0FBRUVDLGtCQUFBQSxLQUFLLEVBQUUsUUFGVDtBQUdFQyxrQkFBQUEsT0FBTyxFQUFFLEtBSFg7QUFJRUMsa0JBQUFBLFFBQVEsRUFBRWMsU0FKWjtBQUtFSCxrQkFBQUEsU0FBUyxFQUFFO0FBTGIsaUJBUnFCLENBQXZCLENBREY7O0FBWDJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQTNELEdBQUY7QUErQkFOLE1BQUFBLEVBQUUsQ0FBQyxvREFBRCw2RkFBdUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQ3hDLGtEQUVScEIsUUFGUTtBQUdYVSxrQkFBQUEsZUFBZSxFQUFFO0FBSE4sb0JBS2JULE9BTGEsRUFNYkMsR0FOYSxFQU9iUixJQUFJLENBQUNHLEVBQUwsRUFQYSxDQUR3Qzs7QUFBQTtBQUN2REUsZ0JBQUFBLE1BRHVEO0FBV3ZEc0IsZ0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQ1ksT0FBUixDQUFOLENBQXVCWSxPQUF2QixDQUNFRixNQUFNLENBQUNJLGVBQVAsQ0FBdUIsQ0FDckI7QUFDRWIsa0JBQUFBLEtBQUssRUFBRSxHQURUO0FBRUVDLGtCQUFBQSxLQUFLLEVBQUUsT0FGVDtBQUdFQyxrQkFBQUEsT0FBTyxFQUFFLElBSFg7QUFJRUMsa0JBQUFBLFFBQVEsRUFBRSxLQUpaO0FBS0VXLGtCQUFBQSxTQUFTLEVBQUU7QUFMYixpQkFEcUIsRUFRckI7QUFDRWQsa0JBQUFBLEtBQUssRUFBRSxHQURUO0FBRUVDLGtCQUFBQSxLQUFLLEVBQUUsUUFGVDtBQUdFQyxrQkFBQUEsT0FBTyxFQUFFLEtBSFg7QUFJRUMsa0JBQUFBLFFBQVEsRUFBRSxXQUpaO0FBS0VXLGtCQUFBQSxTQUFTLEVBQUU7QUFMYixpQkFScUIsQ0FBdkIsQ0FERjs7QUFYdUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBdkQsR0FBRjtBQStCQU4sTUFBQUEsRUFBRSxDQUFDLDZCQUFELEVBQWdDLFlBQU07QUFDdENDLFFBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQzRCLGVBQVIsQ0FBTixDQUErQkosT0FBL0IsQ0FBdUMsS0FBdkM7QUFDRCxPQUZDLENBQUY7O0FBSUEsVUFBTWEsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFDQyxJQUFELEVBQVU7QUFDbkNqQixRQUFBQSxFQUFFLHdEQUFpREgsU0FBUyxDQUFDb0IsSUFBRCxDQUExRCw4RkFBb0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFDcEQsa0JBQU1yQyxRQUFOLEVBQWdCcUMsSUFBaEIsRUFBc0JuQyxHQUF0QixDQURvRDs7QUFBQTtBQUM5RG9DLGtCQUFBQSxDQUQ4RDtBQUdwRWpCLGtCQUFBQSxNQUFNLENBQUNpQixDQUFDLENBQUNYLGVBQUgsQ0FBTixDQUEwQkosT0FBMUIsQ0FBa0MsS0FBbEM7O0FBSG9FO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQXBFLEdBQUY7QUFLRCxPQU5EOztBQVFBYSxNQUFBQSxrQkFBa0IsQ0FBQ1AsU0FBRCxDQUFsQjtBQUNBTyxNQUFBQSxrQkFBa0IsQ0FBQyxJQUFELENBQWxCO0FBQ0FBLE1BQUFBLGtCQUFrQixDQUFDLEVBQUQsQ0FBbEI7QUFDRCxLQTFJTyxDQUFSO0FBNElBdEMsSUFBQUEsUUFBUSxDQUFDLDJCQUFELEVBQThCLFlBQU07QUFDMUMsVUFBTUUsUUFBUSxHQUFHO0FBQ2ZJLFFBQUFBLEVBQUUsRUFBRSxHQURXO0FBRWZDLFFBQUFBLE9BQU8sRUFBRSxpQkFGTTtBQUdmQyxRQUFBQSxNQUFNLEVBQUUsUUFITztBQUlmQyxRQUFBQSxhQUFhLEVBQUUsSUFKQTtBQUtmRSxRQUFBQSxVQUFVLEVBQUUsT0FMRztBQU1mQyxRQUFBQSxlQUFlLEVBQUUsSUFORjtBQU9mQyxRQUFBQSxPQUFPLEVBQUUsQ0FDUDtBQUNFQyxVQUFBQSxLQUFLLEVBQUUsR0FEVDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsT0FGVDtBQUdFQyxVQUFBQSxPQUFPLEVBQUUsSUFIWDtBQUlFQyxVQUFBQSxRQUFRLEVBQUU7QUFDUkMsWUFBQUEsSUFBSSxFQUFFLFFBREU7QUFFUkgsWUFBQUEsS0FBSyxFQUFFO0FBRkM7QUFKWixTQURPLEVBVVA7QUFDRUQsVUFBQUEsS0FBSyxFQUFFLEdBRFQ7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFFBRlQ7QUFHRUUsVUFBQUEsUUFBUSxFQUFFO0FBQ1JDLFlBQUFBLElBQUksRUFBRTtBQURFO0FBSFosU0FWTztBQVBNLE9BQWpCO0FBMkJBYixNQUFBQSxVQUFVLDZGQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDVEYsZ0JBQUFBLE9BQU8sR0FBRyxFQUFWO0FBQ0FDLGdCQUFBQSxHQUFHLEdBQUc7QUFBRWlCLGtCQUFBQSxJQUFJLEVBQUU7QUFBUixpQkFBTjtBQUZTO0FBQUEsdUJBR00sa0JBQU1uQixRQUFOLEVBQWdCQyxPQUFoQixFQUF5QkMsR0FBekIsQ0FITjs7QUFBQTtBQUdUSCxnQkFBQUEsTUFIUzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFELEdBQVY7QUFLQXFCLE1BQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixZQUFNO0FBQ2xDQyxRQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUN5QixPQUFSLENBQU4sQ0FBdUJELE9BQXZCLENBQStCLFNBQS9CO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0FwQ08sQ0FBUjtBQXFDRCxHQXRQTyxDQUFSO0FBd1BBekIsRUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFNO0FBQ3pCc0IsSUFBQUEsRUFBRSxDQUFDbUIsSUFBSCxna0NBRUlWLFNBRkosRUFFbUMsQ0FGbkMsRUFFeUQsQ0FGekQsRUFHSSxJQUhKLEVBR21DLENBSG5DLEVBR3lELENBSHpELEVBSUksRUFKSixFQUltQyxDQUpuQyxFQUl5RCxDQUp6RCxFQUtJLENBQUMsR0FBRCxDQUxKLEVBS21DLENBTG5DLEVBS3lELEdBTHpELEVBTUksQ0FBQyxHQUFELENBTkosRUFNbUMsQ0FObkMsRUFNeUQsR0FOekQsRUFPSSxDQUFDLEdBQUQsRUFBTSxHQUFOLENBUEosRUFPbUMsQ0FQbkMsRUFPeUQsR0FQekQsRUFRSSxDQUFDLEdBQUQsRUFBTSxHQUFOLENBUkosRUFRbUMsQ0FSbkMsRUFReUQsR0FSekQsRUFTSSxDQUFDLEdBQUQsRUFBTSxHQUFOLENBVEosRUFTbUMsQ0FUbkMsRUFTeUQsR0FUekQsRUFVSSxDQUFDLEdBQUQsRUFBTSxHQUFOLENBVkosRUFVbUMsQ0FWbkMsRUFVeUQsQ0FWekQsRUFXSSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxDQVhKLEVBV21DLENBWG5DLEVBV3lELENBWHpELEVBWUksQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsQ0FaSixFQVltQyxDQVpuQyxFQVl5RCxDQVp6RCxFQWFJLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBYkosRUFhbUMsQ0FibkMsRUFheUQsR0FiekQsRUFjSSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQWRKLEVBY21DLENBZG5DLEVBY3lELENBZHpELEVBZUksQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsQ0FmSixFQWVtQyxDQWZuQyxFQWV5RCxDQWZ6RCxFQWdCSSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixFQUFxQixHQUFyQixDQWhCSixFQWdCbUMsQ0FoQm5DLEVBZ0J5RCxDQWhCekQsRUFpQkksQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsQ0FqQkosRUFpQm1DLENBakJuQyxFQWlCeUQsQ0FqQnpELEVBa0JJLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBbEJKLEVBa0JtQyxDQWxCbkMsRUFrQnlELEdBbEJ6RCxFQW9CRSw4SUFwQkY7QUFBQSxpR0FxQkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQVNXLGdCQUFBQSxZQUFULFVBQVNBLFlBQVQsRUFBdUJDLHNCQUF2QixVQUF1QkEsc0JBQXZCLEVBQStDQyxtQkFBL0MsVUFBK0NBLG1CQUEvQztBQUNRQyxnQkFBQUEsQ0FEUixHQUNZO0FBQ1JsQyxrQkFBQUEsVUFBVSxFQUFFLFVBREo7QUFFUkUsa0JBQUFBLE9BQU8sRUFBRSxDQUNQO0FBQUVDLG9CQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyxvQkFBQUEsS0FBSyxFQUFFLEdBQXJCO0FBQTBCQyxvQkFBQUEsT0FBTyxFQUFFO0FBQW5DLG1CQURPLEVBRVA7QUFBRUYsb0JBQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNDLG9CQUFBQSxLQUFLLEVBQUU7QUFBckIsbUJBRk8sRUFHUDtBQUFFRCxvQkFBQUEsS0FBSyxFQUFFLEdBQVQ7QUFBY0Msb0JBQUFBLEtBQUssRUFBRTtBQUFyQixtQkFITyxFQUlQO0FBQUVELG9CQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyxvQkFBQUEsS0FBSyxFQUFFO0FBQXJCLG1CQUpPLEVBS1A7QUFBRUQsb0JBQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNDLG9CQUFBQSxLQUFLLEVBQUUsR0FBckI7QUFBMEJDLG9CQUFBQSxPQUFPLEVBQUU7QUFBbkMsbUJBTE87QUFGRCxpQkFEWjtBQUFBO0FBQUEsdUJBWXlCLG9CQUFRNkIsQ0FBUixFQUFXO0FBQUU5QixrQkFBQUEsS0FBSyxFQUFFMkI7QUFBVCxpQkFBWCxFQUFvQztBQUFFckIsa0JBQUFBLElBQUksRUFBRTtBQUFSLGlCQUFwQyxDQVp6Qjs7QUFBQTtBQVlReUIsZ0JBQUFBLFFBWlI7QUFjRXZCLGdCQUFBQSxNQUFNLENBQUN1QixRQUFRLENBQUNDLEtBQVYsQ0FBTixDQUF1QnRCLE9BQXZCLENBQStCa0Isc0JBQS9CO0FBZEY7QUFBQSx1QkFnQndCLG9EQUFhRSxDQUFiO0FBQWdCRyxrQkFBQUEsY0FBYyxFQUFFO0FBQWhDLG9CQUF5QztBQUFFakMsa0JBQUFBLEtBQUssRUFBRTJCO0FBQVQsaUJBQXpDLEVBQWtFO0FBQUVyQixrQkFBQUEsSUFBSSxFQUFFO0FBQVIsaUJBQWxFLENBaEJ4Qjs7QUFBQTtBQWdCUTRCLGdCQUFBQSxPQWhCUjtBQWtCRTFCLGdCQUFBQSxNQUFNLENBQUMwQixPQUFPLENBQUNGLEtBQVQsQ0FBTixDQUFzQnRCLE9BQXRCLENBQThCbUIsbUJBQTlCOztBQWxCRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQXJCRjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBDRCxHQTNDTyxDQUFSO0FBNkNBNUMsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFNO0FBQ3hCc0IsSUFBQUEsRUFBRSxDQUFDLG9CQUFELDZGQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNGLG9CQUFRcEIsUUFBUixFQUFrQjtBQUFFYSxnQkFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRDtBQUFULGVBQWxCLEVBQXlDO0FBQUVNLGdCQUFBQSxJQUFJLEVBQUU7QUFBUixlQUF6QyxDQURFOztBQUFBO0FBQ2pCcEIsY0FBQUEsTUFEaUI7QUFFdkJzQixjQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUM4QyxLQUFSLENBQU4sQ0FBcUJ0QixPQUFyQixDQUE2QixDQUE3Qjs7QUFGdUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBdkIsR0FBRjtBQUtBSCxJQUFBQSxFQUFFLENBQUMsb0JBQUQsNkZBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ0Ysb0JBQVFwQixRQUFSLEVBQWtCO0FBQUVhLGdCQUFBQSxLQUFLLEVBQUUsQ0FBQyxPQUFEO0FBQVQsZUFBbEIsRUFBd0M7QUFBRU0sZ0JBQUFBLElBQUksRUFBRTtBQUFSLGVBQXhDLENBREU7O0FBQUE7QUFDakJwQixjQUFBQSxNQURpQjtBQUV2QnNCLGNBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQzhDLEtBQVIsQ0FBTixDQUFxQnRCLE9BQXJCLENBQTZCLENBQTdCOztBQUZ1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUF2QixHQUFGO0FBS0F6QixJQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsWUFBTTtBQUNoQ0EsTUFBQUEsUUFBUSxDQUFDLDhCQUFELEVBQWlDLFlBQU07QUFDN0NzQixRQUFBQSxFQUFFLENBQUMsZUFBRCw2RkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFDRyxvQkFBUXBCLFFBQVIsRUFBa0IsRUFBbEIsRUFBc0IsRUFBdEIsQ0FESDs7QUFBQTtBQUNaRCxrQkFBQUEsTUFEWTtBQUVsQnNCLGtCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUM4QyxLQUFSLENBQU4sQ0FBcUJ0QixPQUFyQixDQUE2QixDQUE3Qjs7QUFGa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBbEIsR0FBRjtBQUlBSCxRQUFBQSxFQUFFLENBQUMsMkJBQUQsNkZBQThCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBQ1Qsb0JBQVFwQixRQUFSLEVBQWtCO0FBQUVhLG9CQUFBQSxLQUFLLEVBQUUsQ0FBQyxPQUFEO0FBQVQsbUJBQWxCLEVBQXdDLEVBQXhDLENBRFM7O0FBQUE7QUFDeEJkLGtCQUFBQSxNQUR3QjtBQUU5QnNCLGtCQUFBQSxNQUFNLENBQUN0QixNQUFNLENBQUM4QyxLQUFSLENBQU4sQ0FBcUJ0QixPQUFyQixDQUE2QixDQUE3Qjs7QUFGOEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBOUIsR0FBRjtBQUlBSCxRQUFBQSxFQUFFLENBQUMsK0JBQUQsNkZBQWtDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBQ2Isb0JBQVFwQixRQUFSLEVBQWtCO0FBQUU4QyxvQkFBQUEsY0FBYyxFQUFFO0FBQWxCLG1CQUFsQixFQUE0QyxFQUE1QyxDQURhOztBQUFBO0FBQzVCL0Msa0JBQUFBLE1BRDRCO0FBRWxDc0Isa0JBQUFBLE1BQU0sQ0FBQ3RCLE1BQU0sQ0FBQzhDLEtBQVIsQ0FBTixDQUFxQnRCLE9BQXJCLENBQTZCLENBQTdCOztBQUZrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQUFsQyxHQUFGO0FBSUFILFFBQUFBLEVBQUUsQ0FBQyw2REFBRCw2RkFBZ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFDM0Msb0RBQWFwQixRQUFiO0FBQXVCOEMsb0JBQUFBLGNBQWMsRUFBRTtBQUF2QyxzQkFBK0M7QUFBRUEsb0JBQUFBLGNBQWMsRUFBRTtBQUFsQixtQkFBL0MsRUFBeUUsRUFBekUsQ0FEMkM7O0FBQUE7QUFDMUQvQyxrQkFBQUEsTUFEMEQ7QUFFaEVzQixrQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDOEMsS0FBUixDQUFOLENBQXFCdEIsT0FBckIsQ0FBNkIsQ0FBN0I7O0FBRmdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQWhFLEdBQUY7QUFJRCxPQWpCTyxDQUFSO0FBbUJBekIsTUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFNO0FBQ3pCSyxRQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNmLGNBQU1RLE9BQU8sR0FBR1gsUUFBUSxDQUFDVyxPQUFULENBQWlCcUMsTUFBakIsQ0FBd0I7QUFDdENuQyxZQUFBQSxLQUFLLEVBQUUsR0FEK0I7QUFFdENDLFlBQUFBLE9BQU8sRUFBRTtBQUY2QixXQUF4QixDQUFoQjtBQUlBZCxVQUFBQSxRQUFRLG1DQUNIQSxRQURHO0FBRU5TLFlBQUFBLFVBQVUsRUFBRSxVQUZOO0FBR05xQyxZQUFBQSxjQUFjLEVBQUUsSUFIVjtBQUlObkMsWUFBQUEsT0FBTyxFQUFQQTtBQUpNLFlBQVI7QUFNRCxTQVhTLENBQVY7QUFhQVMsUUFBQUEsRUFBRSxDQUFDbUIsSUFBSCw0bURBRUlWLFNBRkosRUFFZ0csQ0FGaEcsRUFHSSxJQUhKLEVBR2dHLENBSGhHLEVBSUksRUFKSixFQUlnRyxDQUpoRyxFQUtJLENBQUMsT0FBRCxDQUxKLEVBS2dHLElBTGhHLEVBTUksQ0FBQyxPQUFELEVBQVUsUUFBVixDQU5KLEVBTWdHLEdBTmhHLEVBT0ksQ0FBQyxPQUFELEVBQVUsUUFBVixDQVBKLEVBT2dHLEdBUGhHLEVBUUksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixDQVJKLEVBUWdHLElBUmhHLEVBU0ksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixDQVRKLEVBU2dHLElBVGhHLEVBVUksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixRQUE5QixDQVZKLEVBVWdHLENBVmhHLEVBV0ksQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixRQUFyQixDQVhKLEVBV2dHLElBWGhHLEVBWUksQ0FBQyxPQUFELEVBQVUsUUFBVixDQVpKLEVBWWdHLElBWmhHLEVBYUksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixjQUFwQixDQWJKLEVBYWdHLElBYmhHLEVBY0ksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixjQUE5QixFQUE4QyxXQUE5QyxDQWRKLEVBY2dHLENBZGhHLEVBZUksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixjQUE5QixFQUE4QyxXQUE5QyxFQUEyRCxNQUEzRCxDQWZKLEVBZWdHLENBZmhHLEVBZ0JJLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0IsUUFBcEIsRUFBOEIsUUFBOUIsRUFBd0MsY0FBeEMsRUFBd0QsV0FBeEQsRUFBcUUsTUFBckUsQ0FoQkosRUFnQmdHLENBaEJoRyxFQWlCSSxDQUFDLE9BQUQsRUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCLFFBQTlCLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELEVBQXFFLE1BQXJFLENBakJKLEVBaUJnRyxDQWpCaEcsRUFrQkksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixRQUE5QixFQUF3QyxRQUF4QyxFQUFrRCxjQUFsRCxFQUFrRSxXQUFsRSxFQUErRSxNQUEvRSxDQWxCSixFQWtCZ0csQ0FsQmhHLEVBbUJJLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0IsUUFBcEIsRUFBOEIsUUFBOUIsRUFBd0MsUUFBeEMsRUFBa0QsV0FBbEQsRUFBK0QsTUFBL0QsQ0FuQkosRUFtQmdHLENBbkJoRyxFQW9CSSxDQUFDLE9BQUQsRUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCLFFBQTlCLEVBQXdDLFFBQXhDLEVBQWtELFdBQWxELEVBQStELE1BQS9ELENBcEJKLEVBb0JnRyxJQXBCaEcsRUFxQkksQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixRQUE5QixFQUF3QyxRQUF4QyxFQUFrRCxXQUFsRCxDQXJCSixFQXFCZ0csR0FyQmhHLEVBc0JJLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0IsUUFBcEIsRUFBOEIsUUFBOUIsRUFBd0MsUUFBeEMsQ0F0QkosRUFzQmdHLElBdEJoRyxFQXdCRSx1RkF4QkY7QUFBQSxxR0F5QkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQVNXLG9CQUFBQSxZQUFULFVBQVNBLFlBQVQsRUFBdUJTLFFBQXZCLFVBQXVCQSxRQUF2QjtBQUNRTixvQkFBQUEsQ0FEUixHQUNZO0FBQ1JsQyxzQkFBQUEsVUFBVSxFQUFFLFVBREo7QUFFUkUsc0JBQUFBLE9BQU8sRUFBRSxDQUNQO0FBQUVDLHdCQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyx3QkFBQUEsS0FBSyxFQUFFLE9BQXJCO0FBQThCQyx3QkFBQUEsT0FBTyxFQUFFO0FBQXZDLHVCQURPLEVBRVA7QUFBRUYsd0JBQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNDLHdCQUFBQSxLQUFLLEVBQUUsUUFBckI7QUFBK0JDLHdCQUFBQSxPQUFPLEVBQUU7QUFBeEMsdUJBRk8sRUFHUDtBQUFFRix3QkFBQUEsS0FBSyxFQUFFLEdBQVQ7QUFBY0Msd0JBQUFBLEtBQUssRUFBRSxRQUFyQjtBQUErQkMsd0JBQUFBLE9BQU8sRUFBRTtBQUF4Qyx1QkFITyxFQUlQO0FBQUVGLHdCQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyx3QkFBQUEsS0FBSyxFQUFFO0FBQXJCLHVCQUpPLEVBS1A7QUFBRUQsd0JBQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNDLHdCQUFBQSxLQUFLLEVBQUU7QUFBckIsdUJBTE8sRUFNUDtBQUFFRCx3QkFBQUEsS0FBSyxFQUFFLEdBQVQ7QUFBY0Msd0JBQUFBLEtBQUssRUFBRTtBQUFyQix1QkFOTyxFQU9QO0FBQUVELHdCQUFBQSxLQUFLLEVBQUUsR0FBVDtBQUFjQyx3QkFBQUEsS0FBSyxFQUFFLFFBQXJCO0FBQStCQyx3QkFBQUEsT0FBTyxFQUFFO0FBQXhDLHVCQVBPLEVBUVA7QUFBRUYsd0JBQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNDLHdCQUFBQSxLQUFLLEVBQUU7QUFBckIsdUJBUk8sRUFTUDtBQUFFRCx3QkFBQUEsS0FBSyxFQUFFLEdBQVQ7QUFBY0Msd0JBQUFBLEtBQUssRUFBRTtBQUFyQix1QkFUTztBQUZELHFCQURaO0FBQUE7QUFBQSwyQkFnQnVCLG9CQUFROEIsQ0FBUixFQUFXO0FBQUU5QixzQkFBQUEsS0FBSyxFQUFFMkI7QUFBVCxxQkFBWCxFQUFvQztBQUFFckIsc0JBQUFBLElBQUksRUFBRTtBQUFSLHFCQUFwQyxDQWhCdkI7O0FBQUE7QUFnQlFwQixvQkFBQUEsTUFoQlI7QUFpQkVzQixvQkFBQUEsTUFBTSxDQUFDdEIsTUFBTSxDQUFDOEMsS0FBUixDQUFOLENBQXFCdEIsT0FBckIsQ0FBNkIwQixRQUE3Qjs7QUFqQkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0F6QkY7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2Q0QsT0EzRE8sQ0FBUjtBQTRERCxLQWhGTyxDQUFSO0FBa0ZBN0IsSUFBQUEsRUFBRSxDQUFDbUIsSUFBSCxtT0FFSVYsU0FGSixFQUV1QixJQUZ2QixFQUdJLElBSEosRUFHdUIsSUFIdkIsRUFJSSxFQUpKLEVBSXVCLElBSnZCLEVBS0k7QUFBRWhCLE1BQUFBLEtBQUssRUFBRTtBQUFULEtBTEosRUFLdUIsS0FMdkIsRUFNRSx5REFORjtBQUFBLGlHQU02RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBU1osZ0JBQUFBLE9BQVQsVUFBU0EsT0FBVCxFQUFrQmlELEtBQWxCLFVBQWtCQSxLQUFsQjtBQUFBO0FBQUEsdUJBQzNDLG9CQUFRbEQsUUFBUixFQUFrQkMsT0FBbEIsRUFBMkI7QUFBRWtCLGtCQUFBQSxJQUFJLEVBQUU7QUFBUixpQkFBM0IsQ0FEMkM7O0FBQUE7QUFDckRtQixnQkFBQUEsQ0FEcUQ7QUFHM0RqQixnQkFBQUEsTUFBTSxDQUFDaUIsQ0FBRCxDQUFOLENBQVVmLE9BQVYsQ0FBa0I7QUFBRXNCLGtCQUFBQSxLQUFLLEVBQUUsQ0FBVDtBQUFZSyxrQkFBQUEsS0FBSyxFQUFMQTtBQUFaLGlCQUFsQjs7QUFIMkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FON0Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXRCxHQXhHTyxDQUFSO0FBMEdBcEQsRUFBQUEsUUFBUSxDQUFDLGtCQUFELEVBQXFCLFlBQU07QUFDakNzQixJQUFBQSxFQUFFLENBQUMsNENBQUQsNkZBQStDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQzVCLHlDQUE2QnBCLFFBQTdCLEVBQXVDO0FBQUVtQixnQkFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JnQyxnQkFBQUEsSUFBSSxFQUFFO0FBQXhCLGVBQXZDLENBRDRCOztBQUFBO0FBQ3pDZCxjQUFBQSxJQUR5QztBQUUvQ2hCLGNBQUFBLE1BQU0sQ0FBQ2dCLElBQUQsQ0FBTixDQUFhZCxPQUFiLENBQXFCO0FBQUVuQixnQkFBQUEsRUFBRSxFQUFFLEdBQU47QUFBV1MsZ0JBQUFBLEtBQUssRUFBRSxDQUFDLE9BQUQ7QUFBbEIsZUFBckI7O0FBRitDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQS9DLEdBQUY7QUFLQU8sSUFBQUEsRUFBRSxDQUFDLDZCQUFELDZGQUFnQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNULHlDQUE2QnBCLFFBQTdCLEVBQXVDO0FBQUVtQixnQkFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JnQyxnQkFBQUEsSUFBSSxFQUFFO0FBQXhCLGVBQXZDLENBRFM7O0FBQUE7QUFDMUJDLGNBQUFBLFFBRDBCO0FBRWhDL0IsY0FBQUEsTUFBTSxDQUFDK0IsUUFBRCxDQUFOLENBQWlCQyxRQUFqQjs7QUFGZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBaEMsR0FBRjtBQUlELEdBVk8sQ0FBUjtBQVlBdkQsRUFBQUEsUUFBUSxDQUFDLFdBQUQsRUFBYyxZQUFNO0FBQzFCc0IsSUFBQUEsRUFBRSxDQUFDLHVEQUFELDZGQUEwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUN2QyxzREFBZXBCLFFBQWY7QUFBeUJzRCxnQkFBQUEsWUFBWSxFQUFFO0FBQXZDLGlCQUR1Qzs7QUFBQTtBQUNwRGpCLGNBQUFBLElBRG9EO0FBRzFEaEIsY0FBQUEsTUFBTSxDQUFDZ0IsSUFBRCxDQUFOLENBQWFkLE9BQWIsK0NBQTBCZ0Msb0JBQTFCLEdBQXVDdkQsUUFBdkM7QUFBaUR3RCxnQkFBQUEsYUFBYSxFQUFFO0FBQWhFOztBQUgwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUExRCxHQUFGO0FBTUFwQyxJQUFBQSxFQUFFLENBQUMsb0RBQUQsNkZBQXVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ3BDLHNEQUFlcEIsUUFBZjtBQUF5QnNELGdCQUFBQSxZQUFZLEVBQUU7QUFBdkMsaUJBRG9DOztBQUFBO0FBQ2pEakIsY0FBQUEsSUFEaUQ7QUFHdkRoQixjQUFBQSxNQUFNLENBQUNnQixJQUFELENBQU4sQ0FBYWQsT0FBYiwrQ0FBMEJnQyxvQkFBMUIsR0FBdUN2RCxRQUF2QztBQUFpRHdELGdCQUFBQSxhQUFhLEVBQUU7QUFBaEU7O0FBSHVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQXZELEdBQUY7QUFNQXBDLElBQUFBLEVBQUUsQ0FBQyx1RUFBRCw2RkFBMEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFDdkQsc0RBQWVwQixRQUFmO0FBQXlCc0QsZ0JBQUFBLFlBQVksRUFBRSxJQUF2QztBQUE2Q0UsZ0JBQUFBLGFBQWEsRUFBRTtBQUE1RCxpQkFEdUQ7O0FBQUE7QUFDcEVuQixjQUFBQSxJQURvRTtBQUcxRWhCLGNBQUFBLE1BQU0sQ0FBQ2dCLElBQUQsQ0FBTixDQUFhZCxPQUFiLCtDQUEwQmdDLG9CQUExQixHQUF1Q3ZELFFBQXZDO0FBQWlEd0QsZ0JBQUFBLGFBQWEsRUFBRTtBQUFoRTs7QUFIMEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBMUUsR0FBRjtBQU1BcEMsSUFBQUEsRUFBRSxDQUFDLDhCQUFELDZGQUFpQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNkLHNCQUFVcEIsUUFBVixDQURjOztBQUFBO0FBQzNCcUMsY0FBQUEsSUFEMkI7QUFHakNoQixjQUFBQSxNQUFNLENBQUNnQixJQUFELENBQU4sQ0FBYWQsT0FBYiwrQ0FBMEJnQyxvQkFBMUIsR0FBdUN2RCxRQUF2QztBQUFpRHdELGdCQUFBQSxhQUFhLEVBQUU7QUFBaEU7O0FBSGlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQWpDLEdBQUY7QUFLRCxHQXhCTyxDQUFSO0FBeUJELENBdmRPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2RlbCwgb3V0Y29tZSwgZ2V0U2NvcmUsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIG5vcm1hbGl6ZSB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IGlzUmVzcG9uc2VDb3JyZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuamVzdC5tb2NrKCcuLi91dGlscycsICgpID0+ICh7XG4gIGlzUmVzcG9uc2VDb3JyZWN0OiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgcmVzdWx0LCBxdWVzdGlvbiwgc2Vzc2lvbiwgZW52O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHF1ZXN0aW9uID0ge1xuICAgICAgaWQ6ICcxJyxcbiAgICAgIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnLFxuICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VQcmVmaXg6ICdsZXR0ZXJzJyxcbiAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IHsgc3RyaW5naWZ5IH0gPSBKU09OO1xuXG4gIGRlc2NyaWJlKCdtb2RlbCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnbW9kZTogZ2F0aGVyJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaXNhYmxlZCkudG9FcXVhbChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbW9kZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5tb2RlKS50b0VxdWFsKCdnYXRoZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBwcm9tcHQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucHJvbXB0KS50b0VxdWFsKCdwcm9tcHQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VNb2RlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZU1vZGUpLnRvRXF1YWwoJ3JhZGlvJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlUHJlZml4JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleU1vZGUpLnRvRXF1YWwoJ2xldHRlcnMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7IGxhYmVsOiAnYScsIHZhbHVlOiAnYXBwbGUnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiYW5hbmEnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgcmV0dXJuIHJlc3BvbnNlQ29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZUNvcnJlY3QpLnRvQmUodW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7IGlkOiAnMScsIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcXVlc3Rpb24gPSB7IC4uLnF1ZXN0aW9uLCBsb2NrQ2hvaWNlT3JkZXI6IGZhbHNlIH07XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcblxuICAgICAgICBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAnbXVsdGlwbGUtY2hvaWNlJywge1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsnYXBwbGUnLCAnYmFuYW5hJ10pLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGU6IHZpZXcnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICd2aWV3JyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaXNhYmxlZCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGU6IGV2YWx1YXRlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICAgIGlzUmVzcG9uc2VDb3JyZWN0Lm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlcyB3LyBjb3JyZWN0IGV2ZW4gaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBqZXN0LmZuKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBmZWVkYmFjayB1bmRlZmluZWQgaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBqZXN0LmZuKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBwcm9wZXIgZmVlZGJhY2sgaWYgZmVlZGJhY2tFbmFibGVkIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgZmVlZGJhY2tFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgamVzdC5mbigpLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiAnZm9vJyxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdJbmNvcnJlY3QnLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGlzIHJlc3BvbnNlIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucmVzcG9uc2VDb3JyZWN0KS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXR1cm5zQ29ycmVjdG5lc3MgPSAoc2VzcykgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyByZXNwb25zZUNvcnJlY3Q6IGZhbHNlIGlmIHNlc3Npb24gaXMgJHtzdHJpbmdpZnkoc2Vzcyl9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG8gPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2VzcywgZW52KTtcblxuICAgICAgICAgIGV4cGVjdChvLnJlc3BvbnNlQ29ycmVjdCkudG9FcXVhbChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuc0NvcnJlY3RuZXNzKHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm5zQ29ycmVjdG5lc3MobnVsbCk7XG4gICAgICByZXR1cm5zQ29ycmVjdG5lc3Moe30pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Nob2ljZVByZWZpeCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgZWxlbWVudDogJ211bHRpcGxlLWNob2ljZScsXG4gICAgICAgIHByb21wdDogJ3Byb21wdCcsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnYScsXG4gICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG4gICAgICBpdCgncmV0dXJucyBkZWZhdWx0IGxldHRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQua2V5TW9kZSkudG9FcXVhbCgnbGV0dGVycycpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTY29yZScsICgpID0+IHtcbiAgICBpdC5lYWNoYFxuICAgICAgc2Vzc2lvblZhbHVlICAgICAgICAgICAgICAgICB8IGV4cGVjdGVkRHljaG90b21vdXMgfCBleHBlY3RlZFBhcnRpYWxTY29yaW5nXG4gICAgICAke3VuZGVmaW5lZH0gICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7bnVsbH0gICAgICAgICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbXX0gICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYSddfSAgICAgICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2UnXX0gICAgICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydhJywgJ2InXX0gICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdjJ119ICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2EnLCAnZCddfSAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydhJywgJ2UnXX0gICAgICAgICAgICAgICAgfCAkezF9ICAgICAgICAgICAgICAgIHwgJHsxfVxuICAgICAgJHtbJ2EnLCAnYicsICdjJ119ICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdiJywgJ2QnXX0gICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2InLCAnZSddfSAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdiJywgJ2MnLCAnZCddfSAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2InLCAnYycsICdlJ119ICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddfSB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdjJywgJ2QnLCAnZSddfSAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2QnLCAnZSddfSAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgYChcbiAgICAgICdzZXNzaW9uID0gJHNlc3Npb25WYWx1ZTsgcGFydGlhbCBzY29yaW5nID0gdHJ1ZSA9PiBzY29yZSA9ICRleHBlY3RlZFBhcnRpYWxTY29yaW5nIC8gcGFydGlhbCBzY29yaW5nID0gZmFsc2UgPT4gc2NvcmUgPSAkZXhwZWN0ZWREeWNob3RvbW91cycsXG4gICAgICBhc3luYyAoeyBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkUGFydGlhbFNjb3JpbmcsIGV4cGVjdGVkRHljaG90b21vdXMgfSkgPT4ge1xuICAgICAgICBjb25zdCBxID0ge1xuICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ2EnLCB2YWx1ZTogJ2EnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnYicsIHZhbHVlOiAnYicgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjJywgdmFsdWU6ICdjJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2QnLCB2YWx1ZTogJ2QnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnZScsIHZhbHVlOiAnZScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdFBTID0gYXdhaXQgb3V0Y29tZShxLCB7IHZhbHVlOiBzZXNzaW9uVmFsdWUgfSwgeyBtb2RlOiAnZXZhbHVhdGUgJyB9KTtcblxuICAgICAgICBleHBlY3QocmVzdWx0UFMuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWRQYXJ0aWFsU2NvcmluZyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0RCA9IGF3YWl0IG91dGNvbWUoeyAuLi5xLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSwgeyB2YWx1ZTogc2Vzc2lvblZhbHVlIH0sIHsgbW9kZTogJ2V2YWx1YXRlICcgfSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdEQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWREeWNob3RvbW91cyk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHNjb3JlIG9mIDAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IHZhbHVlOiBbJ2JhbmFuYSddIH0sIHsgbW9kZTogJ2dhdGhlcicgfSk7XG4gICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgc2NvcmUgb2YgMScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgdmFsdWU6IFsnYXBwbGUnXSB9LCB7IG1vZGU6ICdnYXRoZXInIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwYXJ0aWFsIHNjb3JpbmcnLCAoKSA9PiB7XG4gICAgICBkZXNjcmliZSgnY2hvaWNlTW9kZTpyYWRpbyBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgaXQoJ3dpdGggZGVmYXVsdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge30sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3dpdGggZGVmYXVsdHMgYW5kIGNvcnJlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyB2YWx1ZTogWydhcHBsZSddIH0sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3dpdGggZW52LnBhcnRpYWxTY29yaW5nOiB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSwge30pO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnd2l0aCBlbnYucGFydGlhbFNjb3Jpbmc6IHRydWUgKyBjb25maWcucGFydGlhbFNjb3Jpbmc6IHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZSh7IC4uLnF1ZXN0aW9uLCBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LCB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNob2ljZXMgPSBxdWVzdGlvbi5jaG9pY2VzLmNvbmNhdCh7XG4gICAgICAgICAgICB2YWx1ZTogJ2MnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBxdWVzdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgY2hvaWNlTW9kZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgIHBhcnRpYWxTY29yaW5nOiB0cnVlLFxuICAgICAgICAgICAgY2hvaWNlcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBpdC5lYWNoYFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXhwZWN0ZWRcbiAgICAgICAgICAke3VuZGVmaW5lZH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke251bGx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke1tdfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke1snYXBwbGUnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC4yNX1cbiAgICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgICAgICR7WydhcHBsZScsICdiYW5hbmEnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdjaGVycnknXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdncmFwZXMnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdncmFwZXMnLCAnY2hlcnJ5J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezF9XG4gICAgICAgICAgJHtbJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbiddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdlbGRlcmJlcnJpZXMnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2R1cmlhbicsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2R1cmlhbicsICdqYWNrZnJ1aXQnXX0gICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdncmFwZXMnLCAnZHVyaWFuJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC43NX1cbiAgICAgICAgYChcbiAgICAgICAgICAnb3V0Y29tZTogcGFydGlhbCBzY29yaW5nID0gdHJ1ZSwgc2Vzc2lvblZhbHVlID0gJHNlc3Npb25WYWx1ZSA9PiBleHBlY3RlZCA9ICRleHBlY3RlZCcsXG4gICAgICAgICAgYXN5bmMgKHsgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxID0ge1xuICAgICAgICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2EnLCB2YWx1ZTogJ2FwcGxlJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiYW5hbmEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2MnLCB2YWx1ZTogJ2NoZXJyeScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZCcsIHZhbHVlOiAnZHVyaWFuJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdlJywgdmFsdWU6ICdlbGRlcmJlcnJpZXMnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2YnLCB2YWx1ZTogJ2ZlaWpvYScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZycsIHZhbHVlOiAnZ3JhcGVzJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdqJywgdmFsdWU6ICdqYWNrZnJ1aXQnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2snLCB2YWx1ZTogJ2tpd2knIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHEsIHsgdmFsdWU6IHNlc3Npb25WYWx1ZSB9LCB7IG1vZGU6ICdldmFsdWF0ZSAnIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQuZWFjaGBcbiAgICAgIHNlc3Npb24gICAgICAgICAgfCBlbXB0eVxuICAgICAgJHt1bmRlZmluZWR9ICAgICB8ICR7dHJ1ZX1cbiAgICAgICR7bnVsbH0gICAgICAgICAgfCAke3RydWV9XG4gICAgICAke3t9fSAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICAgJHt7IHZhbHVlOiBbXSB9fSB8ICR7ZmFsc2V9XG4gICAgYCgncmV0dXJucyBzY29yZTogMCBhbmQgZW1wdHk6IHRydWUgaWYgc2Vzc2lvbiBpcyAkc2Vzc2lvbicsIGFzeW5jICh7IHNlc3Npb24sIGVtcHR5IH0pID0+IHtcbiAgICAgIGNvbnN0IG8gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG5cbiAgICAgIGV4cGVjdChvKS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5IH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IFsnYXBwbGUnXSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgZW52IGlzIHN0dWRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ25vcm1hbGl6ZScsICgpID0+IHtcbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiBob3Jpem9udGFsIGlmIHZlcnRpY2FsTW9kZTogZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgbm9ybWFsaXplKHsgLi4ucXVlc3Rpb24sIHZlcnRpY2FsTW9kZTogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAnaG9yaXpvbnRhbCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiB2ZXJ0aWNhbCBpZiB2ZXJ0aWNhbE1vZGU6IHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgbm9ybWFsaXplKHsgLi4ucXVlc3Rpb24sIHZlcnRpY2FsTW9kZTogdHJ1ZSB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyAuLi5kZWZhdWx0cywgLi4ucXVlc3Rpb24sIGNob2ljZXNMYXlvdXQ6ICd2ZXJ0aWNhbCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiBncmlkIGlmIHZlcnRpY2FsTW9kZTogdHJ1ZSAmJiBjaG9pY2VzTGF5b3V0OiBncmlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IHRydWUsIGNob2ljZXNMYXlvdXQ6ICdncmlkJyB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyAuLi5kZWZhdWx0cywgLi4ucXVlc3Rpb24sIGNob2ljZXNMYXlvdXQ6ICdncmlkJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXRzIGNob2ljZXNMYXlvdXQ6IHZlcnRpY2FsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZShxdWVzdGlvbik7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAndmVydGljYWwnIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19