| 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 |
15×
17×
2×
17×
14×
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×
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×
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×
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×
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×
| '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 _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
var _ = require('../');
(0, _.describeWithDOM)('mount', 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, _.mount)(a).contains(b)).to.be['true'];
(0, _chai.expect)((0, _.mount)(a).contains(c)).to.be['false'];
});
it('should allow matches on a nested node', function () {
var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[3][0]).to.be.instanceOf(_.ReactWrapper);
(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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_react2['default'].createElement(Foo, null));
wrapper.simulate('click', { someSpecialData: 'foo' });
(0, _chai.expect)(spy.calledOnce).to.be['true'];
(0, _chai.expect)(spy.args[0][0].someSpecialData).to.equal('foo');
});
});
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, _.mount)(_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);
});
it('allows setState inside of componentDidMount', function () {
// NOTE: this test is a test to ensure that the following issue is
// fixed: https://github.com/airbnb/enzyme/issues/27
var MySharona = (function (_React$Component8) {
_inherits(MySharona, _React$Component8);
function MySharona(props) {
_classCallCheck(this, MySharona);
_get(Object.getPrototypeOf(MySharona.prototype), 'constructor', this).call(this, props);
this.state = { mounted: false };
}
_createClass(MySharona, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.setState({ mounted: true });
}
}, {
key: 'render',
value: function render() {
return _react2['default'].createElement(
'div',
null,
this.state.mounted ? 'a' : 'b'
);
}
}]);
return MySharona;
})(_react2['default'].Component);
var wrapper = (0, _.mount)(_react2['default'].createElement(MySharona, null));
(0, _chai.expect)(wrapper.find('div').text()).to.equal('a');
});
});
describe('.is(selector)', function () {
it('should return true when selector matches current element', function () {
var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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 wrapper as the first argument', function () {
var wrapper = (0, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper);
(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, _.mount)(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, _.mount)(_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$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,
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 smartly', function () {
var Foo = (function (_React$Component10) {
_inherits(Foo, _React$Component10);
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,
'foo'
);
}
}]);
return Foo;
})(_react2['default'].Component);
var wrapper = (0, _.mount)(_react2['default'].createElement(
'div',
null,
_react2['default'].createElement(Foo, null),
_react2['default'].createElement(
'div',
null,
'test'
)
));
(0, _chai.expect)(wrapper.text()).to.equal('footest');
});
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, _.mount)(_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, _.mount)(_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$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, _.mount)(_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$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, _.mount)(_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$Component13) {
_inherits(Foo, _React$Component13);
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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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$Component14) {
_inherits(Foo, _React$Component14);
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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper);
(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, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper);
(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, _.mount)(_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, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[0][1].hasClass('bax')).to.be['true'];
(0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[2][1].hasClass('baz')).to.be['true'];
});
it('should accumulate a value', function () {
var wrapper = (0, _.mount)(_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, _.mount)(_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(_.ReactWrapper);
(0, _chai.expect)(spy.args[0][1].hasClass('baz')).to.be['true'];
(0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true'];
(0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ReactWrapper);
(0, _chai.expect)(spy.args[2][1].hasClass('bax')).to.be['true'];
});
it('should accumulate a value', function () {
var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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('.first()', function () {
it('should return the first node in the current set', function () {
var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL19fdGVzdHNfXy9SZWFjdFdyYXBwZXItc3BlYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FCQUFrQixPQUFPOzs7O29CQUNGLE1BQU07O3FCQUNYLE9BQU87Ozs7Z0JBTWxCLEtBQUs7O0FBRVosdUJBQWdCLE9BQU8sRUFBRSxZQUFNOztBQUU3QixVQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBTTs7QUFFaEMsTUFBRSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07QUFDaEQsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyxVQUFNLENBQUMsR0FBRywwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHLENBQUM7QUFDbEMsd0JBQU8sYUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDeEMsd0JBQU8sYUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFNLENBQUM7S0FDMUMsQ0FBQyxDQUFDOztBQUVILE1BQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0FBQ2hELFVBQU0sT0FBTyxHQUFHLGFBQ2Q7OztRQUNFLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7T0FDbkIsQ0FDUCxDQUFDO0FBQ0YsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLHdCQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7S0FDeEMsQ0FBQyxDQUFDOztBQUVILE1B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OztRQUNFOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtRQUNOOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtRQUNOOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtPQUNGLENBQ1AsQ0FBQzs7QUFFRixVQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7ZUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSztPQUFBLENBQUMsQ0FBQzs7QUFFcEUsd0JBQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hFLHdCQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3pFLENBQUMsQ0FBQztHQUNKLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyIsImZpbGUiOiIvVXNlcnMvbGVsYW5kX3JpY2hhcmRzb24vY29kZS9yZWFnZW50L3NyYy9fX3Rlc3RzX18vUmVhY3RXcmFwcGVyLXNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHtcbiAgbW91bnQsXG4gIHJlbmRlcixcbiAgUmVhY3RXcmFwcGVyLFxuICBkZXNjcmliZVdpdGhET00sXG59IGZyb20gJy4uLyc7XG5cbmRlc2NyaWJlV2l0aERPTSgnbW91bnQnLCAoKSA9PiB7XG5cbiAgZGVzY3JpYmUoJy5jb250YWlucyhub2RlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiB0aGUgcm9vdCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBjb25zdCBiID0gPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPjtcbiAgICAgIGNvbnN0IGMgPSA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+O1xuICAgICAgZXhwZWN0KG1vdW50KGEpLmNvbnRhaW5zKGIpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG1vdW50KGEpLmNvbnRhaW5zKGMpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiBhIG5lc3RlZCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgYiA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBleHBlY3Qod3JhcHBlci5jb250YWlucyhiKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggY29tcG9zaXRlIGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBiID0gPEZvbyAvPjtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNvbnRhaW5zKGIpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmluZChzZWxlY3RvciknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgYW4gZWxlbWVudCBiYXNlZCBvbiBhIGNsYXNzIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS50eXBlKCkpLnRvLmVxdWFsKCdpbnB1dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGFuIGVsZW1lbnQgYmFzZWQgb24gYSB0YWcgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnaW5wdXQnKS5wcm9wcygpLmNsYXNzTmFtZSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKEZvbykudHlwZSgpKS50by5lcXVhbChGb28pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY2xhc3MgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgdGFnIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBhIGNvbXBsZXggc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3QoKCkgPT4gd3JhcHBlci5maW5kKCcuZm9vIC5mb28nKSkudG8udGhyb3c7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maW5kV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBlbGVtZW50cyBmb3IgYSB0cnV0aHkgdGVzdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZFdoZXJlKCgpID0+IHRydWUpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyBlbGVtZW50cyBmb3IgYSBmYWxzeSB0ZXN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxpbnB1dCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kV2hlcmUoKCkgPT4gZmFsc2UpLmxlbmd0aCkudG8uZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgdGhlIHByZWRpY2F0ZSB3aXRoIHRoZSB3cmFwcGVkIG5vZGUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLnJldHVybnModHJ1ZSk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoc3R1Yik7XG4gICAgICB3cmFwcGVyLmZpbmRXaGVyZShzcHkpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDQpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzNdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRQcm9wcyhuZXdQcm9wcyknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBwcm9wcyBmb3IgYSBjb21wb25lbnQgbXVsdGlwbGUgdGltZXMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmlkfT5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaWR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyBpZD1cImZvb1wiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyh7IGlkOiAnYmFyJywgZm9vOiAnYmxhJ30pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBmb3IgbmV3IHJlbmRlcnMnLCAoKSA9PiB7XG5cbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBzcHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5pZH0+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLmlkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmV4dFByb3BzID0geyBpZDogJ2JhcicsIGZvbzogJ2JsYSd9O1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxGb28gaWQ9XCJmb29cIiAvPik7XG4gICAgICBleHBlY3Qoc3B5LmNhbGxlZE9uY2UpLnRvLmJlLmZhbHNlO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRXaXRoKG5leHRQcm9wcykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zaW11bGF0ZShldmVudE5hbWUsIGRhdGEpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCBzaW11bGF0ZSBldmVudHMnLCAoKSA9PiB7XG5cbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50OiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BjbGlja3MtJHt0aGlzLnN0YXRlLmNvdW50fWB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoeyBjb3VudDogdGhpcy5zdGF0ZS5jb3VudCArIDEgfSl9XG4gICAgICAgICAgICAgID5mb288L2E+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5jbGlja3MtMCcpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmNsaWNrcy0xJykubGVuZ3RoKS50by5lcXVhbCgxKTtcblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgaW4gZXZlbnQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBvbkNsaWNrPXtzcHl9PmZvbzwvYT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8Rm9vIC8+KTtcblxuICAgICAgd3JhcHBlci5zaW11bGF0ZSgnY2xpY2snLCB7IHNvbWVTcGVjaWFsRGF0YTogJ2Zvbyd9KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5zb21lU3BlY2lhbERhdGEpLnRvLmVxdWFsKCdmb28nKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnNldFN0YXRlKG5ld1N0YXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCB0aGUgc3RhdGUgb2YgdGhlIHJvb3Qgbm9kZScsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGlkOiAnZm9vJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuc3RhdGUuaWR9Lz5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBpZDogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbGxvd3Mgc2V0U3RhdGUgaW5zaWRlIG9mIGNvbXBvbmVudERpZE1vdW50JywgKCkgPT4ge1xuICAgICAgLy8gTk9URTogdGhpcyB0ZXN0IGlzIGEgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGlzc3VlIGlzXG4gICAgICAvLyBmaXhlZDogaHR0cHM6Ly9naXRodWIuY29tL2FpcmJuYi9yZWFnZW50L2lzc3Vlcy8yN1xuICAgICAgY2xhc3MgTXlTaGFyb25hIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHttb3VudGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bW91bnRlZDogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gPGRpdj57dGhpcy5zdGF0ZS5tb3VudGVkID8gJ2EnIDogJ2InfTwvZGl2PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxNeVNoYXJvbmEgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnZGl2JykudGV4dCgpKS50by5lcXVhbCgnYScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmlzKHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gc2VsZWN0b3IgbWF0Y2hlcyBjdXJyZW50IGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGZvciBjb21wb3VuZCBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vLmJhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5pcygnLmZvbycpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ub3Qoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdmaWx0ZXJzIHRvIHRoaW5ncyBub3QgbWF0Y2hpbmcgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubm90KCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5ub3QoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLm5vdCgnZGl2JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXIoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgbmV3IHdyYXBwZXIgb2YganVzdCB0aGUgbm9kZXMgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5maWx0ZXIoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpbHRlcignLmJheCcpLmxlbmd0aCkudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmF6LmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgbG9vayBpbiB0aGUgY3VycmVudCB3cmFwcGVycyBub2Rlcywgbm90IHRoZWlyIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXJXaGVyZShwcmVkaWNhdGUpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmlsdGVyIG9ubHkgdGhlIG5vZGVzIG9mIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLm9uQ2FsbCgwKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIHN0dWIub25DYWxsKDEpLnJldHVybnModHJ1ZSk7XG4gICAgICBzdHViLm9uQ2FsbCgyKS5yZXR1cm5zKGZhbHNlKTtcblxuICAgICAgY29uc3QgYmF6ID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3R1Yik7XG4gICAgICBleHBlY3QoYmF6Lmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICBleHBlY3QoYmF6Lmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLnJldHVybnModHJ1ZSk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoc3R1Yik7XG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXJXaGVyZShzcHkpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0uaGFzQ2xhc3MoJ2J1eCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnRleHQoKScsICgpID0+IHtcblxuICAgIGNvbnN0IG1hdGNoZXNSZW5kZXIgPSBmdW5jdGlvbiBtYXRjaGVzUmVuZGVyKG5vZGUpIHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IG1vdW50KG5vZGUpLnRleHQoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gcmVuZGVyKG5vZGUpLnRleHQoKTtcbiAgICAgIGV4cGVjdChleHBlY3RlZCkudG8uZXF1YWwoYWN0dWFsKTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHRleHQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+c29tZSB0ZXh0PC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIudGV4dCgpKS50by5lcXVhbCgnc29tZSB0ZXh0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBub2RlcyB3aXRoIG1hcHBlZCBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaXRlbXMubWFwKHg9PngpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF0Y2hlc1JlbmRlcig8Rm9vIGl0ZW1zPXtbJ2FiYycsICdkZWYnLCAnaGlqJ119IC8+KTtcbiAgICAgIG1hdGNoZXNSZW5kZXIoXG4gICAgICAgIDxGb28gaXRlbXM9e1tcbiAgICAgICAgICA8aSBrZXk9ezF9PmFiYzwvaT4sXG4gICAgICAgICAgPGkga2V5PXsyfT5kZWY8L2k+LFxuICAgICAgICAgIDxpIGtleT17M30+aGlqPC9pPixcbiAgICAgICAgXX0gLz5cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb21wb3NpdGUgY29tcG9uZW50cyBzbWFydGx5JywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkgeyByZXR1cm4gPGRpdj5mb288L2Rpdj47IH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgICAgPGRpdj50ZXN0PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnRleHQoKSkudG8uZXF1YWwoJ2Zvb3Rlc3QnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGh0bWwgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBtYXRjaGVzUmVuZGVyKDxkaXY+Jmd0OzwvZGl2Pik7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5wcm9wcygpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHByb3BzIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZuID0gKCk9Pnt9O1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGlkPVwiZm9vSWRcIiBjbGFzc05hbWU9XCJiYXhcIiBvbkNsaWNrPXtmbn0gPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIucHJvcHMoKS5jbGFzc05hbWUpLnRvLmVxdWFsKCdiYXgnKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIucHJvcHMoKS5pZCkudG8uZXF1YWwoJ2Zvb0lkJyk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYWxsb3dlZCB0byBiZSB1c2VkIG9uIGFuIGlubmVyIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmbiA9ICgpPT57fTtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIG9uQ2xpY2s9e2ZufSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgaWQ9XCJmb29JZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJheicpLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnN0YXRlKG5hbWUpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHN0YXRlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5zdGF0ZSgpKS50by5lcWwoeyBmb286ICdmb28nIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgYWZ0ZXIgc3RhdGUgdHJhbnNpdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLnN0YXRlID0geyBmb286ICdmb28nIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkgeyByZXR1cm4gPGRpdiAvPjsgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxGb28gLz4pO1xuICAgICAgd3JhcHBlci5zZXRTdGF0ZSh7IGZvbzogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5zdGF0ZSgpKS50by5lcWwoeyBmb286ICdiYXInIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0YXRlIHByb3BlcnR5IG5hbWUgYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHsgZm9vOiAnZm9vJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHsgcmV0dXJuIDxkaXYgLz47IH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCdmb28nKSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNoaWxkcmVuKFtzZWxlY3Rvcl0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHdyYXBwZXIgZm9yIG5vZGUgd2l0aCBubyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8ZGl2IC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjaGlsZHJlbiBub2RlcyBvZiB0aGUgcm9vdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXhlZCBjaGlsZHJlbiB3aXRoIGFuZCB3aXRob3V0IGFycmF5cycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9vXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxGb28gaXRlbXM9e1tcbiAgICAgICAgICA8aSBrZXk9ezF9IGNsYXNzTmFtZT1cImJhclwiPmFiYzwvaT4sXG4gICAgICAgICAgPGkga2V5PXsyfSBjbGFzc05hbWU9XCJiYXpcIj5kZWY8L2k+LFxuICAgICAgICBdfSAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDIpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb3B0aW9uYWxseSBhbGxvdyBhIHNlbGVjdG9yIHRvIGZpbHRlciBieScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmlwXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheiBiaXBcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHdyYXBwZXIuY2hpbGRyZW4oJy5iaXAnKTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KGNoaWxkcmVuLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucGFyZW50cyhbc2VsZWN0b3JdKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBjdXJyZW50IG5vZGVzIGFuY2VzdG9ycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBub24tbGVhZiBub2RlcyBhcyB3ZWxsJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJlbnRzID0gd3JhcHBlci5maW5kKCcuYmFyJykucGFyZW50cygpO1xuXG4gICAgICBleHBlY3QocGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvcHRpb25hbGx5IGFsbG93IGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4IGZvb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJlbnRzID0gd3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50cygnLmZvbycpO1xuXG4gICAgICBleHBlY3QocGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnBhcmVudCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIG9ubHkgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIG5vZGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmVudHMgPSB3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzKS50by5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5jbG9zZXN0KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY2xvc2VzdCBhbmNlc3RvciBmb3IgYSBnaXZlbiBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGNsb3Nlc3RGb28gPSB3cmFwcGVyLmZpbmQoJy5iYXInKS5jbG9zZXN0KCcuZm9vJyk7XG4gICAgICBleHBlY3QoY2xvc2VzdEZvby5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoY2xvc2VzdEZvby5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IGV2ZXIgcmV0dXJuIGEgd3JhcHBlciBvZiBhIHNpbmdsZSBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50KCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaXRzZWxmIGlmIG1hdGNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ1eCBiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJ1eCcpLmNsb3Nlc3QoJy5iYXonKS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuaGFzQ2xhc3MoY2xhc3NOYW1lKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB3aGV0aGVyIG9yIG5vdCBub2RlIGhhcyBhIGNlcnRhaW4gY2xhc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXogc29tZS1sb25nLXN0cmluZyBGb09vXCIgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdzb21lLWxvbmctc3RyaW5nJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnRm9PbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaGFzQ2xhc3MoJ2RvZXNudC1leGlzdCcpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5mb3JFYWNoKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZm9yRWFjaChzcHkpO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykubWFwKHNweSk7XG5cbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIG1hcHBlZCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBwZXIuZmluZCgnLmZvbycpLm1hcCh3ID0+IHcucHJvcHMoKS5jbGFzc05hbWUpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50by5lcWwoW1xuICAgICAgICAnZm9vIGJheCcsXG4gICAgICAgICdmb28gYmFyJyxcbiAgICAgICAgJ2ZvbyBiYXonLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucmVkdWNlKGZuWywgaW5pdGlhbFZhbHVlXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gd2l0aCBhIHdyYXBwZXIgZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2Uoc3B5LCAwKTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMV0uaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMV0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2N1bXVsYXRlIGEgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImJheFwiIGNsYXNzTmFtZT1cImZvbyBxb29cIiAvPlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXJcIiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmF6XCIgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBwZXIuZmluZCgnLmZvbycpLnJlZHVjZShcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnJlZHVjZVJpZ2h0KGZuWywgaW5pdGlhbFZhbHVlXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gd2l0aCBhIHdyYXBwZXIgZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlciBpbiByZXZlcnNlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkobiA9PiBuICsgMSk7XG5cbiAgICAgIHdyYXBwZXIuZmluZCgnLmZvbycpLnJlZHVjZVJpZ2h0KHNweSwgMCk7XG5cbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjdW11bGF0ZSBhIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXhcIiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFyXCIgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhelwiIGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNvbWUoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGEgbm9kZSBtYXRjaGVzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lKCcucW9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZSgnLmZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWUoJy5iYXInKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuc29tZVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgYSBub2RlIG1hdGNoZXMgYSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lV2hlcmUobiA9PiBuLmhhc0NsYXNzKCdxb28nKSkpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnZm9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWVXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2JhcicpKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZXZlcnkoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGV2ZXJ5IG5vZGUgbWF0Y2hlcyBhIHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnkoJy5mb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLnFvbycpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ldmVyeVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgZXZlcnkgbm9kZSBtYXRjaGVzIGEgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnlXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2ZvbycpKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygncW9vJykpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnYmFyJykpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5mbGF0TWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHdyYXBwZXIgd2l0aCB0aGUgbWFwcGVkIGFuZCBmbGF0dGVuZWQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3Qgbm9kZXMgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5mbGF0TWFwKHcgPT4gdy5jaGlsZHJlbigpLm5vZGVzKTtcblxuICAgICAgZXhwZWN0KG5vZGVzLmxlbmd0aCkudG8uZXF1YWwoNik7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCgyKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMykuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDQpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCg1KS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmlyc3QoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgY3VycmVudCBzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpcnN0KCkuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmxhc3QoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgbGFzdCBub2RlIGluIHRoZSBjdXJyZW50IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGFzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pc0VtcHR5KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZmYgd3JhcHBlciBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hdChpbmRleCknLCAoKSA9PiB7XG4gICAgaXQoJ2dldHMgYSB3cmFwcGVyIG9mIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgxKS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuYXQoMikuaGFzQ2xhc3MoJ2J1eCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDMpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5nZXQoaW5kZXgpJywgKCkgPT4ge1xuICAgIGl0KCdnZXRzIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgwKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuZm9vJykubm9kZSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZ2V0KDEpKS50by5lcXVhbCh3cmFwcGVyLmZpbmQoJy5iYXgnKS5ub2RlKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5nZXQoMikpLnRvLmVxdWFsKHdyYXBwZXIuZmluZCgnLmJ1eCcpLm5vZGUpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgzKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuYmF6Jykubm9kZSk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdfQ== |