| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528 |
19×
21×
2×
21×
19×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
1×
1×
1×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
3×
3×
1×
1×
1×
1×
1×
1×
1×
4×
4×
1×
4×
12×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
1×
1×
1×
1×
1×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
3×
1×
1×
1×
1×
1×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
3×
1×
2×
1×
1×
1×
1×
1×
1×
3×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
2×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
2×
2×
1×
2×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
| 'use strict';
// istanbul ignore next
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
// istanbul ignore next
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; Iif (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); Iif (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else Eif ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
// istanbul ignore next
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
// istanbul ignore next
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
// istanbul ignore next
function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _chai = require('chai');
var _ = require('../');
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
describe('shallow', function () {
describe('.contains(node)', function () {
it('should allow matches on the root node', function () {
var a = _react2['default'].createElement('div', { className: 'foo' });
var b = _react2['default'].createElement('div', { className: 'foo' });
var c = _react2['default'].createElement('div', { className: 'bar' });
(0, _chai.expect)((0, _.shallow)(a).contains(b)).to.be['true'];
(0, _chai.expect)((0, _.shallow)(a).contains(c)).to.be['false'];
});
it('should allow matches on a nested node', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo' })
));
var b = _react2['default'].createElement('div', { className: 'foo' });
(0, _chai.expect)(wrapper.contains(b)).to.be['true'];
});
it('should match composite components', function () {
var Foo = (function (_React$Component) {
_inherits(Foo, _React$Component);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(Foo, null)
));
var b = _react2['default'].createElement(Foo, null);
(0, _chai.expect)(wrapper.contains(b)).to.be['true'];
});
});
describe('.find(selector)', function () {
it('should find an element based on a class name', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' })
));
(0, _chai.expect)(wrapper.find('.foo').type()).to.equal('input');
});
it('should find an element based on a tag name', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' })
));
(0, _chai.expect)(wrapper.find('input').props().className).to.equal('foo');
});
it('should find a component based on a constructor', function () {
var Foo = (function (_React$Component2) {
_inherits(Foo, _React$Component2);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(Foo, { className: 'foo' })
));
(0, _chai.expect)(wrapper.find(Foo).type()).to.equal(Foo);
});
it('should find multiple elements based on a class name', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('button', { className: 'foo' })
));
(0, _chai.expect)(wrapper.find('.foo').length).to.equal(2);
});
it('should find multiple elements based on a tag name', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('input', null),
_react2['default'].createElement('button', null)
));
(0, _chai.expect)(wrapper.find('input').length).to.equal(2);
(0, _chai.expect)(wrapper.find('button').length).to.equal(1);
});
it('should find multiple elements based on a constructor', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('input', null),
_react2['default'].createElement('button', null)
));
(0, _chai.expect)(wrapper.find('input').length).to.equal(2);
(0, _chai.expect)(wrapper.find('button').length).to.equal(1);
});
it('should throw on a complex selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('input', null),
_react2['default'].createElement('button', null)
));
(0, _chai.expect)(function () {
return wrapper.find('.foo .foo');
}).to['throw'];
});
});
describe('.findWhere(predicate)', function () {
it('should return all elements for a truthy test', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('input', null)
));
(0, _chai.expect)(wrapper.findWhere(function () {
return true;
}).length).to.equal(3);
});
it('should return no elements for a falsy test', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('input', { className: 'foo' }),
_react2['default'].createElement('input', null)
));
(0, _chai.expect)(wrapper.findWhere(function () {
return false;
}).length).to.equal(0);
});
it('should call the predicate with the wrapped node as the first argument', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' }),
_react2['default'].createElement('div', { className: 'foo bux' })
));
var stub = _sinon2['default'].stub();
stub.returns(true);
var spy = _sinon2['default'].spy(stub);
wrapper.findWhere(spy);
(0, _chai.expect)(spy.callCount).to.equal(4);
(0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[3][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true'];
(0, _chai.expect)(spy.args[3][0].hasClass('bux')).to.be['true'];
});
});
describe('.setProps(newProps)', function () {
it('should set props for a component multiple times', function () {
var Foo = (function (_React$Component3) {
_inherits(Foo, _React$Component3);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
{ className: this.props.id },
this.props.id
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { id: 'foo' }));
(0, _chai.expect)(wrapper.find('.foo').length).to.equal(1);
wrapper.setProps({ id: 'bar', foo: 'bla' });
(0, _chai.expect)(wrapper.find('.bar').length).to.equal(1);
});
it('should call componentWillReceiveProps for new renders', function () {
var spy = _sinon2['default'].spy();
var Foo = (function (_React$Component4) {
_inherits(Foo, _React$Component4);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.componentWillReceiveProps = spy;
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
{ className: this.props.id },
this.props.id
);
}
}]);
return Foo;
})(_react2['default'].Component);
var nextProps = { id: 'bar', foo: 'bla' };
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { id: 'foo' }));
(0, _chai.expect)(spy.calledOnce).to.be['false'];
wrapper.setProps(nextProps);
(0, _chai.expect)(spy.calledOnce).to.be['true'];
(0, _chai.expect)(spy.calledWith(nextProps)).to.be['true'];
});
});
describe('.simulate(eventName, data)', function () {
it('should simulate events', function () {
var Foo = (function (_React$Component5) {
_inherits(Foo, _React$Component5);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.state = { count: 0 };
}
_createClass(Foo, [{
key: 'render',
value: function render() {
// istanbul ignore next
var _this = this;
return _react2['default'].createElement(
'a',
{
className: 'clicks-' + this.state.count,
onClick: function () {
return _this.setState({ count: _this.state.count + 1 });
}
},
'foo'
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
(0, _chai.expect)(wrapper.find('.clicks-0').length).to.equal(1);
wrapper.simulate('click');
(0, _chai.expect)(wrapper.find('.clicks-1').length).to.equal(1);
});
it('should pass in event data', function () {
var spy = _sinon2['default'].spy();
var Foo = (function (_React$Component6) {
_inherits(Foo, _React$Component6);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'a',
{ onClick: spy },
'foo'
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
var a = {};
var b = {};
wrapper.simulate('click', a, b);
(0, _chai.expect)(spy.args[0][0]).to.equal(a);
(0, _chai.expect)(spy.args[0][1]).to.equal(b);
});
});
describe('.setState(newState)', function () {
it('should set the state of the root node', function () {
var Foo = (function (_React$Component7) {
_inherits(Foo, _React$Component7);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.state = { id: 'foo' };
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', { className: this.state.id });
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
(0, _chai.expect)(wrapper.find('.foo').length).to.equal(1);
wrapper.setState({ id: 'bar' });
(0, _chai.expect)(wrapper.find('.bar').length).to.equal(1);
});
});
describe('.is(selector)', function () {
it('should return true when selector matches current element', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz' }));
(0, _chai.expect)(wrapper.is('.foo')).to.be['true'];
});
it('should allow for compound selectors', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz' }));
(0, _chai.expect)(wrapper.is('.foo.bar')).to.be['true'];
});
it('should return false when selector does not match', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'bar baz' }));
(0, _chai.expect)(wrapper.is('.foo')).to.be['false'];
});
});
describe('.not(selector)', function () {
it('filters to things not matching a selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bar baz' }),
_react2['default'].createElement('div', { className: 'foo' }),
_react2['default'].createElement('div', { className: 'bar baz' }),
_react2['default'].createElement('div', { className: 'baz' }),
_react2['default'].createElement('div', { className: 'foo bar' })
));
(0, _chai.expect)(wrapper.find('.foo').not('.bar').length).to.equal(1);
(0, _chai.expect)(wrapper.find('.baz').not('.foo').length).to.equal(2);
(0, _chai.expect)(wrapper.find('.foo').not('div').length).to.equal(0);
});
});
describe('.filter(selector)', function () {
it('should return a new wrapper of just the nodes that matched the selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bar baz' }),
_react2['default'].createElement('div', { className: 'foo' }),
_react2['default'].createElement(
'div',
{ className: 'bar baz' },
_react2['default'].createElement('div', { className: 'foo bar baz' }),
_react2['default'].createElement('div', { className: 'foo' })
),
_react2['default'].createElement('div', { className: 'baz' }),
_react2['default'].createElement('div', { className: 'foo bar' })
));
(0, _chai.expect)(wrapper.find('.foo').filter('.bar').length).to.equal(3);
(0, _chai.expect)(wrapper.find('.bar').filter('.foo').length).to.equal(3);
(0, _chai.expect)(wrapper.find('.bar').filter('.bax').length).to.equal(0);
(0, _chai.expect)(wrapper.find('.foo').filter('.baz.bar').length).to.equal(2);
});
it('should only look in the current wrappers nodes, not their children', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'bar' })
),
_react2['default'].createElement('div', { className: 'foo bar' })
));
(0, _chai.expect)(wrapper.find('.foo').filter('.bar').length).to.equal(1);
});
});
describe('.filterWhere(predicate)', function () {
it('should filter only the nodes of the wrapper', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' }),
_react2['default'].createElement('div', { className: 'foo bux' })
));
var stub = _sinon2['default'].stub();
stub.onCall(0).returns(false);
stub.onCall(1).returns(true);
stub.onCall(2).returns(false);
var baz = wrapper.find('.foo').filterWhere(stub);
(0, _chai.expect)(baz.length).to.equal(1);
(0, _chai.expect)(baz.hasClass('baz')).to.be['true'];
});
it('should call the predicate with the wrapped node as the first argument', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' }),
_react2['default'].createElement('div', { className: 'foo bux' })
));
var stub = _sinon2['default'].stub();
stub.returns(true);
var spy = _sinon2['default'].spy(stub);
wrapper.find('.foo').filterWhere(spy);
(0, _chai.expect)(spy.callCount).to.equal(3);
(0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[0][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[1][0].hasClass('baz')).to.be['true'];
(0, _chai.expect)(spy.args[2][0].hasClass('bux')).to.be['true'];
});
});
describe('.text()', function () {
var matchesRender = function matchesRender(node) {
var actual = (0, _.shallow)(node).text();
var expected = (0, _.render)(node).text();
(0, _chai.expect)(expected).to.equal(actual);
};
it('should handle simple text nodes', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
'some text'
));
(0, _chai.expect)(wrapper.text()).to.equal('some text');
});
it('should handle nodes with mapped children', function () {
var Foo = (function (_React$Component8) {
_inherits(Foo, _React$Component8);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
null,
this.props.items.map(function (x) {
return x;
})
);
}
}]);
return Foo;
})(_react2['default'].Component);
matchesRender(_react2['default'].createElement(Foo, { items: ['abc', 'def', 'hij'] }));
matchesRender(_react2['default'].createElement(Foo, { items: [_react2['default'].createElement(
'i',
{ key: 1 },
'abc'
), _react2['default'].createElement(
'i',
{ key: 2 },
'def'
), _react2['default'].createElement(
'i',
{ key: 3 },
'hij'
)] }));
});
it('should render composite components dumbly', function () {
var Foo = (function (_React$Component9) {
_inherits(Foo, _React$Component9);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(Foo, null),
_react2['default'].createElement(
'div',
null,
'test'
)
));
(0, _chai.expect)(wrapper.text()).to.equal('<Foo />test');
});
it('should handle html entities', function () {
matchesRender(_react2['default'].createElement(
'div',
null,
'>'
));
});
});
describe('.props()', function () {
it('should return the props object', function () {
var fn = function fn() {};
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ id: 'fooId', className: 'bax', onClick: fn },
_react2['default'].createElement('div', { className: 'baz' }),
_react2['default'].createElement('div', { className: 'foo' })
));
(0, _chai.expect)(wrapper.props().className).to.equal('bax');
(0, _chai.expect)(wrapper.props().onClick).to.equal(fn);
(0, _chai.expect)(wrapper.props().id).to.equal('fooId');
});
it('should be allowed to be used on an inner node', function () {
var fn = function fn() {};
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement('div', { className: 'baz', onClick: fn }),
_react2['default'].createElement('div', { className: 'foo', id: 'fooId' })
));
(0, _chai.expect)(wrapper.find('.baz').props().onClick).to.equal(fn);
(0, _chai.expect)(wrapper.find('.foo').props().id).to.equal('fooId');
});
});
describe('.state(name)', function () {
it('should return the state object', function () {
var Foo = (function (_React$Component10) {
_inherits(Foo, _React$Component10);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.state = { foo: 'foo' };
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
(0, _chai.expect)(wrapper.state()).to.eql({ foo: 'foo' });
});
it('should return the current state after state transitions', function () {
var Foo = (function (_React$Component11) {
_inherits(Foo, _React$Component11);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.state = { foo: 'foo' };
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
wrapper.setState({ foo: 'bar' });
(0, _chai.expect)(wrapper.state()).to.eql({ foo: 'bar' });
});
it('should allow a state property name be passed in as an argument', function () {
var Foo = (function (_React$Component12) {
_inherits(Foo, _React$Component12);
function Foo(props) {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props);
this.state = { foo: 'foo' };
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', null);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
(0, _chai.expect)(wrapper.state('foo')).to.equal('foo');
});
});
describe('.children([selector])', function () {
it('should return empty wrapper for node with no children', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', null));
(0, _chai.expect)(wrapper.children().length).to.equal(0);
});
it('should return the children nodes of the root', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo' }),
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'baz' })
));
(0, _chai.expect)(wrapper.children().length).to.equal(3);
(0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(wrapper.children().at(1).hasClass('bar')).to.be['true'];
(0, _chai.expect)(wrapper.children().at(2).hasClass('baz')).to.be['true'];
});
it('should not return any of the children of children', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'bar' })
),
_react2['default'].createElement('div', { className: 'baz' })
));
(0, _chai.expect)(wrapper.children().length).to.equal(2);
(0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(wrapper.children().at(1).hasClass('baz')).to.be['true'];
});
it('should handle mixed children with and without arrays', function () {
var Foo = (function (_React$Component13) {
_inherits(Foo, _React$Component13);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
null,
_react2['default'].createElement('span', { className: 'foo' }),
this.props.items.map(function (x) {
return x;
})
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { items: [_react2['default'].createElement(
'i',
{ key: 1, className: 'bar' },
'abc'
), _react2['default'].createElement(
'i',
{ key: 2, className: 'baz' },
'def'
)] }));
(0, _chai.expect)(wrapper.children().length).to.equal(3);
(0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(wrapper.children().at(1).hasClass('bar')).to.be['true'];
(0, _chai.expect)(wrapper.children().at(2).hasClass('baz')).to.be['true'];
});
it('should optionally allow a selector to filter by', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo' }),
_react2['default'].createElement('div', { className: 'bar bip' }),
_react2['default'].createElement('div', { className: 'baz bip' })
));
var children = wrapper.children('.bip');
(0, _chai.expect)(children.length).to.equal(2);
(0, _chai.expect)(children.at(0).hasClass('bar')).to.be['true'];
(0, _chai.expect)(children.at(1).hasClass('baz')).to.be['true'];
});
});
describe('.parents([selector])', function () {
it('should return an array of current nodes ancestors', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
)
)
));
var parents = wrapper.find('.baz').parents();
(0, _chai.expect)(parents.length).to.equal(3);
(0, _chai.expect)(parents.at(0).hasClass('bar')).to.be['true'];
(0, _chai.expect)(parents.at(1).hasClass('foo')).to.be['true'];
(0, _chai.expect)(parents.at(2).hasClass('bax')).to.be['true'];
});
it('should work for non-leaf nodes as well', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
)
)
));
var parents = wrapper.find('.bar').parents();
(0, _chai.expect)(parents.length).to.equal(2);
(0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(parents.at(1).hasClass('bax')).to.be['true'];
});
it('should optionally allow a selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax foo' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
)
)
));
var parents = wrapper.find('.baz').parents('.foo');
(0, _chai.expect)(parents.length).to.equal(2);
(0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(parents.at(1).hasClass('bax')).to.be['true'];
});
});
describe('.parent()', function () {
it('should return only the immediate parent of the node', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
)
)
));
(0, _chai.expect)(wrapper.find('.baz').parent().hasClass('bar')).to.be['true'];
});
it('should work for multiple nodes', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'baz' })
),
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
),
_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement('div', { className: 'baz' })
)
));
var parents = wrapper.find('.baz').parent();
(0, _chai.expect)(parents).to.have.length(3);
(0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(parents.at(1).hasClass('bar')).to.be['true'];
(0, _chai.expect)(parents.at(2).hasClass('bax')).to.be['true'];
});
});
describe('.closest(selector)', function () {
it('should return the closest ancestor for a given selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'foo baz' },
_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement('div', { className: 'bar' })
)
)
));
var closestFoo = wrapper.find('.bar').closest('.foo');
(0, _chai.expect)(closestFoo.hasClass('baz')).to.be['true'];
(0, _chai.expect)(closestFoo.length).to.equal(1);
});
it('should only ever return a wrapper of a single node', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'bar' },
_react2['default'].createElement('div', { className: 'baz' })
)
)
));
(0, _chai.expect)(wrapper.find('.baz').parent().hasClass('bar')).to.be['true'];
});
it('should return itself if matching', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'bax' },
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement(
'div',
{ className: 'baz' },
_react2['default'].createElement('div', { className: 'bux baz' })
)
)
));
(0, _chai.expect)(wrapper.find('.bux').closest('.baz').hasClass('bux')).to.be['true'];
});
});
describe('.hasClass(className)', function () {
it('should return whether or not node has a certain class', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz some-long-string FoOo' }));
(0, _chai.expect)(wrapper.hasClass('foo')).to.be['true'];
(0, _chai.expect)(wrapper.hasClass('bar')).to.be['true'];
(0, _chai.expect)(wrapper.hasClass('baz')).to.be['true'];
(0, _chai.expect)(wrapper.hasClass('some-long-string')).to.be['true'];
(0, _chai.expect)(wrapper.hasClass('FoOo')).to.be['true'];
(0, _chai.expect)(wrapper.hasClass('doesnt-exist')).to.be['false'];
});
});
describe('.forEach(fn)', function () {
it('should call a function for each node in the wrapper', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bax' }),
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' })
));
var spy = _sinon2['default'].spy();
wrapper.find('.foo').forEach(spy);
(0, _chai.expect)(spy.callCount).to.equal(3);
(0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true'];
});
});
describe('.map(fn)', function () {
it('should call a function with a wrapper for each node in the wrapper', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bax' }),
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' })
));
var spy = _sinon2['default'].spy();
wrapper.find('.foo').map(spy);
(0, _chai.expect)(spy.callCount).to.equal(3);
(0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true'];
});
it('should return an array with the mapped values', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bax' }),
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' })
));
var result = wrapper.find('.foo').map(function (w) {
return w.props().className;
});
(0, _chai.expect)(result).to.eql(['foo bax', 'foo bar', 'foo baz']);
});
});
describe('.reduce(fn[, initialValue])', function () {
it('should call a function with a wrapper for each node in the wrapper', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bax' }),
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' })
));
var spy = _sinon2['default'].spy(function (n) {
return n + 1;
});
wrapper.find('.foo').reduce(spy, 0);
(0, _chai.expect)(spy.callCount).to.equal(3);
(0, _chai.expect)(spy.args[0][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[0][1].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][1].hasClass('baz')).to.be['true'];
});
it('should accumulate a value', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { id: 'bax', className: 'foo qoo' }),
_react2['default'].createElement('div', { id: 'bar', className: 'foo boo' }),
_react2['default'].createElement('div', { id: 'baz', className: 'foo hoo' })
));
var result = wrapper.find('.foo').reduce(function (obj, n) {
obj[n.prop('id')] = n.prop('className');
return obj;
}, {});
(0, _chai.expect)(result).to.eql({
bax: 'foo qoo',
bar: 'foo boo',
baz: 'foo hoo'
});
});
});
describe('.reduceRight(fn[, initialValue])', function () {
it('should call a function with a wrapper for each node in the wrapper in reverse', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo bax' }),
_react2['default'].createElement('div', { className: 'foo bar' }),
_react2['default'].createElement('div', { className: 'foo baz' })
));
var spy = _sinon2['default'].spy(function (n) {
return n + 1;
});
wrapper.find('.foo').reduceRight(spy, 0);
(0, _chai.expect)(spy.callCount).to.equal(3);
(0, _chai.expect)(spy.args[0][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[0][1].hasClass('baz')).to.be['true'];
(0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ShallowWrapper);
(0, _chai.expect)(spy.args[2][1].hasClass('bax')).to.be['true'];
});
it('should accumulate a value', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { id: 'bax', className: 'foo qoo' }),
_react2['default'].createElement('div', { id: 'bar', className: 'foo boo' }),
_react2['default'].createElement('div', { id: 'baz', className: 'foo hoo' })
));
var result = wrapper.find('.foo').reduceRight(function (obj, n) {
obj[n.prop('id')] = n.prop('className');
return obj;
}, {});
(0, _chai.expect)(result).to.eql({
bax: 'foo qoo',
bar: 'foo boo',
baz: 'foo hoo'
});
});
});
describe('.some(selector)', function () {
it('should return if a node matches a selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo qoo' }),
_react2['default'].createElement('div', { className: 'foo boo' }),
_react2['default'].createElement('div', { className: 'foo hoo' })
));
(0, _chai.expect)(wrapper.find('.foo').some('.qoo')).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').some('.foo')).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').some('.bar')).to.be['false'];
});
});
describe('.someWhere(predicate)', function () {
it('should return if a node matches a predicate', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo qoo' }),
_react2['default'].createElement('div', { className: 'foo boo' }),
_react2['default'].createElement('div', { className: 'foo hoo' })
));
(0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) {
return n.hasClass('qoo');
})).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) {
return n.hasClass('foo');
})).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) {
return n.hasClass('bar');
})).to.be['false'];
});
});
describe('.every(selector)', function () {
it('should return if every node matches a selector', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo qoo' }),
_react2['default'].createElement('div', { className: 'foo boo' }),
_react2['default'].createElement('div', { className: 'foo hoo' })
));
(0, _chai.expect)(wrapper.find('.foo').every('.foo')).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').every('.qoo')).to.be['false'];
(0, _chai.expect)(wrapper.find('.foo').every('.bar')).to.be['false'];
});
});
describe('.everyWhere(predicate)', function () {
it('should return if every node matches a predicate', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'foo qoo' }),
_react2['default'].createElement('div', { className: 'foo boo' }),
_react2['default'].createElement('div', { className: 'foo hoo' })
));
(0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) {
return n.hasClass('foo');
})).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) {
return n.hasClass('qoo');
})).to.be['false'];
(0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) {
return n.hasClass('bar');
})).to.be['false'];
});
});
describe('.flatMap(fn)', function () {
it('should return a wrapper with the mapped and flattened nodes', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar' })
),
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'baz' }),
_react2['default'].createElement('div', { className: 'baz' })
),
_react2['default'].createElement(
'div',
{ className: 'foo' },
_react2['default'].createElement('div', { className: 'bax' }),
_react2['default'].createElement('div', { className: 'bax' })
)
));
var nodes = wrapper.find('.foo').flatMap(function (w) {
return w.children().nodes;
});
(0, _chai.expect)(nodes.length).to.equal(6);
(0, _chai.expect)(nodes.at(0).hasClass('bar')).to.be['true'];
(0, _chai.expect)(nodes.at(1).hasClass('bar')).to.be['true'];
(0, _chai.expect)(nodes.at(2).hasClass('baz')).to.be['true'];
(0, _chai.expect)(nodes.at(3).hasClass('baz')).to.be['true'];
(0, _chai.expect)(nodes.at(4).hasClass('bax')).to.be['true'];
(0, _chai.expect)(nodes.at(5).hasClass('bax')).to.be['true'];
});
});
describe('.shallow()', function () {
it('should return a shallow rendered instance of the current node', function () {
var Bar = (function (_React$Component14) {
_inherits(Bar, _React$Component14);
function Bar() {
_classCallCheck(this, Bar);
_get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Bar, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'in-bar' })
);
}
}]);
return Bar;
})(_react2['default'].Component);
var Foo = (function (_React$Component15) {
_inherits(Foo, _React$Component15);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
null,
_react2['default'].createElement(Bar, null)
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null));
(0, _chai.expect)(wrapper.find('.in-bar')).to.have.length(0);
(0, _chai.expect)(wrapper.find(Bar)).to.have.length(1);
(0, _chai.expect)(wrapper.find(Bar).shallow().find('.in-bar')).to.have.length(1);
});
});
describe('.first()', function () {
it('should return the first node in the current set', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'bar baz' }),
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar' })
));
(0, _chai.expect)(wrapper.find('.bar').first().hasClass('baz')).to.be['true'];
});
});
describe('.last()', function () {
it('should return the last node in the current set', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar' }),
_react2['default'].createElement('div', { className: 'bar baz' })
));
(0, _chai.expect)(wrapper.find('.bar').last().hasClass('baz')).to.be['true'];
});
});
describe('.isEmpty()', function () {
it('should return true iff wrapper is empty', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo' }));
(0, _chai.expect)(wrapper.find('.bar').isEmpty()).to.be['true'];
(0, _chai.expect)(wrapper.find('.foo').isEmpty()).to.be['false'];
});
});
describe('.at(index)', function () {
it('gets a wrapper of the node at the specified index', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'bar foo' }),
_react2['default'].createElement('div', { className: 'bar bax' }),
_react2['default'].createElement('div', { className: 'bar bux' }),
_react2['default'].createElement('div', { className: 'bar baz' })
));
(0, _chai.expect)(wrapper.find('.bar').at(0).hasClass('foo')).to.be['true'];
(0, _chai.expect)(wrapper.find('.bar').at(1).hasClass('bax')).to.be['true'];
(0, _chai.expect)(wrapper.find('.bar').at(2).hasClass('bux')).to.be['true'];
(0, _chai.expect)(wrapper.find('.bar').at(3).hasClass('baz')).to.be['true'];
});
});
describe('.get(index)', function () {
it('gets the node at the specified index', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement('div', { className: 'bar foo' }),
_react2['default'].createElement('div', { className: 'bar bax' }),
_react2['default'].createElement('div', { className: 'bar bux' }),
_react2['default'].createElement('div', { className: 'bar baz' })
));
(0, _chai.expect)(wrapper.find('.bar').get(0)).to.equal(wrapper.find('.foo').node);
(0, _chai.expect)(wrapper.find('.bar').get(1)).to.equal(wrapper.find('.bax').node);
(0, _chai.expect)(wrapper.find('.bar').get(2)).to.equal(wrapper.find('.bux').node);
(0, _chai.expect)(wrapper.find('.bar').get(3)).to.equal(wrapper.find('.baz').node);
});
});
describe('.debug()', function () {
it('should pass through to the debugNodes function', function () {
(0, _chai.expect)((0, _.shallow)(_react2['default'].createElement('div', null)).debug()).to.equal('<div />');
});
});
describe('.html()', function () {
it('should return html of straight DOM elements', function () {
var wrapper = (0, _.shallow)(_react2['default'].createElement(
'div',
{ className: 'test' },
_react2['default'].createElement(
'span',
null,
'Hello World!'
)
));
(0, _chai.expect)(wrapper.html()).to.equal('<div class="test"><span>Hello World!</span></div>');
});
it('should render out nested composite components', function () {
var Foo = (function (_React$Component16) {
_inherits(Foo, _React$Component16);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', { className: 'in-foo' });
}
}]);
return Foo;
})(_react2['default'].Component);
var Bar = (function (_React$Component17) {
_inherits(Bar, _React$Component17);
function Bar() {
_classCallCheck(this, Bar);
_get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Bar, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
{ className: 'in-bar' },
_react2['default'].createElement(Foo, null)
);
}
}]);
return Bar;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Bar, null));
(0, _chai.expect)(wrapper.html()).to.equal('<div class="in-bar"><div class="in-foo"></div></div>');
(0, _chai.expect)(wrapper.find(Foo).html()).to.equal('<div class="in-foo"></div>');
});
});
describe('.render()', function () {
it('should return a cheerio wrapper around the current node', function () {
var Foo = (function (_React$Component18) {
_inherits(Foo, _React$Component18);
function Foo() {
_classCallCheck(this, Foo);
_get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Foo, [{
key: 'render',
value: function render() {
return _react2['default'].createElement('div', { className: 'in-foo' });
}
}]);
return Foo;
})(_react2['default'].Component);
var Bar = (function (_React$Component19) {
_inherits(Bar, _React$Component19);
function Bar() {
_classCallCheck(this, Bar);
_get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments);
}
_createClass(Bar, [{
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
{ className: 'in-bar' },
_react2['default'].createElement(Foo, null)
);
}
}]);
return Bar;
})(_react2['default'].Component);
var wrapper = (0, _.shallow)(_react2['default'].createElement(Bar, null));
(0, _chai.expect)(wrapper.render().find('.in-bar')).to.have.length(1);
var renderedFoo = wrapper.find(Foo).render();
(0, _chai.expect)(renderedFoo.find('.in-foo')).to.have.length(1);
(0, _chai.expect)(renderedFoo.find('.in-bar')).to.have.length(0);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL19fdGVzdHNfXy9TaGFsbG93V3JhcHBlci1zcGVjLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQWtCLE9BQU87Ozs7b0JBQ0YsTUFBTTs7Z0JBQ21CLEtBQUs7O3FCQUNuQyxPQUFPOzs7O0FBR3pCLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBTTs7QUFFeEIsVUFBUSxDQUFDLGlCQUFpQixFQUFFLFlBQU07O0FBRWhDLE1BQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0FBQ2hELFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyxVQUFNLENBQUMsR0FBRywwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHLENBQUM7QUFDbEMsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLHdCQUFPLGVBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBSyxDQUFDO0FBQzFDLHdCQUFPLGVBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBTSxDQUFDO0tBQzVDLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsdUNBQXVDLEVBQUUsWUFBTTtBQUNoRCxVQUFNLE9BQU8sR0FBRyxlQUNkOzs7UUFDRSwwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHO09BQ25CLENBQ1AsQ0FBQztBQUNGLFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyx3QkFBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBSyxDQUFDO0tBQ3hDLENBQUMsQ0FBQzs7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MENBQUssU0FBUyxFQUFDLFFBQVEsR0FBRyxDQUFFO1dBQ3JDOzs7ZUFIRyxHQUFHO1NBQVMsbUJBQU0sU0FBUzs7VUFLM0IsR0FBRztrQkFBSCxHQUFHOztpQkFBSCxHQUFHO2dDQUFILEdBQUc7O3FDQUFILEdBQUc7OztxQkFBSCxHQUFHOztpQkFDRCxrQkFBRztBQUNQLG1CQUNFOztnQkFBSyxTQUFTLEVBQUMsUUFBUTtjQUNyQixpQ0FBQyxHQUFHLE9BQUc7YUFDSCxDQUNOO1dBQ0g7OztlQVBHLEdBQUc7U0FBUyxtQkFBTSxTQUFTOztBQVNqQyxVQUFNLE9BQU8sR0FBRyxlQUFRLGlDQUFDLEdBQUcsT0FBRyxDQUFDLENBQUM7QUFDakMsd0JBQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELFVBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0Msd0JBQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELHdCQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFDLENBQUM7R0FFSixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMiLCJmaWxlIjoiL1VzZXJzL2xlbGFuZF9yaWNoYXJkc29uL2NvZGUvcmVhZ2VudC9zcmMvX190ZXN0c19fL1NoYWxsb3dXcmFwcGVyLXNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyBzaGFsbG93LCByZW5kZXIsIFNoYWxsb3dXcmFwcGVyIH0gZnJvbSAnLi4vJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuZGVzY3JpYmUoJ3NoYWxsb3cnLCAoKSA9PiB7XG5cbiAgZGVzY3JpYmUoJy5jb250YWlucyhub2RlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiB0aGUgcm9vdCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBjb25zdCBiID0gPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPjtcbiAgICAgIGNvbnN0IGMgPSA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+O1xuICAgICAgZXhwZWN0KHNoYWxsb3coYSkuY29udGFpbnMoYikpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc2hhbGxvdyhhKS5jb250YWlucyhjKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IG1hdGNoZXMgb24gYSBuZXN0ZWQgbm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgYiA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBleHBlY3Qod3JhcHBlci5jb250YWlucyhiKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggY29tcG9zaXRlIGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IGIgPSA8Rm9vIC8+O1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY29udGFpbnMoYikpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maW5kKHNlbGVjdG9yKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgZmluZCBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY2xhc3MgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykudHlwZSgpKS50by5lcXVhbCgnaW5wdXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmluZCBhbiBlbGVtZW50IGJhc2VkIG9uIGEgdGFnIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnaW5wdXQnKS5wcm9wcygpLmNsYXNzTmFtZSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoRm9vKS50eXBlKCkpLnRvLmVxdWFsKEZvbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgbXVsdGlwbGUgZWxlbWVudHMgYmFzZWQgb24gYSBjbGFzcyBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmluZCBtdWx0aXBsZSBlbGVtZW50cyBiYXNlZCBvbiBhIHRhZyBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgICA8YnV0dG9uIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJ2lucHV0JykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJ2J1dHRvbicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGEgY29tcGxleCBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxpbnB1dCAvPlxuICAgICAgICAgIDxidXR0b24gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KCgpID0+IHdyYXBwZXIuZmluZCgnLmZvbyAuZm9vJykpLnRvLnRocm93O1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmluZFdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGwgZWxlbWVudHMgZm9yIGEgdHJ1dGh5IHRlc3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZFdoZXJlKCgpID0+IHRydWUpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyBlbGVtZW50cyBmb3IgYSBmYWxzeSB0ZXN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmRXaGVyZSgoKSA9PiBmYWxzZSkubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZWQgbm9kZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYnV4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YigpO1xuICAgICAgc3R1Yi5yZXR1cm5zKHRydWUpO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KHN0dWIpO1xuICAgICAgd3JhcHBlci5maW5kV2hlcmUoc3B5KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCg0KTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRQcm9wcyhuZXdQcm9wcyknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBwcm9wcyBmb3IgYSBjb21wb25lbnQgbXVsdGlwbGUgdGltZXMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmlkfT5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaWR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIGlkPVwiZm9vXCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNldFByb3BzKHsgaWQ6ICdiYXInLCBmb286ICdibGEnIH0pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBmb3IgbmV3IHJlbmRlcnMnLCAoKSA9PiB7XG5cbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBzcHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5pZH0+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLmlkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmV4dFByb3BzID0geyBpZDogJ2JhcicsIGZvbzogJ2JsYScgfTtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gaWQ9XCJmb29cIiAvPik7XG4gICAgICBleHBlY3Qoc3B5LmNhbGxlZE9uY2UpLnRvLmJlLmZhbHNlO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRXaXRoKG5leHRQcm9wcykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zaW11bGF0ZShldmVudE5hbWUsIGRhdGEpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCBzaW11bGF0ZSBldmVudHMnLCAoKSA9PiB7XG5cbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50OiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BjbGlja3MtJHt0aGlzLnN0YXRlLmNvdW50fWB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoeyBjb3VudDogdGhpcy5zdGF0ZS5jb3VudCArIDEgfSl9XG4gICAgICAgICAgICA+Zm9vPC9hPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEZvbyAvPik7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5jbGlja3MtMCcpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmNsaWNrcy0xJykubGVuZ3RoKS50by5lcXVhbCgxKTtcblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgaW4gZXZlbnQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBvbkNsaWNrPXtzcHl9PmZvbzwvYT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gLz4pO1xuICAgICAgY29uc3QgYSA9IHt9O1xuICAgICAgY29uc3QgYiA9IHt9O1xuXG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycsIGEsIGIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5lcXVhbChhKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXSkudG8uZXF1YWwoYik7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRTdGF0ZShuZXdTdGF0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHN0YXRlIG9mIHRoZSByb290IG5vZGUnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLnN0YXRlID0geyBpZDogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnN0YXRlLmlkfS8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBpZDogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pcyhzZWxlY3RvciknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHNlbGVjdG9yIG1hdGNoZXMgY3VycmVudCBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGZvciBjb21wb3VuZCBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaXMoJy5mb28uYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHNlbGVjdG9yIGRvZXMgbm90IG1hdGNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaXMoJy5mb28nKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubm90KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnZmlsdGVycyB0byB0aGluZ3Mgbm90IG1hdGNoaW5nIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubm90KCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5ub3QoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLm5vdCgnZGl2JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXIoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgbmV3IHdyYXBwZXIgb2YganVzdCB0aGUgbm9kZXMgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXpcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXpcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXIoJy5iYXInKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpbHRlcignLmZvbycpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZmlsdGVyKCcuYmF4JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXIoJy5iYXouYmFyJykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBsb29rIGluIHRoZSBjdXJyZW50IHdyYXBwZXJzIG5vZGVzLCBub3QgdGhlaXIgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmZpbHRlcignLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmlsdGVyV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZpbHRlciBvbmx5IHRoZSBub2RlcyBvZiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLm9uQ2FsbCgwKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIHN0dWIub25DYWxsKDEpLnJldHVybnModHJ1ZSk7XG4gICAgICBzdHViLm9uQ2FsbCgyKS5yZXR1cm5zKGZhbHNlKTtcblxuICAgICAgY29uc3QgYmF6ID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3R1Yik7XG4gICAgICBleHBlY3QoYmF6Lmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICBleHBlY3QoYmF6Lmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZWQgbm9kZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYnV4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YigpO1xuICAgICAgc3R1Yi5yZXR1cm5zKHRydWUpO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KHN0dWIpO1xuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3B5KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy50ZXh0KCknLCAoKSA9PiB7XG5cbiAgICBjb25zdCBtYXRjaGVzUmVuZGVyID0gZnVuY3Rpb24gbWF0Y2hlc1JlbmRlcihub2RlKSB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBzaGFsbG93KG5vZGUpLnRleHQoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gcmVuZGVyKG5vZGUpLnRleHQoKTtcbiAgICAgIGV4cGVjdChleHBlY3RlZCkudG8uZXF1YWwoYWN0dWFsKTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHRleHQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5zb21lIHRleHQ8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci50ZXh0KCkpLnRvLmVxdWFsKCdzb21lIHRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG5vZGVzIHdpdGggbWFwcGVkIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXRjaGVzUmVuZGVyKDxGb28gaXRlbXM9e1snYWJjJywgJ2RlZicsICdoaWonXX0gLz4pO1xuICAgICAgbWF0Y2hlc1JlbmRlcihcbiAgICAgICAgPEZvbyBpdGVtcz17W1xuICAgICAgICAgIDxpIGtleT17MX0+YWJjPC9pPixcbiAgICAgICAgICA8aSBrZXk9ezJ9PmRlZjwvaT4sXG4gICAgICAgICAgPGkga2V5PXszfT5oaWo8L2k+LFxuICAgICAgICBdfSAvPlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvbXBvc2l0ZSBjb21wb25lbnRzIGR1bWJseScsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHsgcmV0dXJuIDxkaXYvPjsgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyAvPlxuICAgICAgICAgIDxkaXY+dGVzdDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci50ZXh0KCkpLnRvLmVxdWFsKCc8Rm9vIC8+dGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgaHRtbCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIG1hdGNoZXNSZW5kZXIoPGRpdj4mZ3Q7PC9kaXY+KTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnByb3BzKCknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgcHJvcHMgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZm4gPSAoKT0+e307XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBpZD1cImZvb0lkXCIgY2xhc3NOYW1lPVwiYmF4XCIgb25DbGljaz17Zm59ID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkuY2xhc3NOYW1lKS50by5lcXVhbCgnYmF4Jyk7XG4gICAgICBleHBlY3Qod3JhcHBlci5wcm9wcygpLm9uQ2xpY2spLnRvLmVxdWFsKGZuKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgdXNlZCBvbiBhbiBpbm5lciBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm4gPSAoKT0+e307XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIG9uQ2xpY2s9e2ZufSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgaWQ9XCJmb29JZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJheicpLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnN0YXRlKG5hbWUpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHN0YXRlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCkpLnRvLmVxbCh7IGZvbzogJ2ZvbycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBhZnRlciBzdGF0ZSB0cmFuc2l0aW9ucycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuc3RhdGUoKSkudG8uZXFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgYSBzdGF0ZSBwcm9wZXJ0eSBuYW1lIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCdmb28nKSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNoaWxkcmVuKFtzZWxlY3Rvcl0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHdyYXBwZXIgZm9yIG5vZGUgd2l0aCBubyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxkaXYgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNoaWxkcmVuIG5vZGVzIG9mIHRoZSByb290JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDIpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbnkgb2YgdGhlIGNoaWxkcmVuIG9mIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXhlZCBjaGlsZHJlbiB3aXRoIGFuZCB3aXRob3V0IGFycmF5cycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9vXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPEZvbyBpdGVtcz17W1xuICAgICAgICAgIDxpIGtleT17MX0gY2xhc3NOYW1lPVwiYmFyXCI+YWJjPC9pPixcbiAgICAgICAgICA8aSBrZXk9ezJ9IGNsYXNzTmFtZT1cImJhelwiPmRlZjwvaT4sXG4gICAgICAgIF19IC8+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvcHRpb25hbGx5IGFsbG93IGEgc2VsZWN0b3IgdG8gZmlsdGVyIGJ5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJpcFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXogYmlwXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB3cmFwcGVyLmNoaWxkcmVuKCcuYmlwJyk7XG4gICAgICBleHBlY3QoY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5hdCgwKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoY2hpbGRyZW4uYXQoMSkuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnBhcmVudHMoW3NlbGVjdG9yXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgY3VycmVudCBub2RlcyBhbmNlc3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBub24tbGVhZiBub2RlcyBhcyB3ZWxsJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmVudHMgPSB3cmFwcGVyLmZpbmQoJy5iYXInKS5wYXJlbnRzKCk7XG5cbiAgICAgIGV4cGVjdChwYXJlbnRzLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3QocGFyZW50cy5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QocGFyZW50cy5hdCgxKS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9wdGlvbmFsbHkgYWxsb3cgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheCBmb29cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoJy5mb28nKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5wYXJlbnQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBvbmx5IHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIHRoZSBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIG5vZGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudCgpO1xuICAgICAgZXhwZWN0KHBhcmVudHMpLnRvLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMikuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNsb3Nlc3Qoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGZvciBhIGdpdmVuIHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBjbG9zZXN0Rm9vID0gd3JhcHBlci5maW5kKCcuYmFyJykuY2xvc2VzdCgnLmZvbycpO1xuICAgICAgZXhwZWN0KGNsb3Nlc3RGb28uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KGNsb3Nlc3RGb28ubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBldmVyIHJldHVybiBhIHdyYXBwZXIgb2YgYSBzaW5nbGUgbm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50KCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaXRzZWxmIGlmIG1hdGNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV4IGJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYnV4JykuY2xvc2VzdCgnLmJheicpLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5oYXNDbGFzcyhjbGFzc05hbWUpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHdoZXRoZXIgb3Igbm90IG5vZGUgaGFzIGEgY2VydGFpbiBjbGFzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6IHNvbWUtbG9uZy1zdHJpbmcgRm9Pb1wiIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnc29tZS1sb25nLXN0cmluZycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaGFzQ2xhc3MoJ0ZvT28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdkb2VzbnQtZXhpc3QnKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZm9yRWFjaChmbiknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZm9yRWFjaChzcHkpO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5tYXAoc3B5KTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgbWFwcGVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5tYXAodyA9PiB3LnByb3BzKCkuY2xhc3NOYW1lKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKFtcbiAgICAgICAgJ2ZvbyBiYXgnLFxuICAgICAgICAnZm9vIGJhcicsXG4gICAgICAgICdmb28gYmF6JyxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnJlZHVjZShmblssIGluaXRpYWxWYWx1ZV0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBhIGZ1bmN0aW9uIHdpdGggYSB3cmFwcGVyIGZvciBlYWNoIG5vZGUgaW4gdGhlIHdyYXBwZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2Uoc3B5LCAwKTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMV0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2N1bXVsYXRlIGEgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmF4XCIgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhclwiIGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXpcIiBjbGFzc05hbWU9XCJmb28gaG9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gd3JhcHBlci5maW5kKCcuZm9vJykucmVkdWNlKFxuICAgICAgICAob2JqLCBuKSA9PiB7XG4gICAgICAgICAgb2JqW24ucHJvcCgnaWQnKV0gPSBuLnByb3AoJ2NsYXNzTmFtZScpO1xuICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50by5lcWwoe1xuICAgICAgICBiYXg6ICdmb28gcW9vJyxcbiAgICAgICAgYmFyOiAnZm9vIGJvbycsXG4gICAgICAgIGJhejogJ2ZvbyBob28nLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucmVkdWNlUmlnaHQoZm5bLCBpbml0aWFsVmFsdWVdKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyIGluIHJldmVyc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChzcHksIDApO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMV0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVsxXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY3VtdWxhdGUgYSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXhcIiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFyXCIgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhelwiIGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNvbWUoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGEgbm9kZSBtYXRjaGVzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBxb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gaG9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWUoJy5xb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zb21lV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBpZiBhIG5vZGUgbWF0Y2hlcyBhIHByZWRpY2F0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZVdoZXJlKG4gPT4gbi5oYXNDbGFzcygncW9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWVXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2ZvbycpKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lV2hlcmUobiA9PiBuLmhhc0NsYXNzKCdiYXInKSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmV2ZXJ5KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBpZiBldmVyeSBub2RlIG1hdGNoZXMgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnkoJy5mb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLnFvbycpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ldmVyeVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgZXZlcnkgbm9kZSBtYXRjaGVzIGEgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnZm9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmV2ZXJ5V2hlcmUobiA9PiBuLmhhc0NsYXNzKCdxb28nKSkpLnRvLmJlLmZhbHNlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmV2ZXJ5V2hlcmUobiA9PiBuLmhhc0NsYXNzKCdiYXInKSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmZsYXRNYXAoZm4pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgd3JhcHBlciB3aXRoIHRoZSBtYXBwZWQgYW5kIGZsYXR0ZW5lZCBub2RlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5vZGVzID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmxhdE1hcCh3ID0+IHcuY2hpbGRyZW4oKS5ub2Rlcyk7XG5cbiAgICAgIGV4cGVjdChub2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDYpO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDMpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCg0KS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoNSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNoYWxsb3coKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc2hhbGxvdyByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBub2RlJywgKCkgPT4ge1xuICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImluLWJhclwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxCYXIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmluLWJhcicpKS50by5oYXZlLmxlbmd0aCgwKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoQmFyKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKEJhcikuc2hhbGxvdygpLmZpbmQoJy5pbi1iYXInKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maXJzdCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBmaXJzdCBub2RlIGluIHRoZSBjdXJyZW50IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5maXJzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5sYXN0KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGxhc3Qgbm9kZSBpbiB0aGUgY3VycmVudCBzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGFzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pc0VtcHR5KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZmYgd3JhcHBlciBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmF0KGluZGV4KScsICgpID0+IHtcbiAgICBpdCgnZ2V0cyBhIHdyYXBwZXIgb2YgdGhlIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBidXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDIpLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgzKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZ2V0KGluZGV4KScsICgpID0+IHtcbiAgICBpdCgnZ2V0cyB0aGUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgwKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuZm9vJykubm9kZSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZ2V0KDEpKS50by5lcXVhbCh3cmFwcGVyLmZpbmQoJy5iYXgnKS5ub2RlKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5nZXQoMikpLnRvLmVxdWFsKHdyYXBwZXIuZmluZCgnLmJ1eCcpLm5vZGUpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgzKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuYmF6Jykubm9kZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZGVidWcoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCB0byB0aGUgZGVidWdOb2RlcyBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaGFsbG93KDxkaXYgLz4pLmRlYnVnKCkpLnRvLmVxdWFsKCc8ZGl2IC8+Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuaHRtbCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGh0bWwgb2Ygc3RyYWlnaHQgRE9NIGVsZW1lbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGVzdFwiPlxuICAgICAgICAgIDxzcGFuPkhlbGxvIFdvcmxkITwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaHRtbCgpKS50by5lcXVhbChcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJ0ZXN0XCI+PHNwYW4+SGVsbG8gV29ybGQhPC9zcGFuPjwvZGl2PmBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBvdXQgbmVzdGVkIGNvbXBvc2l0ZSBjb21wb25lbnRzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJpbi1mb29cIiAvPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIEJhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbi1iYXJcIj5cbiAgICAgICAgICAgICAgPEZvbyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEJhciAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5odG1sKCkpLnRvLmVxdWFsKFxuICAgICAgICBgPGRpdiBjbGFzcz1cImluLWJhclwiPjxkaXYgY2xhc3M9XCJpbi1mb29cIj48L2Rpdj48L2Rpdj5gXG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChGb28pLmh0bWwoKSkudG8uZXF1YWwoXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwiaW4tZm9vXCI+PC9kaXY+YFxuICAgICAgKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnJlbmRlcigpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjaGVlcmlvIHdyYXBwZXIgYXJvdW5kIHRoZSBjdXJyZW50IG5vZGUnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImluLWZvb1wiIC8+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImluLWJhclwiPlxuICAgICAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8QmFyIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnJlbmRlcigpLmZpbmQoJy5pbi1iYXInKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCByZW5kZXJlZEZvbyA9IHdyYXBwZXIuZmluZChGb28pLnJlbmRlcigpO1xuICAgICAgZXhwZWN0KHJlbmRlcmVkRm9vLmZpbmQoJy5pbi1mb28nKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVuZGVyZWRGb28uZmluZCgnLmluLWJhcicpKS50by5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0= |