@pie-element/inline-dropdown 8.3.2-tip-tap.2 → 8.3.2-tip-tap.3

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.
@@ -0,0 +1,948 @@
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 _defaults = _interopRequireDefault(require("../defaults"));
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('inline-dropdown', function () {
20
+ var result, question, session, env;
21
+ beforeEach(function () {
22
+ question = {
23
+ displayType: 'block',
24
+ language: 'english',
25
+ lockChoiceOrder: false,
26
+ choices: {
27
+ 0: [{
28
+ correct: false,
29
+ value: '9719395',
30
+ label: '20,000'
31
+ }, {
32
+ correct: false,
33
+ value: '9719396',
34
+ label: '17,000'
35
+ }, {
36
+ correct: false,
37
+ value: '9719397',
38
+ label: '16,100'
39
+ }, {
40
+ correct: true,
41
+ value: '9719398',
42
+ label: '16,000',
43
+ rationale: 'rationale for choice'
44
+ }]
45
+ },
46
+ element: 'inline-dropdown-element',
47
+ rationale: '',
48
+ prompt: '<p>\n <strong><span style="color: #000000; font-family: Arial;">El número 16,101</span></strong> <strong><span style="color: #000000; font-family: Arial;">redondeado al</span></strong> <strong><span style="color: #000000; font-family: Arial;">millar más cercano es&nbsp;______________.</span></strong>\n</p>\n<p>\n <strong><span style="color: #000000;">&nbsp;</span></strong>\n</p>',
49
+ scoringType: 'auto',
50
+ teacherInstructions: true,
51
+ studentInstructions: false,
52
+ partialScoring: false,
53
+ markup: '{{0}}',
54
+ id: '2421310',
55
+ alternateResponses: null
56
+ };
57
+ });
58
+ describe('edge cases', function () {
59
+ it('is ok is session is empty', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
60
+ var r;
61
+ return _regenerator["default"].wrap(function _callee$(_context) {
62
+ while (1) {
63
+ switch (_context.prev = _context.next) {
64
+ case 0:
65
+ session = {};
66
+ env = {
67
+ mode: 'evaluate'
68
+ };
69
+ _context.next = 4;
70
+ return (0, _index.model)(question, {}, {
71
+ mode: 'evaluate'
72
+ });
73
+
74
+ case 4:
75
+ r = _context.sent;
76
+ expect(r).toBeDefined();
77
+
78
+ case 6:
79
+ case "end":
80
+ return _context.stop();
81
+ }
82
+ }
83
+ }, _callee);
84
+ })));
85
+ });
86
+ describe('model - with updateSession', function () {
87
+ it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
88
+ var updateSession;
89
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
90
+ while (1) {
91
+ switch (_context2.prev = _context2.next) {
92
+ case 0:
93
+ session = {
94
+ id: '1',
95
+ element: 'inline-dropdown-element'
96
+ };
97
+ env = {
98
+ mode: 'gather'
99
+ };
100
+ updateSession = jest.fn().mockResolvedValue();
101
+ _context2.next = 5;
102
+ return (0, _index.model)(question, session, env, updateSession);
103
+
104
+ case 5:
105
+ expect(updateSession).toHaveBeenCalledWith('1', 'inline-dropdown-element', {
106
+ shuffledValues: expect.arrayContaining(['9719395', '9719396', '9719397', '9719398'])
107
+ });
108
+
109
+ case 6:
110
+ case "end":
111
+ return _context2.stop();
112
+ }
113
+ }
114
+ }, _callee2);
115
+ })));
116
+ });
117
+ });
118
+ var question = {
119
+ displayType: 'block',
120
+ language: 'english',
121
+ prompt: 'Use the drop-downs to complete the sentence',
122
+ markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
123
+ choices: {
124
+ 0: [{
125
+ label: 'cow ',
126
+ value: '0',
127
+ correct: true,
128
+ rationale: 'rationale cow'
129
+ }, {
130
+ label: 'dog ',
131
+ value: '1',
132
+ correct: false,
133
+ rationale: 'rationale dog'
134
+ }, {
135
+ label: 'cat ',
136
+ value: '2',
137
+ correct: false,
138
+ rationale: 'rationale cat'
139
+ }],
140
+ 1: [{
141
+ label: 'over ',
142
+ value: '0',
143
+ correct: true,
144
+ rationale: 'rationale over'
145
+ }, {
146
+ label: 'under ',
147
+ value: '1',
148
+ correct: false,
149
+ rationale: 'rationale under'
150
+ }, {
151
+ label: 'across ',
152
+ value: '2',
153
+ correct: false,
154
+ rationale: 'rationale across'
155
+ }],
156
+ 2: [{
157
+ label: 'moon ',
158
+ value: '0',
159
+ correct: true,
160
+ rationale: 'rationale moon'
161
+ }, {
162
+ label: 'sun',
163
+ value: '2',
164
+ correct: false,
165
+ rationale: 'rationale sun'
166
+ }, {
167
+ label: 'house ',
168
+ value: '3',
169
+ correct: false,
170
+ rationale: 'rationale house'
171
+ }]
172
+ }
173
+ };
174
+ describe('controller', function () {
175
+ describe('model', function () {
176
+ var q;
177
+ var updateSession = jest.fn().mockResolvedValue();
178
+ it('output when session is defined', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
179
+ var m;
180
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
181
+ while (1) {
182
+ switch (_context3.prev = _context3.next) {
183
+ case 0:
184
+ _context3.next = 2;
185
+ return (0, _index.model)(question, {
186
+ value: {
187
+ 0: '0',
188
+ 1: '0',
189
+ 2: '0'
190
+ }
191
+ }, {
192
+ mode: 'evaluate'
193
+ }, updateSession);
194
+
195
+ case 2:
196
+ m = _context3.sent;
197
+ expect(m).toEqual(expect.objectContaining({
198
+ feedback: {
199
+ 0: 'correct',
200
+ 1: 'correct',
201
+ 2: 'correct'
202
+ },
203
+ responseCorrect: true
204
+ }));
205
+
206
+ case 4:
207
+ case "end":
208
+ return _context3.stop();
209
+ }
210
+ }
211
+ }, _callee3);
212
+ })));
213
+
214
+ var returnModel = function returnModel(session) {
215
+ it("output when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
216
+ var m;
217
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
218
+ while (1) {
219
+ switch (_context4.prev = _context4.next) {
220
+ case 0:
221
+ _context4.next = 2;
222
+ return (0, _index.model)(question, session, {
223
+ mode: 'evaluate'
224
+ }, updateSession);
225
+
226
+ case 2:
227
+ m = _context4.sent;
228
+ expect(m).toEqual(expect.objectContaining({
229
+ feedback: {
230
+ 0: 'incorrect',
231
+ 1: 'incorrect',
232
+ 2: 'incorrect'
233
+ },
234
+ responseCorrect: false
235
+ }));
236
+
237
+ case 4:
238
+ case "end":
239
+ return _context4.stop();
240
+ }
241
+ }
242
+ }, _callee4);
243
+ })));
244
+ };
245
+
246
+ returnModel(undefined);
247
+ returnModel(null);
248
+ returnModel({});
249
+ var choicesWithNullRationale = {
250
+ 0: [{
251
+ label: 'cow ',
252
+ value: '0',
253
+ correct: true,
254
+ rationale: null
255
+ }, {
256
+ label: 'dog ',
257
+ value: '1',
258
+ correct: false,
259
+ rationale: null
260
+ }, {
261
+ label: 'cat ',
262
+ value: '2',
263
+ correct: false,
264
+ rationale: null
265
+ }],
266
+ 1: [{
267
+ label: 'over ',
268
+ value: '0',
269
+ correct: true,
270
+ rationale: null
271
+ }, {
272
+ label: 'under ',
273
+ value: '1',
274
+ correct: false,
275
+ rationale: null
276
+ }, {
277
+ label: 'across ',
278
+ value: '2',
279
+ correct: false,
280
+ rationale: null
281
+ }],
282
+ 2: [{
283
+ label: 'moon ',
284
+ value: '0',
285
+ correct: true,
286
+ rationale: null
287
+ }, {
288
+ label: 'sun',
289
+ value: '2',
290
+ correct: false,
291
+ rationale: null
292
+ }, {
293
+ label: 'house ',
294
+ value: '3',
295
+ correct: false,
296
+ rationale: null
297
+ }]
298
+ };
299
+
300
+ var assertGather = function assertGather(label, extra, session, expected) {
301
+ it("'mode: gather, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
302
+ var result;
303
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
304
+ while (1) {
305
+ switch (_context5.prev = _context5.next) {
306
+ case 0:
307
+ q = _objectSpread(_objectSpread({}, question), {}, {
308
+ alternateResponse: {
309
+ 2: ['2']
310
+ },
311
+ lockChoiceOrder: true,
312
+ teacherInstructions: 'Teacher Instructions',
313
+ rationale: 'Rationale'
314
+ }, extra);
315
+ _context5.next = 3;
316
+ return (0, _index.model)(q, _objectSpread({
317
+ id: '1',
318
+ element: 'explicit-constructed-response'
319
+ }, session), {
320
+ mode: 'gather'
321
+ }, updateSession);
322
+
323
+ case 3:
324
+ result = _context5.sent;
325
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
326
+ disabled: false,
327
+ mode: 'gather',
328
+ feedback: {},
329
+ responseCorrect: undefined,
330
+ choices: choicesWithNullRationale
331
+ }, expected));
332
+
333
+ case 5:
334
+ case "end":
335
+ return _context5.stop();
336
+ }
337
+ }
338
+ }, _callee5);
339
+ })));
340
+ };
341
+
342
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
343
+ rationale: null,
344
+ teacherInstructions: null
345
+ });
346
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
347
+ promptEnabled: false,
348
+ rationaleEnabled: false,
349
+ teacherInstructionsEnabled: false,
350
+ studentInstructionsEnabled: false
351
+ }, {}, {
352
+ prompt: null,
353
+ rationale: null,
354
+ teacherInstructions: null
355
+ });
356
+
357
+ var assertView = function assertView(label, extra, session, expected) {
358
+ it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
359
+ var result;
360
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
361
+ while (1) {
362
+ switch (_context6.prev = _context6.next) {
363
+ case 0:
364
+ q = _objectSpread(_objectSpread({}, question), {}, {
365
+ alternateResponse: {
366
+ 2: ['2']
367
+ },
368
+ lockChoiceOrder: true,
369
+ teacherInstructions: 'Teacher Instructions',
370
+ rationale: 'Rationale'
371
+ }, extra);
372
+ _context6.next = 3;
373
+ return (0, _index.model)(q, _objectSpread({
374
+ id: '1',
375
+ element: 'explicit-constructed-response'
376
+ }, session), {
377
+ mode: 'view',
378
+ role: 'instructor'
379
+ }, updateSession);
380
+
381
+ case 3:
382
+ result = _context6.sent;
383
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
384
+ mode: 'view',
385
+ disabled: true,
386
+ feedback: {},
387
+ responseCorrect: undefined
388
+ }, expected));
389
+
390
+ case 5:
391
+ case "end":
392
+ return _context6.stop();
393
+ }
394
+ }
395
+ }, _callee6);
396
+ })));
397
+ };
398
+
399
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled set to false', {
400
+ promptEnabled: false,
401
+ rationaleEnabled: false,
402
+ teacherInstructionsEnabled: false,
403
+ studentInstructionsEnabled: false,
404
+ choiceRationaleEnabled: false
405
+ }, {}, {
406
+ prompt: null,
407
+ rationale: null,
408
+ teacherInstructions: null,
409
+ choices: choicesWithNullRationale
410
+ });
411
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled unset', {}, {}, {
412
+ teacherInstructions: 'Teacher Instructions',
413
+ rationale: 'Rationale'
414
+ });
415
+
416
+ var assertViewStudent = function assertViewStudent(label, extra, session, expected) {
417
+ it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
418
+ var result;
419
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
420
+ while (1) {
421
+ switch (_context7.prev = _context7.next) {
422
+ case 0:
423
+ q = _objectSpread(_objectSpread({}, question), {}, {
424
+ alternateResponse: {
425
+ 2: ['2']
426
+ },
427
+ lockChoiceOrder: true,
428
+ teacherInstructions: 'Teacher Instructions',
429
+ rationale: 'Rationale'
430
+ }, extra);
431
+ _context7.next = 3;
432
+ return (0, _index.model)(q, _objectSpread({
433
+ id: '1',
434
+ element: 'explicit-constructed-response'
435
+ }, session), {
436
+ mode: 'view',
437
+ role: 'student'
438
+ });
439
+
440
+ case 3:
441
+ result = _context7.sent;
442
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
443
+ mode: 'view',
444
+ disabled: true,
445
+ feedback: {},
446
+ responseCorrect: undefined,
447
+ choices: choicesWithNullRationale
448
+ }, expected));
449
+
450
+ case 5:
451
+ case "end":
452
+ return _context7.stop();
453
+ }
454
+ }
455
+ }, _callee7);
456
+ })));
457
+ };
458
+
459
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
460
+ promptEnabled: false,
461
+ rationaleEnabled: false,
462
+ teacherInstructionsEnabled: false,
463
+ studentInstructionsEnabled: false
464
+ }, {}, {
465
+ prompt: null,
466
+ rationale: null,
467
+ teacherInstructions: null
468
+ });
469
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
470
+ rationale: null,
471
+ teacherInstructions: null
472
+ });
473
+
474
+ var assertEvaluate = function assertEvaluate(label, extra, session, expected) {
475
+ it("'mode: evaluate, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
476
+ var result;
477
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
478
+ while (1) {
479
+ switch (_context8.prev = _context8.next) {
480
+ case 0:
481
+ q = _objectSpread(_objectSpread({}, question), {}, {
482
+ alternateResponse: {
483
+ 0: ['2'],
484
+ 1: ['2'],
485
+ 2: ['2']
486
+ },
487
+ lockChoiceOrder: true,
488
+ teacherInstructions: 'Teacher Instructions',
489
+ rationale: 'Rationale',
490
+ choiceRationaleEnabled: true
491
+ }, extra);
492
+ _context8.next = 3;
493
+ return (0, _index.model)(q, _objectSpread({
494
+ id: '1',
495
+ element: 'explicit-constructed-response'
496
+ }, session), {
497
+ mode: 'evaluate',
498
+ role: 'instructor'
499
+ }, updateSession);
500
+
501
+ case 3:
502
+ result = _context8.sent;
503
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
504
+ teacherInstructions: 'Teacher Instructions',
505
+ rationale: 'Rationale',
506
+ mode: 'evaluate',
507
+ disabled: true
508
+ }, expected));
509
+
510
+ case 5:
511
+ case "end":
512
+ return _context8.stop();
513
+ }
514
+ }
515
+ }, _callee8);
516
+ })));
517
+ };
518
+
519
+ assertEvaluate('- correct answer', {}, {
520
+ value: {
521
+ 0: '0',
522
+ 1: '0',
523
+ 2: '0'
524
+ }
525
+ }, {
526
+ feedback: {
527
+ 0: 'correct',
528
+ 1: 'correct',
529
+ 2: 'correct'
530
+ },
531
+ responseCorrect: true
532
+ });
533
+ assertEvaluate('- partially correct answer', {}, {
534
+ value: {
535
+ 0: '0',
536
+ 1: '0',
537
+ 2: '1'
538
+ }
539
+ }, {
540
+ feedback: {
541
+ 0: 'correct',
542
+ 1: 'correct',
543
+ 2: 'incorrect'
544
+ },
545
+ responseCorrect: false
546
+ });
547
+ assertEvaluate('- partially correct answer using alternates', {}, {
548
+ value: {
549
+ 0: '2',
550
+ 1: '1',
551
+ 2: '2'
552
+ }
553
+ }, {
554
+ feedback: {
555
+ 0: 'correct',
556
+ 1: 'incorrect',
557
+ 2: 'correct'
558
+ },
559
+ responseCorrect: false
560
+ });
561
+ assertEvaluate('- incorrect answer', {}, {
562
+ value: {
563
+ 0: '1',
564
+ 1: '1',
565
+ 2: '1'
566
+ }
567
+ }, {
568
+ feedback: {
569
+ 0: 'incorrect',
570
+ 1: 'incorrect',
571
+ 2: 'incorrect'
572
+ },
573
+ responseCorrect: false
574
+ });
575
+ });
576
+ describe('get score', function () {
577
+ var assertScore = function assertScore(session, expected) {
578
+ it('return score', function () {
579
+ var score = (0, _index.getScore)(question, session);
580
+ expect(score).toEqual(expected);
581
+ });
582
+ };
583
+
584
+ assertScore({
585
+ value: {
586
+ 0: '0',
587
+ 1: '0',
588
+ 2: '0'
589
+ }
590
+ }, 1);
591
+ assertScore({
592
+ value: {
593
+ 0: '0',
594
+ 1: '0',
595
+ 2: '1'
596
+ }
597
+ }, 0.67);
598
+ assertScore({
599
+ value: {
600
+ 0: '0',
601
+ 1: '1',
602
+ 2: '1'
603
+ }
604
+ }, 0.33);
605
+ assertScore({
606
+ value: {
607
+ 0: '1',
608
+ 1: '1',
609
+ 2: '1'
610
+ }
611
+ }, 0);
612
+
613
+ var returnScore = function returnScore(session) {
614
+ it("score = 0 when session is ".concat(JSON.stringify(session)), function () {
615
+ expect((0, _index.getScore)(question, session)).toEqual(0);
616
+ });
617
+ };
618
+
619
+ returnScore(undefined);
620
+ returnScore(null);
621
+ returnScore({});
622
+ });
623
+ describe('outcome partialScoring test', function () {
624
+ var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
625
+ it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
626
+ var result;
627
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
628
+ while (1) {
629
+ switch (_context9.prev = _context9.next) {
630
+ case 0:
631
+ _context9.next = 2;
632
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
633
+
634
+ case 2:
635
+ result = _context9.sent;
636
+ expect(result).toEqual(expect.objectContaining(expected));
637
+
638
+ case 4:
639
+ case "end":
640
+ return _context9.stop();
641
+ }
642
+ }
643
+ }, _callee9);
644
+ })));
645
+ };
646
+
647
+ assertOutcome('element.partialScoring = true', {
648
+ partialScoring: true
649
+ }, {
650
+ value: {
651
+ 0: '0',
652
+ 1: '0',
653
+ 2: '1'
654
+ }
655
+ }, {
656
+ mode: 'evaluate'
657
+ }, {
658
+ score: 0.67
659
+ });
660
+ assertOutcome('element.partialScoring = false', {
661
+ partialScoring: false
662
+ }, {
663
+ value: {
664
+ 0: '0',
665
+ 1: '0',
666
+ 2: '1'
667
+ }
668
+ }, {
669
+ mode: 'evaluate'
670
+ }, {
671
+ score: 0
672
+ });
673
+ assertOutcome('element.partialScoring = false, env.partialScoring = true', {
674
+ partialScoring: false
675
+ }, {
676
+ value: {
677
+ 0: '0',
678
+ 1: '0',
679
+ 2: '1'
680
+ }
681
+ }, {
682
+ mode: 'evaluate',
683
+ partialScoring: true
684
+ }, {
685
+ score: 0
686
+ });
687
+ assertOutcome('element.partialScoring = true, env.partialScoring = false', {
688
+ partialScoring: true
689
+ }, {
690
+ value: {
691
+ 0: '0',
692
+ 1: '0',
693
+ 2: '1'
694
+ }
695
+ }, {
696
+ mode: 'evaluate',
697
+ partialScoring: false
698
+ }, {
699
+ score: 0
700
+ });
701
+ });
702
+ describe('outcome', function () {
703
+ var assertOutcome = function assertOutcome(partialScoring, sessionValue, expected) {
704
+ it("partial score ".concat(partialScoring ? 'enabled' : 'disabled'), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
705
+ var result;
706
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
707
+ while (1) {
708
+ switch (_context10.prev = _context10.next) {
709
+ case 0:
710
+ _context10.next = 2;
711
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
712
+ partialScoring: partialScoring
713
+ }), sessionValue);
714
+
715
+ case 2:
716
+ result = _context10.sent;
717
+ expect(result).toEqual(expected);
718
+
719
+ case 4:
720
+ case "end":
721
+ return _context10.stop();
722
+ }
723
+ }
724
+ }, _callee10);
725
+ })));
726
+ };
727
+
728
+ assertOutcome(true, {
729
+ value: {
730
+ 0: '0',
731
+ 1: '0',
732
+ 2: '0'
733
+ }
734
+ }, {
735
+ score: 1,
736
+ empty: false
737
+ });
738
+ assertOutcome(true, {
739
+ value: {
740
+ 0: '0',
741
+ 1: '0',
742
+ 2: '1'
743
+ }
744
+ }, {
745
+ score: 0.67,
746
+ empty: false
747
+ });
748
+ assertOutcome(true, {
749
+ value: {
750
+ 0: '0',
751
+ 1: '1',
752
+ 2: '1'
753
+ }
754
+ }, {
755
+ score: 0.33,
756
+ empty: false
757
+ });
758
+ assertOutcome(true, {
759
+ value: {
760
+ 0: '1',
761
+ 1: '1',
762
+ 2: '1'
763
+ }
764
+ }, {
765
+ score: 0,
766
+ empty: false
767
+ });
768
+ assertOutcome(false, {
769
+ value: {
770
+ 0: '0',
771
+ 1: '0',
772
+ 2: '0'
773
+ }
774
+ }, {
775
+ score: 1,
776
+ empty: false
777
+ });
778
+ assertOutcome(false, {
779
+ value: {
780
+ 0: '0',
781
+ 1: '0',
782
+ 2: '1'
783
+ }
784
+ }, {
785
+ score: 0,
786
+ empty: false
787
+ });
788
+ assertOutcome(false, {
789
+ value: {
790
+ 0: '0',
791
+ 1: '1',
792
+ 2: '1'
793
+ }
794
+ }, {
795
+ score: 0,
796
+ empty: false
797
+ });
798
+ assertOutcome(false, {
799
+ value: {
800
+ 0: '1',
801
+ 1: '1',
802
+ 2: '1'
803
+ }
804
+ }, {
805
+ score: 0,
806
+ empty: false
807
+ });
808
+
809
+ var returnModel = function returnModel(session) {
810
+ it("empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
811
+ var m;
812
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
813
+ while (1) {
814
+ switch (_context11.prev = _context11.next) {
815
+ case 0:
816
+ _context11.next = 2;
817
+ return (0, _index.outcome)(question, session);
818
+
819
+ case 2:
820
+ m = _context11.sent;
821
+ expect(m).toEqual(expect.objectContaining({
822
+ score: 0,
823
+ empty: true
824
+ }));
825
+
826
+ case 4:
827
+ case "end":
828
+ return _context11.stop();
829
+ }
830
+ }
831
+ }, _callee11);
832
+ })));
833
+ };
834
+
835
+ returnModel(undefined);
836
+ returnModel(null);
837
+ returnModel({});
838
+ });
839
+ describe('correct response', function () {
840
+ it('returns correct response if role is instructor and mode is gather', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
841
+ var sess;
842
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
843
+ while (1) {
844
+ switch (_context12.prev = _context12.next) {
845
+ case 0:
846
+ _context12.next = 2;
847
+ return (0, _index.createCorrectResponseSession)(question, {
848
+ mode: 'gather',
849
+ role: 'instructor'
850
+ });
851
+
852
+ case 2:
853
+ sess = _context12.sent;
854
+ expect(sess).toEqual({
855
+ id: '1',
856
+ value: {
857
+ 0: '0',
858
+ 1: '0',
859
+ 2: '0'
860
+ }
861
+ });
862
+
863
+ case 4:
864
+ case "end":
865
+ return _context12.stop();
866
+ }
867
+ }
868
+ }, _callee12);
869
+ })));
870
+ it('returns correct response if role is instructor and mode is view', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
871
+ var sess;
872
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
873
+ while (1) {
874
+ switch (_context13.prev = _context13.next) {
875
+ case 0:
876
+ _context13.next = 2;
877
+ return (0, _index.createCorrectResponseSession)(question, {
878
+ mode: 'view',
879
+ role: 'instructor'
880
+ });
881
+
882
+ case 2:
883
+ sess = _context13.sent;
884
+ expect(sess).toEqual({
885
+ id: '1',
886
+ value: {
887
+ 0: '0',
888
+ 1: '0',
889
+ 2: '0'
890
+ }
891
+ });
892
+
893
+ case 4:
894
+ case "end":
895
+ return _context13.stop();
896
+ }
897
+ }
898
+ }, _callee13);
899
+ })));
900
+ it('returns null if mode is evaluate', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
901
+ var noResult;
902
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
903
+ while (1) {
904
+ switch (_context14.prev = _context14.next) {
905
+ case 0:
906
+ _context14.next = 2;
907
+ return (0, _index.createCorrectResponseSession)(question, {
908
+ mode: 'evaluate',
909
+ role: 'instructor'
910
+ });
911
+
912
+ case 2:
913
+ noResult = _context14.sent;
914
+ expect(noResult).toBeNull();
915
+
916
+ case 4:
917
+ case "end":
918
+ return _context14.stop();
919
+ }
920
+ }
921
+ }, _callee14);
922
+ })));
923
+ it('returns null if role is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
924
+ var noResult;
925
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
926
+ while (1) {
927
+ switch (_context15.prev = _context15.next) {
928
+ case 0:
929
+ _context15.next = 2;
930
+ return (0, _index.createCorrectResponseSession)(question, {
931
+ mode: 'gather',
932
+ role: 'student'
933
+ });
934
+
935
+ case 2:
936
+ noResult = _context15.sent;
937
+ expect(noResult).toBeNull();
938
+
939
+ case 4:
940
+ case "end":
941
+ return _context15.stop();
942
+ }
943
+ }
944
+ }, _callee15);
945
+ })));
946
+ });
947
+ });
948
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJkaXNwbGF5VHlwZSIsImxhbmd1YWdlIiwibG9ja0Nob2ljZU9yZGVyIiwiY2hvaWNlcyIsImNvcnJlY3QiLCJ2YWx1ZSIsImxhYmVsIiwicmF0aW9uYWxlIiwiZWxlbWVudCIsInByb21wdCIsInNjb3JpbmdUeXBlIiwidGVhY2hlckluc3RydWN0aW9ucyIsInN0dWRlbnRJbnN0cnVjdGlvbnMiLCJwYXJ0aWFsU2NvcmluZyIsIm1hcmt1cCIsImlkIiwiYWx0ZXJuYXRlUmVzcG9uc2VzIiwiaXQiLCJtb2RlIiwiciIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwidXBkYXRlU2Vzc2lvbiIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJzaHVmZmxlZFZhbHVlcyIsImFycmF5Q29udGFpbmluZyIsInEiLCJtIiwidG9FcXVhbCIsIm9iamVjdENvbnRhaW5pbmciLCJmZWVkYmFjayIsInJlc3BvbnNlQ29ycmVjdCIsInJldHVybk1vZGVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsImNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSIsImFzc2VydEdhdGhlciIsImV4dHJhIiwiZXhwZWN0ZWQiLCJhbHRlcm5hdGVSZXNwb25zZSIsImRpc2FibGVkIiwicHJvbXB0RW5hYmxlZCIsInJhdGlvbmFsZUVuYWJsZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCIsInN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkIiwiYXNzZXJ0VmlldyIsInJvbGUiLCJjaG9pY2VSYXRpb25hbGVFbmFibGVkIiwiYXNzZXJ0Vmlld1N0dWRlbnQiLCJhc3NlcnRFdmFsdWF0ZSIsImFzc2VydFNjb3JlIiwic2NvcmUiLCJyZXR1cm5TY29yZSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwic2Vzc2lvblZhbHVlIiwiZW1wdHkiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLFlBQU07QUFDaEMsTUFBSUMsTUFBSixFQUFZQyxRQUFaLEVBQXNCQyxPQUF0QixFQUErQkMsR0FBL0I7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZkgsSUFBQUEsUUFBUSxHQUFHO0FBQ1RJLE1BQUFBLFdBQVcsRUFBRSxPQURKO0FBRVRDLE1BQUFBLFFBQVEsRUFBRSxTQUZEO0FBR1RDLE1BQUFBLGVBQWUsRUFBRSxLQUhSO0FBSVRDLE1BQUFBLE9BQU8sRUFBRTtBQUNQLFdBQUcsQ0FDRDtBQUNFQyxVQUFBQSxPQUFPLEVBQUUsS0FEWDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsU0FGVDtBQUdFQyxVQUFBQSxLQUFLLEVBQUU7QUFIVCxTQURDLEVBTUQ7QUFDRUYsVUFBQUEsT0FBTyxFQUFFLEtBRFg7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFNBRlQ7QUFHRUMsVUFBQUEsS0FBSyxFQUFFO0FBSFQsU0FOQyxFQVdEO0FBQ0VGLFVBQUFBLE9BQU8sRUFBRSxLQURYO0FBRUVDLFVBQUFBLEtBQUssRUFBRSxTQUZUO0FBR0VDLFVBQUFBLEtBQUssRUFBRTtBQUhULFNBWEMsRUFnQkQ7QUFDRUYsVUFBQUEsT0FBTyxFQUFFLElBRFg7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFNBRlQ7QUFHRUMsVUFBQUEsS0FBSyxFQUFFLFFBSFQ7QUFJRUMsVUFBQUEsU0FBUyxFQUFFO0FBSmIsU0FoQkM7QUFESSxPQUpBO0FBNkJUQyxNQUFBQSxPQUFPLEVBQUUseUJBN0JBO0FBOEJURCxNQUFBQSxTQUFTLEVBQUUsRUE5QkY7QUErQlRFLE1BQUFBLE1BQU0sRUFDSixpWUFoQ087QUFpQ1RDLE1BQUFBLFdBQVcsRUFBRSxNQWpDSjtBQWtD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QXFDRCxDQTdmTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U2NvcmUsIG91dGNvbWUsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIG1vZGVsIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuZGVzY3JpYmUoJ2lubGluZS1kcm9wZG93bicsICgpID0+IHtcbiAgbGV0IHJlc3VsdCwgcXVlc3Rpb24sIHNlc3Npb24sIGVudjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBxdWVzdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlUeXBlOiAnYmxvY2snLFxuICAgICAgbGFuZ3VhZ2U6ICdlbmdsaXNoJyxcbiAgICAgIGxvY2tDaG9pY2VPcmRlcjogZmFsc2UsXG4gICAgICBjaG9pY2VzOiB7XG4gICAgICAgIDA6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NScsXG4gICAgICAgICAgICBsYWJlbDogJzIwLDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NicsXG4gICAgICAgICAgICBsYWJlbDogJzE3LDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NycsXG4gICAgICAgICAgICBsYWJlbDogJzE2LDEwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICc5NzE5Mzk4JyxcbiAgICAgICAgICAgIGxhYmVsOiAnMTYsMDAwJyxcbiAgICAgICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgY2hvaWNlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGVsZW1lbnQ6ICdpbmxpbmUtZHJvcGRvd24tZWxlbWVudCcsXG4gICAgICByYXRpb25hbGU6ICcnLFxuICAgICAgcHJvbXB0OlxuICAgICAgICAnPHA+XFxuICA8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBBcmlhbDtcIj5FbCBuw7ptZXJvIDE2LDEwMTwvc3Bhbj48L3N0cm9uZz4gPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+cmVkb25kZWFkbyBhbDwvc3Bhbj48L3N0cm9uZz4gPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+bWlsbGFyIG3DoXMgY2VyY2FubyBlcyZuYnNwO19fX19fX19fX19fX19fLjwvc3Bhbj48L3N0cm9uZz5cXG48L3A+XFxuPHA+XFxuICA8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7XCI+Jm5ic3A7PC9zcGFuPjwvc3Ryb25nPlxcbjwvcD4nLFxuICAgICAgc2NvcmluZ1R5cGU6ICdhdXRvJyxcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IHRydWUsXG4gICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zOiBmYWxzZSxcbiAgICAgIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbiAgICAgIG1hcmt1cDogJ3t7MH19JyxcbiAgICAgIGlkOiAnMjQyMTMxMCcsXG4gICAgICBhbHRlcm5hdGVSZXNwb25zZXM6IG51bGwsXG4gICAgfTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2lzIG9rIGlzIHNlc3Npb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXNzaW9uID0ge307XG4gICAgICBlbnYgPSB7IG1vZGU6ICdldmFsdWF0ZScgfTtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwge30sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcbiAgICAgIGV4cGVjdChyKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwgLSB3aXRoIHVwZGF0ZVNlc3Npb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXNzaW9uID0geyBpZDogJzEnLCBlbGVtZW50OiAnaW5saW5lLWRyb3Bkb3duLWVsZW1lbnQnIH07XG4gICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICBjb25zdCB1cGRhdGVTZXNzaW9uID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKCk7XG4gICAgICBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52LCB1cGRhdGVTZXNzaW9uKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVTZXNzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnMScsICdpbmxpbmUtZHJvcGRvd24tZWxlbWVudCcsIHtcbiAgICAgICAgc2h1ZmZsZWRWYWx1ZXM6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWyc5NzE5Mzk1JywgJzk3MTkzOTYnLCAnOTcxOTM5NycsICc5NzE5Mzk4J10pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmNvbnN0IHF1ZXN0aW9uID0ge1xuICBkaXNwbGF5VHlwZTogJ2Jsb2NrJyxcbiAgbGFuZ3VhZ2U6ICdlbmdsaXNoJyxcbiAgcHJvbXB0OiAnVXNlIHRoZSBkcm9wLWRvd25zIHRvIGNvbXBsZXRlIHRoZSBzZW50ZW5jZScsXG4gIG1hcmt1cDogJzxkaXY+PHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+PC9kaXY+JyxcbiAgY2hvaWNlczoge1xuICAgIDA6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGNvdycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2RvZyAnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGRvZycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGNhdCcsXG4gICAgICB9LFxuICAgIF0sXG4gICAgMTogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ292ZXIgJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIG92ZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd1bmRlciAnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIHVuZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgYWNyb3NzJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAyOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnbW9vbiAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgbW9vbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgc3VuJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBob3VzZScsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5kZXNjcmliZSgnY29udHJvbGxlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ21vZGVsJywgKCkgPT4ge1xuICAgIGxldCBxO1xuICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcblxuICAgIGl0KCdvdXRwdXQgd2hlbiBzZXNzaW9uIGlzIGRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0sIHsgbW9kZTogJ2V2YWx1YXRlJyB9LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2NvcnJlY3QnIH0sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSwgdXBkYXRlU2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Nb2RlbCh1bmRlZmluZWQpO1xuICAgIHJldHVybk1vZGVsKG51bGwpO1xuICAgIHJldHVybk1vZGVsKHt9KTtcblxuICAgIGNvbnN0IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSA9IHtcbiAgICAgIDA6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnY293ICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnZG9nICcsXG4gICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIDE6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnb3ZlciAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3VuZGVyICcsXG4gICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2Fjcm9zcyAnLFxuICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIDI6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnbW9vbiAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2hvdXNlICcsXG4gICAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCBhc3NlcnRHYXRoZXIgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBnYXRoZXIsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtb2RlOiAnZ2F0aGVyJyB9LFxuICAgICAgICAgIHVwZGF0ZVNlc3Npb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBub3Qgc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXcgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiB2aWV3LCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgYWx0ZXJuYXRlUmVzcG9uc2U6IHsgMjogWycyJ10gfSxcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHsgaWQ6ICcxJywgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJywgLi4uc2Vzc2lvbiB9LFxuICAgICAgICAgIHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSxcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCwgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgYW5kIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgY2hvaWNlUmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRWaWV3KFxuICAgICAgJyArIHJvbGU6IGluc3RydWN0b3IsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQsIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIGFuZCBjaG9pY2VSYXRpb25hbGVFbmFibGVkIHVuc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3U3R1ZGVudCA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAndmlldycsIHJvbGU6ICdzdHVkZW50JyB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgY2hvaWNlczogY2hvaWNlc1dpdGhOdWxsUmF0aW9uYWxlLFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXdTdHVkZW50KFxuICAgICAgJyArIHJvbGU6IHN0dWRlbnQsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHVuc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydEV2YWx1YXRlID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogZXZhbHVhdGUsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAwOiBbJzInXSwgMTogWycyJ10sIDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICBjaG9pY2VSYXRpb25hbGVFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHsgaWQ6ICcxJywgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJywgLi4uc2Vzc2lvbiB9LFxuICAgICAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcm9sZTogJ2luc3RydWN0b3InIH0sXG4gICAgICAgICAgdXBkYXRlU2Vzc2lvbixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgMTogJzAnLFxuICAgICAgICAgIDI6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJzAnLFxuICAgICAgICAgIDE6ICcwJyxcbiAgICAgICAgICAyOiAnMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyIHVzaW5nIGFsdGVybmF0ZXMnLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJzInLFxuICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAyOiAnMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gaW5jb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMScsXG4gICAgICAgICAgMTogJzEnLFxuICAgICAgICAgIDI6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdpbmNvcnJlY3QnLCAxOiAnaW5jb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCBzY29yZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTY29yZSA9IChzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoJ3JldHVybiBzY29yZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KHNjb3JlKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCAxKTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcxJyB9IH0sIDAuNjcpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIDAuMzMpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzEnLCAxOiAnMScsIDI6ICcxJyB9IH0sIDApO1xuXG4gICAgY29uc3QgcmV0dXJuU2NvcmUgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHNjb3JlID0gMCB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbikpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuU2NvcmUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5TY29yZShudWxsKTtcbiAgICByZXR1cm5TY29yZSh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lIHBhcnRpYWxTY29yaW5nIHRlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChtZXNzYWdlLCBleHRyYSwgc2Vzc2lvblZhbHVlLCBlbnYsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMC42NyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChwYXJ0aWFsU2NvcmluZywgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYHBhcnRpYWwgc2NvcmUgJHtwYXJ0aWFsU2NvcmluZyA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgcGFydGlhbFNjb3JpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgZW1wdHk6IHRydWUgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBzY29yZTogMCwgZW1wdHk6IHRydWUgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiByb2xlIGlzIGluc3RydWN0b3IgYW5kIG1vZGUgaXMgdmlldycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHJvbGUgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==