-
-
Notifications
You must be signed in to change notification settings - Fork 86
/
ada_idna.cpp
9718 lines (9586 loc) · 645 KB
/
ada_idna.cpp
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
/* auto-generated on 2023-04-26 14:14:42 -0400. Do not edit! */
/* begin file src/idna.cpp */
/* begin file src/unicode_transcoding.cpp */
#include <cstdint>
#include <cstring>
namespace ada::idna {
size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
const uint8_t* data = reinterpret_cast<const uint8_t*>(buf);
size_t pos = 0;
char32_t* start{utf32_output};
while (pos < len) {
// try to convert the next block of 16 ASCII bytes
if (pos + 16 <= len) { // if it is safe to read 16 more
// bytes, check that they are ascii
uint64_t v1;
std::memcpy(&v1, data + pos, sizeof(uint64_t));
uint64_t v2;
std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
uint64_t v{v1 | v2};
if ((v & 0x8080808080808080) == 0) {
size_t final_pos = pos + 16;
while (pos < final_pos) {
*utf32_output++ = char32_t(buf[pos]);
pos++;
}
continue;
}
}
uint8_t leading_byte = data[pos]; // leading byte
if (leading_byte < 0b10000000) {
// converting one ASCII byte !!!
*utf32_output++ = char32_t(leading_byte);
pos++;
} else if ((leading_byte & 0b11100000) == 0b11000000) {
// We have a two-byte UTF-8
if (pos + 1 >= len) {
return 0;
} // minimal bound checking
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
return 0;
}
// range check
uint32_t code_point =
(leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
if (code_point < 0x80 || 0x7ff < code_point) {
return 0;
}
*utf32_output++ = char32_t(code_point);
pos += 2;
} else if ((leading_byte & 0b11110000) == 0b11100000) {
// We have a three-byte UTF-8
if (pos + 2 >= len) {
return 0;
} // minimal bound checking
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
return 0;
}
if ((data[pos + 2] & 0b11000000) != 0b10000000) {
return 0;
}
// range check
uint32_t code_point = (leading_byte & 0b00001111) << 12 |
(data[pos + 1] & 0b00111111) << 6 |
(data[pos + 2] & 0b00111111);
if (code_point < 0x800 || 0xffff < code_point ||
(0xd7ff < code_point && code_point < 0xe000)) {
return 0;
}
*utf32_output++ = char32_t(code_point);
pos += 3;
} else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000
// we have a 4-byte UTF-8 word.
if (pos + 3 >= len) {
return 0;
} // minimal bound checking
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
return 0;
}
if ((data[pos + 2] & 0b11000000) != 0b10000000) {
return 0;
}
if ((data[pos + 3] & 0b11000000) != 0b10000000) {
return 0;
}
// range check
uint32_t code_point = (leading_byte & 0b00000111) << 18 |
(data[pos + 1] & 0b00111111) << 12 |
(data[pos + 2] & 0b00111111) << 6 |
(data[pos + 3] & 0b00111111);
if (code_point <= 0xffff || 0x10ffff < code_point) {
return 0;
}
*utf32_output++ = char32_t(code_point);
pos += 4;
} else {
return 0;
}
}
return utf32_output - start;
}
size_t utf8_length_from_utf32(const char32_t* buf, size_t len) {
// We are not BOM aware.
const uint32_t* p = reinterpret_cast<const uint32_t*>(buf);
size_t counter{0};
for (size_t i = 0; i < len; i++) {
/** ASCII **/
if (p[i] <= 0x7F) {
counter++;
}
/** two-byte **/
else if (p[i] <= 0x7FF) {
counter += 2;
}
/** three-byte **/
else if (p[i] <= 0xFFFF) {
counter += 3;
}
/** four-bytes **/
else {
counter += 4;
}
}
return counter;
}
size_t utf32_length_from_utf8(const char* buf, size_t len) {
const int8_t* p = reinterpret_cast<const int8_t*>(buf);
size_t counter{0};
for (size_t i = 0; i < len; i++) {
// -65 is 0b10111111, anything larger in two-complement's
// should start a new code point.
if (p[i] > -65) {
counter++;
}
}
return counter;
}
size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) {
const uint32_t* data = reinterpret_cast<const uint32_t*>(buf);
size_t pos = 0;
char* start{utf8_output};
while (pos < len) {
// try to convert the next block of 2 ASCII characters
if (pos + 2 <= len) { // if it is safe to read 8 more
// bytes, check that they are ascii
uint64_t v;
std::memcpy(&v, data + pos, sizeof(uint64_t));
if ((v & 0xFFFFFF80FFFFFF80) == 0) {
*utf8_output++ = char(buf[pos]);
*utf8_output++ = char(buf[pos + 1]);
pos += 2;
continue;
}
}
uint32_t word = data[pos];
if ((word & 0xFFFFFF80) == 0) {
// will generate one UTF-8 bytes
*utf8_output++ = char(word);
pos++;
} else if ((word & 0xFFFFF800) == 0) {
// will generate two UTF-8 bytes
// we have 0b110XXXXX 0b10XXXXXX
*utf8_output++ = char((word >> 6) | 0b11000000);
*utf8_output++ = char((word & 0b111111) | 0b10000000);
pos++;
} else if ((word & 0xFFFF0000) == 0) {
// will generate three UTF-8 bytes
// we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX
if (word >= 0xD800 && word <= 0xDFFF) {
return 0;
}
*utf8_output++ = char((word >> 12) | 0b11100000);
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
*utf8_output++ = char((word & 0b111111) | 0b10000000);
pos++;
} else {
// will generate four UTF-8 bytes
// we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX
// 0b10XXXXXX
if (word > 0x10FFFF) {
return 0;
}
*utf8_output++ = char((word >> 18) | 0b11110000);
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
*utf8_output++ = char((word & 0b111111) | 0b10000000);
pos++;
}
}
return utf8_output - start;
}
} // namespace ada::idna
/* end file src/unicode_transcoding.cpp */
/* begin file src/mapping.cpp */
#include <algorithm>
#include <array>
#include <string>
/* begin file src/mapping_tables.cpp */
// IDNA 15.0.0
// clang-format off
#ifndef ADA_IDNA_TABLES_H
#define ADA_IDNA_TABLES_H
#include <cstdint>
namespace ada::idna {
const uint32_t mappings[5164] =
{
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, 32, 32, 776, 32, 772, 50, 51, 32, 769,
956, 32, 807, 49, 49, 8260, 52, 49, 8260, 50, 51, 8260, 52, 224, 225, 226, 227,
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,
244, 245, 246, 248, 249, 250, 251, 252, 253, 254, 257, 259, 261, 263, 265, 267,
269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, 299,
301, 303, 105, 775, 309, 311, 314, 316, 318, 108, 183, 322, 324, 326, 328, 700,
110, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, 353, 355, 357, 359,
361, 363, 365, 367, 369, 371, 373, 375, 255, 378, 380, 382, 595, 387, 389, 596,
392, 598, 599, 396, 477, 601, 603, 402, 608, 611, 617, 616, 409, 623, 626, 629,
417, 419, 421, 640, 424, 643, 429, 648, 432, 650, 651, 436, 438, 658, 441, 445,
100, 382, 108, 106, 110, 106, 462, 464, 466, 468, 470, 472, 474, 476, 479, 481,
483, 485, 487, 489, 491, 493, 495, 100, 122, 501, 405, 447, 505, 507, 509, 511,
513, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535, 537, 539, 541, 543,
414, 547, 549, 551, 553, 555, 557, 559, 561, 563, 11365, 572, 410, 11366, 578, 384,
649, 652, 583, 585, 587, 589, 591, 614, 633, 635, 641, 32, 774, 32, 775, 32, 778,
32, 808, 32, 771, 32, 779, 661, 768, 787, 776, 769, 953, 881, 883, 697, 887, 32,
953, 59, 1011, 32, 776, 769, 940, 941, 942, 943, 972, 973, 974, 945, 946, 947, 948,
949, 950, 951, 952, 954, 955, 957, 958, 959, 960, 961, 963, 964, 965, 966, 967,
968, 969, 970, 971, 983, 985, 987, 989, 991, 993, 995, 997, 999, 1001, 1003, 1005,
1007, 1016, 1019, 891, 892, 893, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 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, 1121, 1123,
1125, 1127, 1129, 1131, 1133, 1135, 1137, 1139, 1141, 1143, 1145, 1147, 1149, 1151,
1153, 1163, 1165, 1167, 1169, 1171, 1173, 1175, 1177, 1179, 1181, 1183, 1185, 1187,
1189, 1191, 1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1215,
1218, 1220, 1222, 1224, 1226, 1228, 1230, 1233, 1235, 1237, 1239, 1241, 1243, 1245,
1247, 1249, 1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1271, 1273,
1275, 1277, 1279, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1299, 1301,
1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, 1377,
1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391,
1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405,
1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 1575, 1652, 1608,
1652, 1735, 1652, 1610, 1652, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, 2337,
2364, 2338, 2364, 2347, 2364, 2351, 2364, 2465, 2492, 2466, 2492, 2479, 2492, 2610,
2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620, 2849, 2876, 2850,
2876, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, 4023,
3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, 3968,
4018, 3953, 3968, 4019, 3968, 4019, 3953, 3968, 3986, 4023, 3996, 4023, 4001, 4023,
4006, 4023, 4011, 4023, 3984, 4021, 11559, 11565, 4316, 5104, 5105, 5106, 5107,
5108, 5109, 42571, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314,
4315, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329,
4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343,
4344, 4345, 4346, 4349, 4350, 4351, 592, 593, 7426, 604, 7446, 7447, 7453, 7461,
594, 597, 607, 609, 613, 618, 7547, 669, 621, 7557, 671, 625, 624, 627, 628, 632,
642, 427, 7452, 656, 657, 7681, 7683, 7685, 7687, 7689, 7691, 7693, 7695, 7697,
7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, 7717, 7719, 7721, 7723, 7725,
7727, 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753,
7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781,
7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807, 7809,
7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 97, 702, 115, 115, 7841,
7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869,
7871, 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897,
7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925,
7927, 7929, 7931, 7933, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7952,
7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7984,
7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, 8003, 8004, 8005, 8017,
8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 7936, 953, 7937,
953, 7938, 953, 7939, 953, 7940, 953, 7941, 953, 7942, 953, 7943, 953, 7968, 953,
7969, 953, 7970, 953, 7971, 953, 7972, 953, 7973, 953, 7974, 953, 7975, 953, 8032,
953, 8033, 953, 8034, 953, 8035, 953, 8036, 953, 8037, 953, 8038, 953, 8039, 953,
8048, 953, 945, 953, 940, 953, 8118, 953, 8112, 8113, 32, 787, 32, 834, 32, 776,
834, 8052, 953, 951, 953, 942, 953, 8134, 953, 8050, 32, 787, 768, 32, 787, 769,
32, 787, 834, 912, 8144, 8145, 8054, 32, 788, 768, 32, 788, 769, 32, 788, 834, 944,
8160, 8161, 8058, 8165, 32, 776, 768, 96, 8060, 953, 969, 953, 974, 953, 8182, 953,
8056, 8208, 32, 819, 8242, 8242, 8242, 8242, 8242, 8245, 8245, 8245, 8245, 8245,
33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 48, 53, 54, 55, 56, 57, 43, 8722, 61, 40,
41, 97, 47, 99, 97, 47, 115, 176, 99, 99, 47, 111, 99, 47, 117, 176, 102, 115, 109,
116, 101, 108, 116, 109, 1488, 1489, 1490, 1491, 102, 97, 120, 8721, 49, 8260, 55,
49, 8260, 57, 49, 8260, 49, 48, 49, 8260, 51, 50, 8260, 51, 49, 8260, 53, 50, 8260,
53, 51, 8260, 53, 52, 8260, 53, 49, 8260, 54, 53, 8260, 54, 49, 8260, 56, 51, 8260,
56, 53, 8260, 56, 55, 8260, 56, 105, 105, 105, 105, 105, 105, 118, 118, 105, 118,
105, 105, 118, 105, 105, 105, 105, 120, 120, 105, 120, 105, 105, 48, 8260, 51, 8747,
8747, 8747, 8747, 8747, 8750, 8750, 8750, 8750, 8750, 12296, 12297, 49, 50, 49,
51, 49, 52, 49, 53, 49, 54, 49, 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50,
41, 40, 51, 41, 40, 52, 41, 40, 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40,
57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40, 49, 50, 41, 40, 49, 51, 41, 40, 49,
52, 41, 40, 49, 53, 41, 40, 49, 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49,
57, 41, 40, 50, 48, 41, 40, 97, 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101,
41, 40, 102, 41, 40, 103, 41, 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41,
40, 108, 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 40,
114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120,
41, 40, 121, 41, 40, 122, 41, 58, 58, 61, 61, 61, 10973, 824, 11312, 11313, 11314,
11315, 11316, 11317, 11318, 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326,
11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338,
11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350,
11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11361, 619, 7549,
637, 11368, 11370, 11372, 11379, 11382, 575, 576, 11393, 11395, 11397, 11399, 11401,
11403, 11405, 11407, 11409, 11411, 11413, 11415, 11417, 11419, 11421, 11423, 11425,
11427, 11429, 11431, 11433, 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449,
11451, 11453, 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473,
11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507,
11617, 27597, 40863, 19968, 20008, 20022, 20031, 20057, 20101, 20108, 20128, 20154,
20799, 20837, 20843, 20866, 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269,
21274, 21304, 21313, 21340, 21353, 21378, 21430, 21448, 21475, 22231, 22303, 22763,
22786, 22794, 22805, 22823, 22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662,
23665, 24027, 24037, 24049, 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339,
24400, 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020,
26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27571, 27595, 27604,
27611, 27663, 27668, 27700, 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275,
29356, 29572, 29577, 29916, 29926, 29976, 29983, 29992, 30000, 30091, 30098, 30326,
30333, 30382, 30399, 30446, 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435,
31481, 31859, 31992, 32566, 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895,
32905, 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381,
34411, 34880, 34892, 34915, 35198, 35211, 35282, 35328, 35895, 35910, 35925, 35960,
35997, 36196, 36208, 36275, 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318,
37324, 37329, 38263, 38272, 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761,
38859, 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640,
39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643,
40653, 40657, 40697, 40701, 40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860,
40864, 46, 12306, 21316, 21317, 32, 12441, 32, 12442, 12424, 12426, 12467, 12488,
4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532,
4533, 4378, 4358, 4359, 4360, 4385, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368,
4369, 4370, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460,
4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4372, 4373, 4551, 4552, 4556,
4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, 4391, 4393,
4395, 4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, 4440,
4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510, 4513, 19977, 22235, 19978, 20013,
19979, 30002, 19993, 19969, 22825, 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355,
41, 40, 4357, 41, 40, 4358, 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364,
41, 40, 4366, 41, 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, 44032,
41, 40, 45208, 41, 40, 45796, 41, 40, 46972, 41, 40, 47560, 41, 40, 48148, 41, 40,
49324, 41, 40, 50500, 41, 40, 51088, 41, 40, 52264, 41, 40, 52852, 41, 40, 53440,
41, 40, 54028, 41, 40, 54616, 41, 40, 51452, 41, 40, 50724, 51204, 41, 40, 50724,
54980, 41, 40, 19968, 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, 41, 40, 20116,
41, 40, 20845, 41, 40, 19971, 41, 40, 20843, 41, 40, 20061, 41, 40, 21313, 41, 40,
26376, 41, 40, 28779, 41, 40, 27700, 41, 40, 26408, 41, 40, 37329, 41, 40, 22303,
41, 40, 26085, 41, 40, 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40,
29305, 41, 40, 36001, 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, 21628,
41, 40, 23398, 41, 40, 30435, 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, 41, 40,
31085, 41, 40, 20241, 41, 40, 33258, 41, 40, 33267, 41, 21839, 24188, 31631, 112,
116, 101, 50, 50, 50, 52, 50, 53, 50, 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 51,
51, 52, 51, 53, 52280, 44256, 51452, 51032, 50864, 31192, 30007, 36969, 20778, 21360,
27880, 38917, 20889, 27491, 24038, 21491, 21307, 23447, 22812, 51, 54, 51, 55, 51,
56, 51, 57, 52, 48, 52, 52, 52, 53, 52, 54, 52, 55, 52, 56, 52, 57, 53, 48, 49,
26376, 50, 26376, 51, 26376, 52, 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376,
57, 26376, 49, 48, 26376, 49, 49, 26376, 49, 50, 26376, 104, 103, 101, 114, 103,
101, 118, 108, 116, 100, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463,
12465, 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12484, 12486, 12490, 12491,
12492, 12493, 12494, 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513,
12514, 12516, 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529,
12530, 20196, 21644, 12450, 12497, 12540, 12488, 12450, 12523, 12501, 12449, 12450,
12531, 12506, 12450, 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531,
12481, 12454, 12457, 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540, 12459,
12540, 12458, 12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521,
12483, 12488, 12459, 12525, 12522, 12540, 12460, 12525, 12531, 12460, 12531, 12510,
12462, 12460, 12462, 12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 12480,
12540, 12461, 12525, 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540,
12488, 12523, 12461, 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12488, 12531,
12463, 12523, 12476, 12452, 12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473,
12467, 12523, 12490, 12467, 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531,
12481, 12540, 12512, 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531,
12488, 12480, 12540, 12473, 12487, 12471, 12489, 12523, 12490, 12494, 12494, 12483,
12488, 12495, 12452, 12484, 12497, 12540, 12475, 12531, 12488, 12497, 12540, 12484,
12496, 12540, 12524, 12523, 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523,
12500, 12467, 12499, 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540,
12488, 12502, 12483, 12471, 12455, 12523, 12501, 12521, 12531, 12504, 12463, 12479,
12540, 12523, 12506, 12477, 12506, 12491, 12498, 12504, 12523, 12484, 12506, 12531,
12473, 12506, 12540, 12472, 12505, 12540, 12479, 12509, 12452, 12531, 12488, 12508,
12523, 12488, 12507, 12531, 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540,
12531, 12510, 12452, 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510,
12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, 12463, 12525, 12531, 12511,
12522, 12511, 12522, 12496, 12540, 12523, 12513, 12460, 12513, 12460, 12488, 12531,
12516, 12540, 12489, 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488,
12523, 12522, 12521, 12523, 12500, 12540, 12523, 12540, 12502, 12523, 12524, 12512,
12524, 12531, 12488, 12466, 12531, 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52,
28857, 53, 28857, 54, 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49,
49, 28857, 49, 50, 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857,
49, 55, 28857, 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, 28857, 50, 50,
28857, 50, 51, 28857, 50, 52, 28857, 104, 112, 97, 100, 97, 97, 117, 98, 97, 114,
111, 118, 112, 99, 100, 109, 100, 109, 50, 100, 109, 51, 105, 117, 24179, 25104,
26157, 21644, 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 110, 97, 956,
97, 109, 97, 107, 97, 107, 98, 109, 98, 103, 98, 99, 97, 108, 107, 99, 97, 108,
112, 102, 110, 102, 956, 102, 956, 103, 109, 103, 107, 103, 104, 122, 107, 104,
122, 109, 104, 122, 116, 104, 122, 956, 108, 109, 108, 100, 108, 102, 109, 110,
109, 956, 109, 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 107, 109,
50, 109, 109, 51, 99, 109, 51, 107, 109, 51, 109, 8725, 115, 109, 8725, 115, 50,
107, 112, 97, 109, 112, 97, 103, 112, 97, 114, 97, 100, 114, 97, 100, 8725, 115,
114, 97, 100, 8725, 115, 50, 112, 115, 110, 115, 956, 115, 109, 115, 112, 118, 110,
118, 956, 118, 109, 118, 107, 118, 112, 119, 110, 119, 956, 119, 109, 119, 107,
119, 107, 969, 109, 969, 98, 113, 99, 8725, 107, 103, 100, 98, 103, 121, 104, 97,
105, 110, 107, 107, 107, 116, 108, 110, 108, 111, 103, 108, 120, 109, 105, 108,
109, 111, 108, 112, 104, 112, 112, 109, 112, 114, 115, 118, 119, 98, 118, 8725,
109, 97, 8725, 109, 49, 26085, 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085,
55, 26085, 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49,
51, 26085, 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085,
49, 57, 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085, 50, 52,
26085, 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, 26085,
51, 48, 26085, 51, 49, 26085, 103, 97, 108, 42561, 42563, 42565, 42567, 42569, 42573,
42575, 42577, 42579, 42581, 42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597,
42599, 42601, 42603, 42605, 42625, 42627, 42629, 42631, 42633, 42635, 42637, 42639,
42641, 42643, 42645, 42647, 42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797,
42799, 42803, 42805, 42807, 42809, 42811, 42813, 42815, 42817, 42819, 42821, 42823,
42825, 42827, 42829, 42831, 42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847,
42849, 42851, 42853, 42855, 42857, 42859, 42861, 42863, 42874, 42876, 7545, 42879,
42881, 42883, 42885, 42887, 42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911,
42913, 42915, 42917, 42919, 42921, 620, 670, 647, 43859, 42933, 42935, 42937, 42939,
42941, 42943, 42945, 42947, 42900, 7566, 42952, 42954, 42961, 42967, 42969, 42998,
43831, 43858, 653, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034,
5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048,
5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062,
5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076,
5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090,
5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, 5103, 35912,
26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856, 25078, 30313, 32645, 34367,
34746, 35064, 37007, 27138, 27931, 28889, 29662, 33853, 37226, 39409, 20098, 21365,
27396, 29211, 34349, 40478, 23888, 28651, 34253, 35172, 25289, 33240, 34847, 24266,
26391, 28010, 29436, 37070, 20358, 20919, 21214, 25796, 27347, 29200, 30439, 34310,
34396, 36335, 38706, 39791, 40442, 30860, 31103, 32160, 33737, 37636, 35542, 22751,
24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, 23650, 27155, 28122, 28431,
32047, 32311, 38475, 21202, 32907, 20956, 20940, 31260, 32190, 33777, 38517, 35712,
25295, 35582, 20025, 23527, 24594, 29575, 30064, 21271, 30971, 20415, 24489, 19981,
27852, 25976, 32034, 21443, 22622, 30465, 33865, 35498, 27578, 27784, 25342, 33509,
25504, 30053, 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327, 21237, 21570,
24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, 26310, 27511, 36706, 24180,
24976, 25088, 25754, 28451, 29001, 29833, 31178, 32244, 32879, 36646, 34030, 36899,
37706, 21015, 21155, 21693, 28872, 35010, 24265, 24565, 25467, 27566, 31806, 29557,
22265, 23994, 24604, 29618, 29801, 32666, 32838, 37428, 38646, 38728, 38936, 20363,
31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, 26009, 29134, 30274, 34044,
36988, 26248, 38446, 21129, 26491, 26611, 27969, 28316, 29705, 30041, 30827, 32016,
39006, 25134, 38520, 20523, 23833, 28138, 36650, 24459, 24900, 26647, 38534, 21033,
21519, 23653, 26131, 26446, 26792, 27877, 29702, 30178, 32633, 35023, 35041, 38626,
21311, 28346, 21533, 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, 33256,
31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999, 24230, 25299, 31958,
23429, 27934, 26292, 36667, 38477, 24275, 20800, 21952, 22618, 26228, 20958, 29482,
30410, 31036, 31070, 31077, 31119, 38742, 31934, 34322, 35576, 36920, 37117, 39151,
39164, 39208, 40372, 37086, 38583, 20398, 20711, 20813, 21193, 21220, 21329, 21917,
22022, 22120, 22592, 22696, 23652, 24724, 24936, 24974, 25074, 25935, 26082, 26257,
26757, 28023, 28186, 28450, 29038, 29227, 29730, 30865, 31049, 31048, 31056, 31062,
31117, 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773, 33261, 33401, 33879,
35088, 35222, 35585, 35641, 36051, 36104, 36790, 38627, 38911, 38971, 24693, 148206,
33304, 20006, 20917, 20840, 20352, 20805, 20864, 21191, 21242, 21845, 21913, 21986,
22707, 22852, 22868, 23138, 23336, 24274, 24281, 24425, 24493, 24792, 24910, 24840,
24928, 25140, 25540, 25628, 25682, 25942, 26395, 26454, 28379, 28363, 28702, 30631,
29237, 29359, 29809, 29958, 30011, 30237, 30239, 30427, 30452, 30538, 30528, 30924,
31409, 31867, 32091, 32574, 33618, 33775, 34681, 35137, 35206, 35519, 35531, 35565,
35722, 36664, 36978, 37273, 37494, 38524, 38875, 38923, 39698, 141386, 141380, 144341,
15261, 16408, 16441, 152137, 154832, 163539, 40771, 40846, 102, 102, 102, 105, 102,
108, 102, 102, 108, 1396, 1398, 1396, 1381, 1396, 1387, 1406, 1398, 1396, 1389,
1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, 1512, 1514, 1513, 1473, 1513,
1474, 1513, 1468, 1473, 1513, 1468, 1474, 1488, 1463, 1488, 1464, 1488, 1468, 1489,
1468, 1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, 1494, 1468, 1496, 1468, 1497,
1468, 1498, 1468, 1499, 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, 1507,
1468, 1508, 1468, 1510, 1468, 1511, 1468, 1512, 1468, 1514, 1468, 1493, 1465, 1489,
1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, 1662, 1664, 1658, 1663, 1657,
1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, 1678, 1672, 1688, 1681, 1705, 1711,
1715, 1713, 1722, 1723, 1728, 1729, 1726, 1746, 1747, 1709, 1734, 1736, 1739, 1733,
1737, 1744, 1609, 1574, 1575, 1574, 1749, 1574, 1608, 1574, 1735, 1574, 1734, 1574,
1736, 1574, 1744, 1574, 1609, 1740, 1574, 1580, 1574, 1581, 1574, 1605, 1574, 1610,
1576, 1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, 1610, 1578, 1580,
1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578, 1610, 1579, 1580, 1579, 1605,
1579, 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, 1605, 1582, 1580, 1582, 1581,
1582, 1605, 1587, 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, 1581, 1589, 1605,
1590, 1580, 1590, 1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, 1592, 1605,
1593, 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, 1581, 1601, 1582,
1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602, 1605, 1602, 1609, 1602, 1610,
1603, 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, 1603, 1605, 1603, 1609,
1603, 1610, 1604, 1580, 1604, 1581, 1604, 1582, 1604, 1605, 1604, 1609, 1604, 1610,
1605, 1580, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606, 1582,
1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, 1605, 1607, 1609, 1607, 1610,
1610, 1581, 1610, 1582, 1610, 1609, 1584, 1648, 1585, 1648, 1609, 1648, 32, 1612,
1617, 32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, 1616, 1617, 32, 1617,
1648, 1574, 1585, 1574, 1586, 1574, 1606, 1576, 1585, 1576, 1586, 1576, 1606, 1578,
1585, 1578, 1586, 1578, 1606, 1579, 1585, 1579, 1586, 1579, 1606, 1605, 1575, 1606,
1585, 1606, 1586, 1606, 1606, 1610, 1585, 1610, 1586, 1574, 1582, 1574, 1607, 1576,
1607, 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, 1607, 1648, 1579, 1607, 1587,
1607, 1588, 1605, 1588, 1607, 1600, 1614, 1617, 1600, 1615, 1617, 1600, 1616, 1617,
1591, 1609, 1591, 1610, 1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, 1609,
1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, 1580, 1609, 1580, 1610, 1582, 1609,
1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, 1588, 1580, 1588, 1581, 1588, 1582,
1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1575, 1611, 1578, 1580, 1605, 1578,
1581, 1580, 1578, 1581, 1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, 1581,
1578, 1605, 1582, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, 1580, 1587, 1580,
1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605, 1580, 1587, 1605, 1605, 1589,
1581, 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, 1580, 1610, 1588, 1605, 1582,
1588, 1605, 1605, 1590, 1581, 1609, 1590, 1582, 1605, 1591, 1605, 1581, 1591, 1605,
1605, 1591, 1605, 1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, 1609, 1594,
1605, 1605, 1594, 1605, 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605, 1581,
1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, 1580,
1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, 1580, 1605, 1581, 1610, 1605,
1580, 1581, 1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605, 1580, 1607, 1605, 1605,
1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, 1605, 1606, 1580, 1609, 1606, 1605,
1610, 1606, 1605, 1609, 1610, 1605, 1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578,
1580, 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, 1605, 1610, 1578, 1605, 1609,
1580, 1605, 1610, 1580, 1581, 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581,
1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605, 1610, 1610,
1580, 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, 1605, 1610, 1606, 1581, 1610,
1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580, 1581, 1605, 1582, 1610, 1604, 1580,
1605, 1603, 1605, 1605, 1580, 1581, 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601,
1605, 1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, 1580, 1610, 1589, 1604, 1746,
1602, 1604, 1746, 1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585, 1605, 1581, 1605,
1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, 1593, 1604, 1610, 1607, 1608,
1587, 1604, 1605, 1589, 1604, 1609, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607,
32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 1580, 1604, 32, 1580, 1604,
1575, 1604, 1607, 1585, 1740, 1575, 1604, 44, 12289, 12310, 12311, 8212, 8211, 95,
123, 125, 12308, 12309, 12304, 12305, 12298, 12299, 12300, 12301, 12302, 12303,
91, 93, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, 1611, 1600, 1611, 1600, 1617,
32, 1618, 1600, 1618, 1569, 1570, 1571, 1572, 1573, 1577, 1604, 1570, 1604, 1571,
1604, 1573, 34, 39, 94, 124, 126, 10629, 10630, 12539, 12453, 12515, 162, 163, 172,
166, 165, 8361, 9474, 8592, 8593, 8594, 8595, 9632, 9675, 66600, 66601, 66602, 66603,
66604, 66605, 66606, 66607, 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615,
66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623, 66624, 66625, 66626, 66627,
66628, 66629, 66630, 66631, 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639,
66776, 66777, 66778, 66779, 66780, 66781, 66782, 66783, 66784, 66785, 66786, 66787,
66788, 66789, 66790, 66791, 66792, 66793, 66794, 66795, 66796, 66797, 66798, 66799,
66800, 66801, 66802, 66803, 66804, 66805, 66806, 66807, 66808, 66809, 66810, 66811,
66967, 66968, 66969, 66970, 66971, 66972, 66973, 66974, 66975, 66976, 66977, 66979,
66980, 66981, 66982, 66983, 66984, 66985, 66986, 66987, 66988, 66989, 66990, 66991,
66992, 66993, 66995, 66996, 66997, 66998, 66999, 67000, 67001, 67003, 67004, 720,
721, 665, 675, 43878, 677, 676, 7569, 600, 606, 681, 612, 610, 667, 668, 615, 644,
682, 683, 122628, 42894, 622, 122629, 654, 122630, 630, 631, 634, 122632, 638, 680,
678, 43879, 679, 11377, 655, 673, 674, 664, 448, 449, 450, 122634, 122654, 68800,
68801, 68802, 68803, 68804, 68805, 68806, 68807, 68808, 68809, 68810, 68811, 68812,
68813, 68814, 68815, 68816, 68817, 68818, 68819, 68820, 68821, 68822, 68823, 68824,
68825, 68826, 68827, 68828, 68829, 68830, 68831, 68832, 68833, 68834, 68835, 68836,
68837, 68838, 68839, 68840, 68841, 68842, 68843, 68844, 68845, 68846, 68847, 68848,
68849, 68850, 71872, 71873, 71874, 71875, 71876, 71877, 71878, 71879, 71880, 71881,
71882, 71883, 71884, 71885, 71886, 71887, 71888, 71889, 71890, 71891, 71892, 71893,
71894, 71895, 71896, 71897, 71898, 71899, 71900, 71901, 71902, 71903, 93792, 93793,
93794, 93795, 93796, 93797, 93798, 93799, 93800, 93801, 93802, 93803, 93804, 93805,
93806, 93807, 93808, 93809, 93810, 93811, 93812, 93813, 93814, 93815, 93816, 93817,
93818, 93819, 93820, 93821, 93822, 93823, 119127, 119141, 119128, 119141, 119128,
119141, 119150, 119128, 119141, 119151, 119128, 119141, 119152, 119128, 119141,
119153, 119128, 119141, 119154, 119225, 119141, 119226, 119141, 119225, 119141,
119150, 119226, 119141, 119150, 119225, 119141, 119151, 119226, 119141, 119151,
305, 567, 8711, 8706, 1231, 125218, 125219, 125220, 125221, 125222, 125223, 125224,
125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, 125233, 125234,
125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, 125243, 125244,
125245, 125246, 125247, 125248, 125249, 125250, 125251, 1646, 1697, 1647, 48, 44,
49, 44, 50, 44, 51, 44, 52, 44, 53, 44, 54, 44, 55, 44, 56, 44, 57, 44, 12308, 115,
12309, 119, 122, 104, 118, 115, 100, 112, 112, 118, 119, 99, 109, 114, 100, 106,
12411, 12363, 12467, 12467, 23383, 21452, 22810, 35299, 20132, 26144, 28961, 21069,
24460, 20877, 26032, 21021, 32066, 36009, 22768, 21561, 28436, 25237, 25429, 36938,
25351, 25171, 31105, 31354, 21512, 28288, 30003, 21106, 21942, 37197, 12308, 26412,
12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, 23433, 12309, 12308, 28857,
12309, 12308, 25171, 12309, 12308, 30423, 12309, 12308, 21213, 12309, 12308, 25943,
12309, 24471, 21487, 20029, 20024, 20033, 131362, 20320, 20411, 20482, 20602, 20633,
20687, 13470, 132666, 20820, 20836, 20855, 132380, 13497, 20839, 132427, 20887,
20900, 20172, 20908, 168415, 20995, 13535, 21051, 21062, 21111, 13589, 21253, 21254,
21321, 21338, 21363, 21373, 21375, 133676, 28784, 21450, 21471, 133987, 21483, 21489,
21510, 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892, 21931,
21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, 22541, 22411, 22578,
22577, 22700, 136420, 22770, 22775, 22790, 22818, 22882, 136872, 136938, 23020,
23067, 23079, 23000, 23142, 14062, 23304, 23358, 137672, 23491, 23512, 23539, 138008,
23551, 23558, 14209, 23648, 23744, 23693, 138724, 23875, 138726, 23918, 23915, 23932,
24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, 139651, 14460, 24240, 24243,
24246, 172946, 140081, 33281, 24354, 14535, 144056, 156122, 24418, 24427, 14563,
24474, 24525, 24535, 24569, 24705, 14650, 14620, 141012, 24775, 24904, 24908, 24954,
25010, 24996, 25007, 25054, 25115, 25181, 25265, 25300, 25424, 142092, 25405, 25340,
25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, 25726, 25757, 25719,
14956, 25964, 143370, 26083, 26360, 26185, 15129, 15112, 15076, 20882, 20885, 26368,
26268, 32941, 17369, 26401, 26462, 26451, 144323, 15177, 26618, 26501, 26706, 144493,
26766, 26655, 26900, 26946, 27043, 27114, 27304, 145059, 27355, 15384, 27425, 145575,
27476, 15438, 27506, 27551, 27579, 146061, 138507, 146170, 27726, 146620, 27839,
27853, 27751, 27926, 27966, 28009, 28024, 28037, 146718, 27956, 28207, 28270, 15667,
28359, 147153, 28153, 28526, 147294, 147342, 28614, 28729, 28699, 15766, 28746,
28797, 28791, 28845, 132389, 28997, 148067, 29084, 29224, 29264, 149000, 29312,
29333, 149301, 149524, 29562, 29579, 16044, 29605, 16056, 29767, 29788, 29829, 29898,
16155, 29988, 150582, 30014, 150674, 139679, 30224, 151457, 151480, 151620, 16380,
16392, 151795, 151794, 151833, 151859, 30494, 30495, 30603, 16454, 16534, 152605,
30798, 16611, 153126, 153242, 153285, 31211, 16687, 31306, 31311, 153980, 154279,
16898, 154539, 31686, 31689, 16935, 154752, 31954, 17056, 31976, 31971, 32000, 155526,
32099, 17153, 32199, 32258, 32325, 17204, 156200, 156231, 17241, 156377, 32634,
156478, 32661, 32762, 156890, 156963, 32864, 157096, 32880, 144223, 17365, 32946,
33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, 33284, 36766, 17515,
33425, 33419, 33437, 21171, 33457, 33459, 33469, 33510, 158524, 33565, 33635, 33709,
33571, 33725, 33767, 33619, 33738, 33740, 33756, 158774, 159083, 158933, 17707,
34033, 34035, 34070, 160714, 34148, 159532, 17757, 17761, 159665, 159954, 17771,
34384, 34407, 34409, 34473, 34440, 34574, 34530, 34600, 34667, 34694, 34785, 34817,
17913, 34912, 161383, 35031, 35038, 17973, 35066, 13499, 161966, 162150, 18110,
18119, 35488, 162984, 36011, 36033, 36123, 36215, 163631, 133124, 36299, 36284,
36336, 133342, 36564, 165330, 165357, 37012, 37105, 37137, 165678, 37147, 37432,
37591, 37592, 37500, 37881, 37909, 166906, 38283, 18837, 38327, 167287, 18918, 38595,
23986, 38691, 168261, 168474, 19054, 19062, 38880, 168970, 19122, 169110, 38953,
169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406, 170800, 40000, 40189, 19662,
19693, 40295, 172238, 19704, 172293, 172558, 172689, 19798, 40702, 40709, 40719,
40726, 173568,
};
const uint32_t table[8000][2] =
{
{0, 1}, {65, 16777219}, {66, 16777475}, {67, 16777731},
{68, 16777987}, {69, 16778243}, {70, 16778499}, {71, 16778755},
{72, 16779011}, {73, 16779267}, {74, 16779523}, {75, 16779779},
{76, 16780035}, {77, 16780291}, {78, 16780547}, {79, 16780803},
{80, 16781059}, {81, 16781315}, {82, 16781571}, {83, 16781827},
{84, 16782083}, {85, 16782339}, {86, 16782595}, {87, 16782851},
{88, 16783107}, {89, 16783363}, {90, 16783619}, {91, 1},
{128, 2}, {160, 16783875}, {161, 1}, {168, 33561347},
{169, 1}, {170, 16777219}, {171, 1}, {173, 0},
{174, 1}, {175, 33561859}, {176, 1}, {178, 16785155},
{179, 16785411}, {180, 33562883}, {181, 16786179}, {182, 1},
{184, 33563651}, {185, 16786947}, {186, 16780803}, {187, 1},
{188, 50341635}, {189, 50342403}, {190, 50343171}, {191, 1},
{192, 16789507}, {193, 16789763}, {194, 16790019}, {195, 16790275},
{196, 16790531}, {197, 16790787}, {198, 16791043}, {199, 16791299},
{200, 16791555}, {201, 16791811}, {202, 16792067}, {203, 16792323},
{204, 16792579}, {205, 16792835}, {206, 16793091}, {207, 16793347},
{208, 16793603}, {209, 16793859}, {210, 16794115}, {211, 16794371},
{212, 16794627}, {213, 16794883}, {214, 16795139}, {215, 1},
{216, 16795395}, {217, 16795651}, {218, 16795907}, {219, 16796163},
{220, 16796419}, {221, 16796675}, {222, 16796931}, {223, 1},
{256, 16797187}, {257, 1}, {258, 16797443}, {259, 1},
{260, 16797699}, {261, 1}, {262, 16797955}, {263, 1},
{264, 16798211}, {265, 1}, {266, 16798467}, {267, 1},
{268, 16798723}, {269, 1}, {270, 16798979}, {271, 1},
{272, 16799235}, {273, 1}, {274, 16799491}, {275, 1},
{276, 16799747}, {277, 1}, {278, 16800003}, {279, 1},
{280, 16800259}, {281, 1}, {282, 16800515}, {283, 1},
{284, 16800771}, {285, 1}, {286, 16801027}, {287, 1},
{288, 16801283}, {289, 1}, {290, 16801539}, {291, 1},
{292, 16801795}, {293, 1}, {294, 16802051}, {295, 1},
{296, 16802307}, {297, 1}, {298, 16802563}, {299, 1},
{300, 16802819}, {301, 1}, {302, 16803075}, {303, 1},
{304, 33580547}, {305, 1}, {306, 33556483}, {308, 16803843},
{309, 1}, {310, 16804099}, {311, 1}, {313, 16804355},
{314, 1}, {315, 16804611}, {316, 1}, {317, 16804867},
{318, 1}, {319, 33582339}, {321, 16805635}, {322, 1},
{323, 16805891}, {324, 1}, {325, 16806147}, {326, 1},
{327, 16806403}, {328, 1}, {329, 33583875}, {330, 16807171},
{331, 1}, {332, 16807427}, {333, 1}, {334, 16807683},
{335, 1}, {336, 16807939}, {337, 1}, {338, 16808195},
{339, 1}, {340, 16808451}, {341, 1}, {342, 16808707},
{343, 1}, {344, 16808963}, {345, 1}, {346, 16809219},
{347, 1}, {348, 16809475}, {349, 1}, {350, 16809731},
{351, 1}, {352, 16809987}, {353, 1}, {354, 16810243},
{355, 1}, {356, 16810499}, {357, 1}, {358, 16810755},
{359, 1}, {360, 16811011}, {361, 1}, {362, 16811267},
{363, 1}, {364, 16811523}, {365, 1}, {366, 16811779},
{367, 1}, {368, 16812035}, {369, 1}, {370, 16812291},
{371, 1}, {372, 16812547}, {373, 1}, {374, 16812803},
{375, 1}, {376, 16813059}, {377, 16813315}, {378, 1},
{379, 16813571}, {380, 1}, {381, 16813827}, {382, 1},
{383, 16781827}, {384, 1}, {385, 16814083}, {386, 16814339},
{387, 1}, {388, 16814595}, {389, 1}, {390, 16814851},
{391, 16815107}, {392, 1}, {393, 16815363}, {394, 16815619},
{395, 16815875}, {396, 1}, {398, 16816131}, {399, 16816387},
{400, 16816643}, {401, 16816899}, {402, 1}, {403, 16817155},
{404, 16817411}, {405, 1}, {406, 16817667}, {407, 16817923},
{408, 16818179}, {409, 1}, {412, 16818435}, {413, 16818691},
{414, 1}, {415, 16818947}, {416, 16819203}, {417, 1},
{418, 16819459}, {419, 1}, {420, 16819715}, {421, 1},
{422, 16819971}, {423, 16820227}, {424, 1}, {425, 16820483},
{426, 1}, {428, 16820739}, {429, 1}, {430, 16820995},
{431, 16821251}, {432, 1}, {433, 16821507}, {434, 16821763},
{435, 16822019}, {436, 1}, {437, 16822275}, {438, 1},
{439, 16822531}, {440, 16822787}, {441, 1}, {444, 16823043},
{445, 1}, {452, 33600515}, {455, 33601027}, {458, 33601539},
{461, 16824835}, {462, 1}, {463, 16825091}, {464, 1},
{465, 16825347}, {466, 1}, {467, 16825603}, {468, 1},
{469, 16825859}, {470, 1}, {471, 16826115}, {472, 1},
{473, 16826371}, {474, 1}, {475, 16826627}, {476, 1},
{478, 16826883}, {479, 1}, {480, 16827139}, {481, 1},
{482, 16827395}, {483, 1}, {484, 16827651}, {485, 1},
{486, 16827907}, {487, 1}, {488, 16828163}, {489, 1},
{490, 16828419}, {491, 1}, {492, 16828675}, {493, 1},
{494, 16828931}, {495, 1}, {497, 33606403}, {500, 16829699},
{501, 1}, {502, 16829955}, {503, 16830211}, {504, 16830467},
{505, 1}, {506, 16830723}, {507, 1}, {508, 16830979},
{509, 1}, {510, 16831235}, {511, 1}, {512, 16831491},
{513, 1}, {514, 16831747}, {515, 1}, {516, 16832003},
{517, 1}, {518, 16832259}, {519, 1}, {520, 16832515},
{521, 1}, {522, 16832771}, {523, 1}, {524, 16833027},
{525, 1}, {526, 16833283}, {527, 1}, {528, 16833539},
{529, 1}, {530, 16833795}, {531, 1}, {532, 16834051},
{533, 1}, {534, 16834307}, {535, 1}, {536, 16834563},
{537, 1}, {538, 16834819}, {539, 1}, {540, 16835075},
{541, 1}, {542, 16835331}, {543, 1}, {544, 16835587},
{545, 1}, {546, 16835843}, {547, 1}, {548, 16836099},
{549, 1}, {550, 16836355}, {551, 1}, {552, 16836611},
{553, 1}, {554, 16836867}, {555, 1}, {556, 16837123},
{557, 1}, {558, 16837379}, {559, 1}, {560, 16837635},
{561, 1}, {562, 16837891}, {563, 1}, {570, 16838147},
{571, 16838403}, {572, 1}, {573, 16838659}, {574, 16838915},
{575, 1}, {577, 16839171}, {578, 1}, {579, 16839427},
{580, 16839683}, {581, 16839939}, {582, 16840195}, {583, 1},
{584, 16840451}, {585, 1}, {586, 16840707}, {587, 1},
{588, 16840963}, {589, 1}, {590, 16841219}, {591, 1},
{688, 16779011}, {689, 16841475}, {690, 16779523}, {691, 16781571},
{692, 16841731}, {693, 16841987}, {694, 16842243}, {695, 16782851},
{696, 16783363}, {697, 1}, {728, 33619715}, {729, 33620227},
{730, 33620739}, {731, 33621251}, {732, 33621763}, {733, 33622275},
{734, 1}, {736, 16817411}, {737, 16780035}, {738, 16781827},
{739, 16783107}, {740, 16845571}, {741, 1}, {832, 16845827},
{833, 16785923}, {834, 1}, {835, 16846083}, {836, 33623555},
{837, 16846851}, {838, 1}, {847, 0}, {848, 1},
{880, 16847107}, {881, 1}, {882, 16847363}, {883, 1},
{884, 16847619}, {885, 1}, {886, 16847875}, {887, 1},
{888, 2}, {890, 33625347}, {891, 1}, {894, 16848643},
{895, 16848899}, {896, 2}, {900, 33562883}, {901, 50403587},
{902, 16849923}, {903, 16805379}, {904, 16850179}, {905, 16850435},
{906, 16850691}, {907, 2}, {908, 16850947}, {909, 2},
{910, 16851203}, {911, 16851459}, {912, 1}, {913, 16851715},
{914, 16851971}, {915, 16852227}, {916, 16852483}, {917, 16852739},
{918, 16852995}, {919, 16853251}, {920, 16853507}, {921, 16846851},
{922, 16853763}, {923, 16854019}, {924, 16786179}, {925, 16854275},
{926, 16854531}, {927, 16854787}, {928, 16855043}, {929, 16855299},
{930, 2}, {931, 16855555}, {932, 16855811}, {933, 16856067},
{934, 16856323}, {935, 16856579}, {936, 16856835}, {937, 16857091},
{938, 16857347}, {939, 16857603}, {940, 1}, {975, 16857859},
{976, 16851971}, {977, 16853507}, {978, 16856067}, {979, 16851203},
{980, 16857603}, {981, 16856323}, {982, 16855043}, {983, 1},
{984, 16858115}, {985, 1}, {986, 16858371}, {987, 1},
{988, 16858627}, {989, 1}, {990, 16858883}, {991, 1},
{992, 16859139}, {993, 1}, {994, 16859395}, {995, 1},
{996, 16859651}, {997, 1}, {998, 16859907}, {999, 1},
{1000, 16860163}, {1001, 1}, {1002, 16860419}, {1003, 1},
{1004, 16860675}, {1005, 1}, {1006, 16860931}, {1007, 1},
{1008, 16853763}, {1009, 16855299}, {1010, 16855555}, {1011, 1},
{1012, 16853507}, {1013, 16852739}, {1014, 1}, {1015, 16861187},
{1016, 1}, {1017, 16855555}, {1018, 16861443}, {1019, 1},
{1021, 16861699}, {1022, 16861955}, {1023, 16862211}, {1024, 16862467},
{1025, 16862723}, {1026, 16862979}, {1027, 16863235}, {1028, 16863491},
{1029, 16863747}, {1030, 16864003}, {1031, 16864259}, {1032, 16864515},
{1033, 16864771}, {1034, 16865027}, {1035, 16865283}, {1036, 16865539},
{1037, 16865795}, {1038, 16866051}, {1039, 16866307}, {1040, 16866563},
{1041, 16866819}, {1042, 16867075}, {1043, 16867331}, {1044, 16867587},
{1045, 16867843}, {1046, 16868099}, {1047, 16868355}, {1048, 16868611},
{1049, 16868867}, {1050, 16869123}, {1051, 16869379}, {1052, 16869635},
{1053, 16869891}, {1054, 16870147}, {1055, 16870403}, {1056, 16870659},
{1057, 16870915}, {1058, 16871171}, {1059, 16871427}, {1060, 16871683},
{1061, 16871939}, {1062, 16872195}, {1063, 16872451}, {1064, 16872707},
{1065, 16872963}, {1066, 16873219}, {1067, 16873475}, {1068, 16873731},
{1069, 16873987}, {1070, 16874243}, {1071, 16874499}, {1072, 1},
{1120, 16874755}, {1121, 1}, {1122, 16875011}, {1123, 1},
{1124, 16875267}, {1125, 1}, {1126, 16875523}, {1127, 1},
{1128, 16875779}, {1129, 1}, {1130, 16876035}, {1131, 1},
{1132, 16876291}, {1133, 1}, {1134, 16876547}, {1135, 1},
{1136, 16876803}, {1137, 1}, {1138, 16877059}, {1139, 1},
{1140, 16877315}, {1141, 1}, {1142, 16877571}, {1143, 1},
{1144, 16877827}, {1145, 1}, {1146, 16878083}, {1147, 1},
{1148, 16878339}, {1149, 1}, {1150, 16878595}, {1151, 1},
{1152, 16878851}, {1153, 1}, {1162, 16879107}, {1163, 1},
{1164, 16879363}, {1165, 1}, {1166, 16879619}, {1167, 1},
{1168, 16879875}, {1169, 1}, {1170, 16880131}, {1171, 1},
{1172, 16880387}, {1173, 1}, {1174, 16880643}, {1175, 1},
{1176, 16880899}, {1177, 1}, {1178, 16881155}, {1179, 1},
{1180, 16881411}, {1181, 1}, {1182, 16881667}, {1183, 1},
{1184, 16881923}, {1185, 1}, {1186, 16882179}, {1187, 1},
{1188, 16882435}, {1189, 1}, {1190, 16882691}, {1191, 1},
{1192, 16882947}, {1193, 1}, {1194, 16883203}, {1195, 1},
{1196, 16883459}, {1197, 1}, {1198, 16883715}, {1199, 1},
{1200, 16883971}, {1201, 1}, {1202, 16884227}, {1203, 1},
{1204, 16884483}, {1205, 1}, {1206, 16884739}, {1207, 1},
{1208, 16884995}, {1209, 1}, {1210, 16885251}, {1211, 1},
{1212, 16885507}, {1213, 1}, {1214, 16885763}, {1215, 1},
{1216, 2}, {1217, 16886019}, {1218, 1}, {1219, 16886275},
{1220, 1}, {1221, 16886531}, {1222, 1}, {1223, 16886787},
{1224, 1}, {1225, 16887043}, {1226, 1}, {1227, 16887299},
{1228, 1}, {1229, 16887555}, {1230, 1}, {1232, 16887811},
{1233, 1}, {1234, 16888067}, {1235, 1}, {1236, 16888323},
{1237, 1}, {1238, 16888579}, {1239, 1}, {1240, 16888835},
{1241, 1}, {1242, 16889091}, {1243, 1}, {1244, 16889347},
{1245, 1}, {1246, 16889603}, {1247, 1}, {1248, 16889859},
{1249, 1}, {1250, 16890115}, {1251, 1}, {1252, 16890371},
{1253, 1}, {1254, 16890627}, {1255, 1}, {1256, 16890883},
{1257, 1}, {1258, 16891139}, {1259, 1}, {1260, 16891395},
{1261, 1}, {1262, 16891651}, {1263, 1}, {1264, 16891907},
{1265, 1}, {1266, 16892163}, {1267, 1}, {1268, 16892419},
{1269, 1}, {1270, 16892675}, {1271, 1}, {1272, 16892931},
{1273, 1}, {1274, 16893187}, {1275, 1}, {1276, 16893443},
{1277, 1}, {1278, 16893699}, {1279, 1}, {1280, 16893955},
{1281, 1}, {1282, 16894211}, {1283, 1}, {1284, 16894467},
{1285, 1}, {1286, 16894723}, {1287, 1}, {1288, 16894979},
{1289, 1}, {1290, 16895235}, {1291, 1}, {1292, 16895491},
{1293, 1}, {1294, 16895747}, {1295, 1}, {1296, 16896003},
{1297, 1}, {1298, 16896259}, {1299, 1}, {1300, 16896515},
{1301, 1}, {1302, 16896771}, {1303, 1}, {1304, 16897027},
{1305, 1}, {1306, 16897283}, {1307, 1}, {1308, 16897539},
{1309, 1}, {1310, 16897795}, {1311, 1}, {1312, 16898051},
{1313, 1}, {1314, 16898307}, {1315, 1}, {1316, 16898563},
{1317, 1}, {1318, 16898819}, {1319, 1}, {1320, 16899075},
{1321, 1}, {1322, 16899331}, {1323, 1}, {1324, 16899587},
{1325, 1}, {1326, 16899843}, {1327, 1}, {1328, 2},
{1329, 16900099}, {1330, 16900355}, {1331, 16900611}, {1332, 16900867},
{1333, 16901123}, {1334, 16901379}, {1335, 16901635}, {1336, 16901891},
{1337, 16902147}, {1338, 16902403}, {1339, 16902659}, {1340, 16902915},
{1341, 16903171}, {1342, 16903427}, {1343, 16903683}, {1344, 16903939},
{1345, 16904195}, {1346, 16904451}, {1347, 16904707}, {1348, 16904963},
{1349, 16905219}, {1350, 16905475}, {1351, 16905731}, {1352, 16905987},
{1353, 16906243}, {1354, 16906499}, {1355, 16906755}, {1356, 16907011},
{1357, 16907267}, {1358, 16907523}, {1359, 16907779}, {1360, 16908035},
{1361, 16908291}, {1362, 16908547}, {1363, 16908803}, {1364, 16909059},
{1365, 16909315}, {1366, 16909571}, {1367, 2}, {1369, 1},
{1415, 33687043}, {1416, 1}, {1419, 2}, {1421, 1},
{1424, 2}, {1425, 1}, {1480, 2}, {1488, 1},
{1515, 2}, {1519, 1}, {1525, 2}, {1542, 1},
{1564, 2}, {1565, 1}, {1653, 33687555}, {1654, 33688067},
{1655, 33688579}, {1656, 33689091}, {1657, 1}, {1757, 2},
{1758, 1}, {1806, 2}, {1808, 1}, {1867, 2},
{1869, 1}, {1970, 2}, {1984, 1}, {2043, 2},
{2045, 1}, {2094, 2}, {2096, 1}, {2111, 2},
{2112, 1}, {2140, 2}, {2142, 1}, {2143, 2},
{2144, 1}, {2155, 2}, {2160, 1}, {2191, 2},
{2200, 1}, {2274, 2}, {2275, 1}, {2392, 33689603},
{2393, 33690115}, {2394, 33690627}, {2395, 33691139}, {2396, 33691651},
{2397, 33692163}, {2398, 33692675}, {2399, 33693187}, {2400, 1},
{2436, 2}, {2437, 1}, {2445, 2}, {2447, 1},
{2449, 2}, {2451, 1}, {2473, 2}, {2474, 1},
{2481, 2}, {2482, 1}, {2483, 2}, {2486, 1},
{2490, 2}, {2492, 1}, {2501, 2}, {2503, 1},
{2505, 2}, {2507, 1}, {2511, 2}, {2519, 1},
{2520, 2}, {2524, 33693699}, {2525, 33694211}, {2526, 2},
{2527, 33694723}, {2528, 1}, {2532, 2}, {2534, 1},
{2559, 2}, {2561, 1}, {2564, 2}, {2565, 1},
{2571, 2}, {2575, 1}, {2577, 2}, {2579, 1},
{2601, 2}, {2602, 1}, {2609, 2}, {2610, 1},
{2611, 33695235}, {2612, 2}, {2613, 1}, {2614, 33695747},
{2615, 2}, {2616, 1}, {2618, 2}, {2620, 1},
{2621, 2}, {2622, 1}, {2627, 2}, {2631, 1},
{2633, 2}, {2635, 1}, {2638, 2}, {2641, 1},
{2642, 2}, {2649, 33696259}, {2650, 33696771}, {2651, 33697283},
{2652, 1}, {2653, 2}, {2654, 33697795}, {2655, 2},
{2662, 1}, {2679, 2}, {2689, 1}, {2692, 2},
{2693, 1}, {2702, 2}, {2703, 1}, {2706, 2},
{2707, 1}, {2729, 2}, {2730, 1}, {2737, 2},
{2738, 1}, {2740, 2}, {2741, 1}, {2746, 2},
{2748, 1}, {2758, 2}, {2759, 1}, {2762, 2},
{2763, 1}, {2766, 2}, {2768, 1}, {2769, 2},
{2784, 1}, {2788, 2}, {2790, 1}, {2802, 2},
{2809, 1}, {2816, 2}, {2817, 1}, {2820, 2},
{2821, 1}, {2829, 2}, {2831, 1}, {2833, 2},
{2835, 1}, {2857, 2}, {2858, 1}, {2865, 2},
{2866, 1}, {2868, 2}, {2869, 1}, {2874, 2},
{2876, 1}, {2885, 2}, {2887, 1}, {2889, 2},
{2891, 1}, {2894, 2}, {2901, 1}, {2904, 2},
{2908, 33698307}, {2909, 33698819}, {2910, 2}, {2911, 1},
{2916, 2}, {2918, 1}, {2936, 2}, {2946, 1},
{2948, 2}, {2949, 1}, {2955, 2}, {2958, 1},
{2961, 2}, {2962, 1}, {2966, 2}, {2969, 1},
{2971, 2}, {2972, 1}, {2973, 2}, {2974, 1},
{2976, 2}, {2979, 1}, {2981, 2}, {2984, 1},
{2987, 2}, {2990, 1}, {3002, 2}, {3006, 1},
{3011, 2}, {3014, 1}, {3017, 2}, {3018, 1},
{3022, 2}, {3024, 1}, {3025, 2}, {3031, 1},
{3032, 2}, {3046, 1}, {3067, 2}, {3072, 1},
{3085, 2}, {3086, 1}, {3089, 2}, {3090, 1},
{3113, 2}, {3114, 1}, {3130, 2}, {3132, 1},
{3141, 2}, {3142, 1}, {3145, 2}, {3146, 1},
{3150, 2}, {3157, 1}, {3159, 2}, {3160, 1},
{3163, 2}, {3165, 1}, {3166, 2}, {3168, 1},
{3172, 2}, {3174, 1}, {3184, 2}, {3191, 1},
{3213, 2}, {3214, 1}, {3217, 2}, {3218, 1},
{3241, 2}, {3242, 1}, {3252, 2}, {3253, 1},
{3258, 2}, {3260, 1}, {3269, 2}, {3270, 1},
{3273, 2}, {3274, 1}, {3278, 2}, {3285, 1},
{3287, 2}, {3293, 1}, {3295, 2}, {3296, 1},
{3300, 2}, {3302, 1}, {3312, 2}, {3313, 1},
{3316, 2}, {3328, 1}, {3341, 2}, {3342, 1},
{3345, 2}, {3346, 1}, {3397, 2}, {3398, 1},
{3401, 2}, {3402, 1}, {3408, 2}, {3412, 1},
{3428, 2}, {3430, 1}, {3456, 2}, {3457, 1},
{3460, 2}, {3461, 1}, {3479, 2}, {3482, 1},
{3506, 2}, {3507, 1}, {3516, 2}, {3517, 1},
{3518, 2}, {3520, 1}, {3527, 2}, {3530, 1},
{3531, 2}, {3535, 1}, {3541, 2}, {3542, 1},
{3543, 2}, {3544, 1}, {3552, 2}, {3558, 1},
{3568, 2}, {3570, 1}, {3573, 2}, {3585, 1},
{3635, 33699331}, {3636, 1}, {3643, 2}, {3647, 1},
{3676, 2}, {3713, 1}, {3715, 2}, {3716, 1},
{3717, 2}, {3718, 1}, {3723, 2}, {3724, 1},
{3748, 2}, {3749, 1}, {3750, 2}, {3751, 1},
{3763, 33699843}, {3764, 1}, {3774, 2}, {3776, 1},
{3781, 2}, {3782, 1}, {3783, 2}, {3784, 1},
{3791, 2}, {3792, 1}, {3802, 2}, {3804, 33700355},
{3805, 33700867}, {3806, 1}, {3808, 2}, {3840, 1},
{3852, 16924163}, {3853, 1}, {3907, 33701635}, {3908, 1},
{3912, 2}, {3913, 1}, {3917, 33702147}, {3918, 1},
{3922, 33702659}, {3923, 1}, {3927, 33703171}, {3928, 1},
{3932, 33703683}, {3933, 1}, {3945, 33704195}, {3946, 1},
{3949, 2}, {3953, 1}, {3955, 33704707}, {3956, 1},
{3957, 33705219}, {3958, 33705731}, {3959, 50483459}, {3960, 33707011},
{3961, 50484739}, {3962, 1}, {3969, 33706499}, {3970, 1},
{3987, 33708291}, {3988, 1}, {3992, 2}, {3993, 1},
{3997, 33708803}, {3998, 1}, {4002, 33709315}, {4003, 1},
{4007, 33709827}, {4008, 1}, {4012, 33710339}, {4013, 1},
{4025, 33710851}, {4026, 1}, {4029, 2}, {4030, 1},
{4045, 2}, {4046, 1}, {4059, 2}, {4096, 1},
{4256, 2}, {4295, 16934147}, {4296, 2}, {4301, 16934403},
{4302, 2}, {4304, 1}, {4348, 16934659}, {4349, 1},
{4447, 2}, {4449, 1}, {4681, 2}, {4682, 1},
{4686, 2}, {4688, 1}, {4695, 2}, {4696, 1},
{4697, 2}, {4698, 1}, {4702, 2}, {4704, 1},
{4745, 2}, {4746, 1}, {4750, 2}, {4752, 1},
{4785, 2}, {4786, 1}, {4790, 2}, {4792, 1},
{4799, 2}, {4800, 1}, {4801, 2}, {4802, 1},
{4806, 2}, {4808, 1}, {4823, 2}, {4824, 1},
{4881, 2}, {4882, 1}, {4886, 2}, {4888, 1},
{4955, 2}, {4957, 1}, {4989, 2}, {4992, 1},
{5018, 2}, {5024, 1}, {5110, 2}, {5112, 16934915},
{5113, 16935171}, {5114, 16935427}, {5115, 16935683}, {5116, 16935939},
{5117, 16936195}, {5118, 2}, {5120, 1}, {5760, 2},
{5761, 1}, {5789, 2}, {5792, 1}, {5881, 2},
{5888, 1}, {5910, 2}, {5919, 1}, {5943, 2},
{5952, 1}, {5972, 2}, {5984, 1}, {5997, 2},
{5998, 1}, {6001, 2}, {6002, 1}, {6004, 2},
{6016, 1}, {6068, 2}, {6070, 1}, {6110, 2},
{6112, 1}, {6122, 2}, {6128, 1}, {6138, 2},
{6144, 1}, {6150, 2}, {6151, 1}, {6155, 0},
{6158, 2}, {6159, 0}, {6160, 1}, {6170, 2},
{6176, 1}, {6265, 2}, {6272, 1}, {6315, 2},
{6320, 1}, {6390, 2}, {6400, 1}, {6431, 2},
{6432, 1}, {6444, 2}, {6448, 1}, {6460, 2},
{6464, 1}, {6465, 2}, {6468, 1}, {6510, 2},
{6512, 1}, {6517, 2}, {6528, 1}, {6572, 2},
{6576, 1}, {6602, 2}, {6608, 1}, {6619, 2},
{6622, 1}, {6684, 2}, {6686, 1}, {6751, 2},
{6752, 1}, {6781, 2}, {6783, 1}, {6794, 2},
{6800, 1}, {6810, 2}, {6816, 1}, {6830, 2},
{6832, 1}, {6863, 2}, {6912, 1}, {6989, 2},
{6992, 1}, {7039, 2}, {7040, 1}, {7156, 2},
{7164, 1}, {7224, 2}, {7227, 1}, {7242, 2},
{7245, 1}, {7296, 16867075}, {7297, 16867587}, {7298, 16870147},
{7299, 16870915}, {7300, 16871171}, {7302, 16873219}, {7303, 16875011},
{7304, 16936451}, {7305, 2}, {7312, 16936707}, {7313, 16936963},
{7314, 16937219}, {7315, 16937475}, {7316, 16937731}, {7317, 16937987},
{7318, 16938243}, {7319, 16938499}, {7320, 16938755}, {7321, 16939011},
{7322, 16939267}, {7323, 16939523}, {7324, 16934659}, {7325, 16939779},
{7326, 16940035}, {7327, 16940291}, {7328, 16940547}, {7329, 16940803},
{7330, 16941059}, {7331, 16941315}, {7332, 16941571}, {7333, 16941827},
{7334, 16942083}, {7335, 16942339}, {7336, 16942595}, {7337, 16942851},
{7338, 16943107}, {7339, 16943363}, {7340, 16943619}, {7341, 16943875},
{7342, 16944131}, {7343, 16944387}, {7344, 16944643}, {7345, 16944899},
{7346, 16945155}, {7347, 16945411}, {7348, 16945667}, {7349, 16945923},
{7350, 16946179}, {7351, 16946435}, {7352, 16946691}, {7353, 16946947},
{7354, 16947203}, {7355, 2}, {7357, 16947459}, {7358, 16947715},
{7359, 16947971}, {7360, 1}, {7368, 2}, {7376, 1},
{7419, 2}, {7424, 1}, {7468, 16777219}, {7469, 16791043},
{7470, 16777475}, {7471, 1}, {7472, 16777987}, {7473, 16778243},
{7474, 16816131}, {7475, 16778755}, {7476, 16779011}, {7477, 16779267},
{7478, 16779523}, {7479, 16779779}, {7480, 16780035}, {7481, 16780291},
{7482, 16780547}, {7483, 1}, {7484, 16780803}, {7485, 16835843},
{7486, 16781059}, {7487, 16781571}, {7488, 16782083}, {7489, 16782339},
{7490, 16782851}, {7491, 16777219}, {7492, 16948227}, {7493, 16948483},
{7494, 16948739}, {7495, 16777475}, {7496, 16777987}, {7497, 16778243},
{7498, 16816387}, {7499, 16816643}, {7500, 16948995}, {7501, 16778755},
{7502, 1}, {7503, 16779779}, {7504, 16780291}, {7505, 16807171},
{7506, 16780803}, {7507, 16814851}, {7508, 16949251}, {7509, 16949507},
{7510, 16781059}, {7511, 16782083}, {7512, 16782339}, {7513, 16949763},
{7514, 16818435}, {7515, 16782595}, {7516, 16950019}, {7517, 16851971},
{7518, 16852227}, {7519, 16852483}, {7520, 16856323}, {7521, 16856579},
{7522, 16779267}, {7523, 16781571}, {7524, 16782339}, {7525, 16782595},
{7526, 16851971}, {7527, 16852227}, {7528, 16855299}, {7529, 16856323},
{7530, 16856579}, {7531, 1}, {7544, 16869891}, {7545, 1},
{7579, 16950275}, {7580, 16777731}, {7581, 16950531}, {7582, 16793603},
{7583, 16948995}, {7584, 16778499}, {7585, 16950787}, {7586, 16951043},
{7587, 16951299}, {7588, 16817923}, {7589, 16817667}, {7590, 16951555},
{7591, 16951811}, {7592, 16952067}, {7593, 16952323}, {7594, 16952579},
{7595, 16952835}, {7596, 16953091}, {7597, 16953347}, {7598, 16818691},
{7599, 16953603}, {7600, 16953859}, {7601, 16818947}, {7602, 16954115},
{7603, 16954371}, {7604, 16820483}, {7605, 16954627}, {7606, 16839683},
{7607, 16821507}, {7608, 16954883}, {7609, 16821763}, {7610, 16839939},
{7611, 16783619}, {7612, 16955139}, {7613, 16955395}, {7614, 16822531},
{7615, 16853507}, {7616, 1}, {7680, 16955651}, {7681, 1},
{7682, 16955907}, {7683, 1}, {7684, 16956163}, {7685, 1},
{7686, 16956419}, {7687, 1}, {7688, 16956675}, {7689, 1},
{7690, 16956931}, {7691, 1}, {7692, 16957187}, {7693, 1},
{7694, 16957443}, {7695, 1}, {7696, 16957699}, {7697, 1},
{7698, 16957955}, {7699, 1}, {7700, 16958211}, {7701, 1},
{7702, 16958467}, {7703, 1}, {7704, 16958723}, {7705, 1},
{7706, 16958979}, {7707, 1}, {7708, 16959235}, {7709, 1},
{7710, 16959491}, {7711, 1}, {7712, 16959747}, {7713, 1},
{7714, 16960003}, {7715, 1}, {7716, 16960259}, {7717, 1},
{7718, 16960515}, {7719, 1}, {7720, 16960771}, {7721, 1},
{7722, 16961027}, {7723, 1}, {7724, 16961283}, {7725, 1},
{7726, 16961539}, {7727, 1}, {7728, 16961795}, {7729, 1},
{7730, 16962051}, {7731, 1}, {7732, 16962307}, {7733, 1},
{7734, 16962563}, {7735, 1}, {7736, 16962819}, {7737, 1},
{7738, 16963075}, {7739, 1}, {7740, 16963331}, {7741, 1},
{7742, 16963587}, {7743, 1}, {7744, 16963843}, {7745, 1},
{7746, 16964099}, {7747, 1}, {7748, 16964355}, {7749, 1},
{7750, 16964611}, {7751, 1}, {7752, 16964867}, {7753, 1},
{7754, 16965123}, {7755, 1}, {7756, 16965379}, {7757, 1},
{7758, 16965635}, {7759, 1}, {7760, 16965891}, {7761, 1},
{7762, 16966147}, {7763, 1}, {7764, 16966403}, {7765, 1},
{7766, 16966659}, {7767, 1}, {7768, 16966915}, {7769, 1},
{7770, 16967171}, {7771, 1}, {7772, 16967427}, {7773, 1},
{7774, 16967683}, {7775, 1}, {7776, 16967939}, {7777, 1},
{7778, 16968195}, {7779, 1}, {7780, 16968451}, {7781, 1},
{7782, 16968707}, {7783, 1}, {7784, 16968963}, {7785, 1},
{7786, 16969219}, {7787, 1}, {7788, 16969475}, {7789, 1},