From a2e51b1be94a528f28ad6958746938d564dd5e58 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sun, 16 Jun 2024 11:23:33 +0800 Subject: [PATCH] refactor: constants of ShortCode tiny codec --- src/core/short_code/internal/convert.cc | 19 +- src/core/short_code/internal/offset/basic.h | 536 ------------------ .../internal/offset/constant/offset.inc | 512 +++++++++++++++++ .../{range_prefix => constant}/offset_0x0.inc | 0 .../{range_prefix => constant}/offset_0x1.inc | 0 .../{range_prefix => constant}/offset_0x2.inc | 0 .../{range_prefix => constant}/offset_0x4.inc | 0 .../{range_prefix => constant}/offset_0x5.inc | 0 .../{range_prefix => constant}/offset_0x6.inc | 0 .../{range_prefix => constant}/offset_0x8.inc | 0 .../{range_prefix => constant}/offset_0x9.inc | 0 .../{range_prefix => constant}/offset_0xA.inc | 0 .../{range_prefix => constant}/offset_0xC.inc | 0 .../{range_prefix => constant}/offset_0xD.inc | 0 .../{range_prefix => constant}/offset_0xE.inc | 0 src/core/short_code/internal/offset/offset.h | 68 +++ .../short_code/internal/offset/range_prefix.h | 47 -- 17 files changed, 589 insertions(+), 593 deletions(-) delete mode 100644 src/core/short_code/internal/offset/basic.h create mode 100644 src/core/short_code/internal/offset/constant/offset.inc rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x0.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x1.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x2.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x4.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x5.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x6.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x8.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0x9.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0xA.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0xC.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0xD.inc (100%) rename src/core/short_code/internal/offset/{range_prefix => constant}/offset_0xE.inc (100%) create mode 100644 src/core/short_code/internal/offset/offset.h delete mode 100644 src/core/short_code/internal/offset/range_prefix.h diff --git a/src/core/short_code/internal/convert.cc b/src/core/short_code/internal/convert.cc index 01dbbac..428ed21 100644 --- a/src/core/short_code/internal/convert.cc +++ b/src/core/short_code/internal/convert.cc @@ -1,16 +1,15 @@ #include -#include "offset/basic.h" -#include "offset/range_prefix.h" +#include "offset/offset.h" #include "short_code/short_code.h" using klotski::cases::AllCases; using klotski::codec::ShortCode; using klotski::cases::BasicRanges; -using klotski::codec::offset::ALL_CASES_OFFSET; -using klotski::codec::offset::BASIC_RANGES_OFFSET; -using klotski::codec::offset::RANGE_PREFIX_OFFSET; +using klotski::cases::ALL_CASES_OFFSET; +using klotski::codec::RANGES_GLOBAL_OFFSET; +using klotski::codec::RANGES_SUBSET_OFFSET; /// FIXME: temporarily used to implement tidy conversion static uint32_t check_range(uint32_t head, uint32_t range) noexcept { @@ -69,7 +68,7 @@ uint32_t ShortCode::tiny_encode(uint64_t common_code) { uint32_t prefix = (common_code >> 20) & 0xFFF; uint32_t offset = 0; - auto index = BASIC_RANGES_OFFSET[prefix]; + auto index = RANGES_GLOBAL_OFFSET[prefix]; const auto &basic_ranges = BasicRanges::instance().fetch(); auto target = (uint32_t)common_code; // target range for (; index < basic_ranges.size(); ++index) { @@ -86,7 +85,7 @@ uint32_t ShortCode::tiny_encode(uint64_t common_code) { --index; } } - return ALL_CASES_OFFSET[head] + RANGE_PREFIX_OFFSET[head][prefix] + offset; + return ALL_CASES_OFFSET[head] + RANGES_SUBSET_OFFSET[head][prefix] + offset; } uint64_t ShortCode::tiny_decode(uint32_t short_code) { // short code --> common code @@ -94,12 +93,12 @@ uint64_t ShortCode::tiny_decode(uint32_t short_code) { // short code --> common auto head = offset_ - ALL_CASES_OFFSET.begin(); // head index short_code -= *offset_; - auto offset = std::upper_bound(RANGE_PREFIX_OFFSET[head], RANGE_PREFIX_OFFSET[head] + 4096, short_code) - 1; - auto prefix = offset - RANGE_PREFIX_OFFSET[head]; // range prefix + auto offset = std::upper_bound(RANGES_SUBSET_OFFSET[head].begin(), RANGES_SUBSET_OFFSET[head].end(), short_code) - 1; + auto prefix = offset - RANGES_SUBSET_OFFSET[head].begin(); // range prefix short_code -= *offset; /// search for target range - auto index = BASIC_RANGES_OFFSET[prefix]; + auto index = RANGES_GLOBAL_OFFSET[prefix]; const auto &basic_ranges = BasicRanges::instance().fetch(); for (; index < basic_ranges.size(); ++index) { // traverse basic ranges auto broken_offset = check_range(head, range_reverse(basic_ranges[index])); diff --git a/src/core/short_code/internal/offset/basic.h b/src/core/short_code/internal/offset/basic.h deleted file mode 100644 index fba769f..0000000 --- a/src/core/short_code/internal/offset/basic.h +++ /dev/null @@ -1,536 +0,0 @@ -#pragma once - -#include - -#include "utils/utility.h" -#include "all_cases/all_cases.h" - -namespace klotski::codec::offset { - -/// This is the head index, the offset [0, 29334498) in all cases is obtained -/// according to the `head` (0 ~ 15). In other words, the short code range can -/// be obtained according to the position of the 2x2 block. - -constexpr auto ALL_CASES_OFFSET = to_offset(cases::ALL_CASES_NUM); - -/// This is the index for basic ranges, and its position (0 ~ 7311884) in all -/// basic ranges is located according to the first 12-bit (0 ~ 4095) within the -/// 32-bit `range`. - -// TODO: using std::array -constexpr uint32_t BASIC_RANGES_OFFSET[4096] { - 0, 18272, 24960, 31648, 49920, 56608, 59056, 61504, - 68192, 74880, 77328, 79776, 86464, 104736, 111424, 118112, - 136384, 143072, 145520, 147968, 154656, 157104, 158000, 158896, - 161344, 163792, 164688, 165584, 168032, 174720, 177168, 179616, - 186304, 192992, 195440, 197888, 204576, 207024, 207920, 208816, - 211264, 213712, 214608, 215504, 217952, 224640, 227088, 229536, - 236224, 254496, 261184, 267872, 286144, 292832, 295280, 297728, - 304416, 311104, 313552, 316000, 322688, 340960, 347648, 354336, - 372608, 379296, 381744, 384192, 390880, 393328, 394224, 395120, - 397568, 400016, 400912, 401808, 404256, 410944, 413392, 415840, - 422528, 424976, 425872, 426768, 429216, 430112, 430440, 430768, - 431664, 432560, 432888, 433216, 434112, 436560, 437456, 438352, - 440800, 443248, 444144, 445040, 447488, 448384, 448712, 449040, - 449936, 450832, 451160, 451488, 452384, 454832, 455728, 456624, - 459072, 465760, 468208, 470656, 477344, 479792, 480688, 481584, - 484032, 486480, 487376, 488272, 490720, 497408, 499856, 502304, - 508992, 515680, 518128, 520576, 527264, 529712, 530608, 531504, - 533952, 536400, 537296, 538192, 540640, 547328, 549776, 552224, - 558912, 561360, 562256, 563152, 565600, 566496, 566824, 567152, - 568048, 568944, 569272, 569600, 570496, 572944, 573840, 574736, - 577184, 579632, 580528, 581424, 583872, 584768, 585096, 585424, - 586320, 587216, 587544, 587871, 588767, 591215, 592111, 593007, - 595455, 602143, 604591, 607039, 613727, 616175, 617071, 617967, - 620415, 622863, 623759, 624655, 627103, 633791, 636239, 638687, - 645375, 663647, 670335, 677023, 695295, 701983, 704431, 706879, - 713567, 720255, 722703, 725151, 731839, 750111, 756799, 763487, - 781759, 788447, 790895, 793343, 800031, 802479, 803375, 804271, - 806719, 809167, 810063, 810959, 813407, 820095, 822543, 824991, - 831679, 838367, 840815, 843263, 849951, 852399, 853295, 854191, - 856639, 859087, 859983, 860879, 863327, 870015, 872463, 874911, - 881599, 899871, 906559, 913247, 931519, 938207, 940655, 943103, - 949791, 956479, 958927, 961375, 968063, 986335, 993023, 999711, - 1017983, 1024671, 1027119, 1029567, 1036255, 1038703, 1039599, 1040495, - 1042943, 1045391, 1046287, 1047183, 1049631, 1056319, 1058767, 1061215, - 1067903, 1070351, 1071247, 1072143, 1074591, 1075487, 1075815, 1076143, - 1077039, 1077935, 1078263, 1078591, 1079487, 1081935, 1082831, 1083727, - 1086175, 1088623, 1089519, 1090415, 1092863, 1093759, 1094087, 1094415, - 1095311, 1096207, 1096535, 1096863, 1097759, 1100207, 1101103, 1101999, - 1104447, 1111135, 1113583, 1116031, 1122719, 1125167, 1126063, 1126959, - 1129407, 1131855, 1132751, 1133647, 1136095, 1142783, 1145231, 1147679, - 1154367, 1156815, 1157711, 1158607, 1161055, 1161951, 1162279, 1162607, - 1163503, 1164399, 1164727, 1165055, 1165951, 1168399, 1169295, 1170191, - 1172639, 1173535, 1173863, 1174191, 1175087, 1175415, 1175514, 1175613, - 1175898, 1176226, 1176325, 1176424, 1176709, 1177605, 1177890, 1178175, - 1178986, 1179882, 1180210, 1180538, 1181434, 1181762, 1181861, 1181960, - 1182245, 1182573, 1182672, 1182771, 1183056, 1183952, 1184237, 1184522, - 1185333, 1187781, 1188677, 1189573, 1192021, 1192917, 1193202, 1193487, - 1194298, 1195194, 1195479, 1195764, 1196575, 1199023, 1199834, 1200645, - 1202922, 1205370, 1206266, 1207162, 1209610, 1210506, 1210834, 1211162, - 1212058, 1212954, 1213282, 1213610, 1214506, 1216954, 1217850, 1218746, - 1221194, 1222090, 1222418, 1222746, 1223642, 1223970, 1224069, 1224168, - 1224453, 1224781, 1224880, 1224979, 1225264, 1226160, 1226445, 1226730, - 1227541, 1228437, 1228765, 1229093, 1229989, 1230317, 1230416, 1230515, - 1230800, 1231128, 1231227, 1231326, 1231611, 1232507, 1232792, 1233077, - 1233888, 1236336, 1237232, 1238128, 1240576, 1241472, 1241757, 1242042, - 1242853, 1243749, 1244034, 1244319, 1245130, 1247578, 1248389, 1249200, - 1251477, 1258165, 1260613, 1263061, 1269749, 1272197, 1273093, 1273989, - 1276437, 1278885, 1279781, 1280677, 1283125, 1289813, 1292261, 1294709, - 1301397, 1303845, 1304741, 1305637, 1308085, 1308981, 1309266, 1309551, - 1310362, 1311258, 1311543, 1311828, 1312639, 1315087, 1315898, 1316709, - 1318986, 1321434, 1322330, 1323226, 1325674, 1326570, 1326855, 1327140, - 1327951, 1328847, 1329132, 1329417, 1330228, 1332676, 1333487, 1334298, - 1336575, 1343263, 1345711, 1348159, 1354847, 1357295, 1358106, 1358917, - 1361194, 1363642, 1364453, 1365264, 1367541, 1374229, 1376506, 1378783, - 1385130, 1391818, 1394266, 1396714, 1403402, 1405850, 1406746, 1407642, - 1410090, 1412538, 1413434, 1414330, 1416778, 1423466, 1425914, 1428362, - 1435050, 1437498, 1438394, 1439290, 1441738, 1442634, 1442962, 1443290, - 1444186, 1445082, 1445410, 1445738, 1446634, 1449082, 1449978, 1450874, - 1453322, 1455770, 1456666, 1457562, 1460010, 1460906, 1461234, 1461562, - 1462458, 1463354, 1463682, 1464009, 1464905, 1467353, 1468249, 1469145, - 1471593, 1478281, 1480729, 1483177, 1489865, 1492313, 1493209, 1494105, - 1496553, 1499001, 1499897, 1500793, 1503241, 1509929, 1512377, 1514825, - 1521513, 1523961, 1524857, 1525753, 1528201, 1529097, 1529425, 1529753, - 1530649, 1531545, 1531873, 1532201, 1533097, 1535545, 1536441, 1537337, - 1539785, 1540681, 1541009, 1541337, 1542233, 1542561, 1542660, 1542759, - 1543044, 1543372, 1543471, 1543570, 1543855, 1544751, 1545036, 1545321, - 1546132, 1547028, 1547356, 1547684, 1548580, 1548908, 1549007, 1549106, - 1549391, 1549719, 1549818, 1549917, 1550202, 1551098, 1551383, 1551668, - 1552479, 1554927, 1555823, 1556719, 1559167, 1560063, 1560348, 1560633, - 1561444, 1562340, 1562625, 1562910, 1563721, 1566169, 1566980, 1567791, - 1570068, 1572516, 1573412, 1574308, 1576756, 1577652, 1577980, 1578308, - 1579204, 1580100, 1580428, 1580755, 1581651, 1584099, 1584995, 1585891, - 1588339, 1589235, 1589563, 1589891, 1590787, 1591115, 1591214, 1591313, - 1591598, 1591926, 1592025, 1592124, 1592409, 1593305, 1593590, 1593875, - 1594686, 1595582, 1595910, 1596237, 1597133, 1597461, 1597560, 1597659, - 1597944, 1598271, 1598370, 1598466, 1598751, 1599647, 1599932, 1600217, - 1601028, 1603476, 1604372, 1605268, 1607716, 1608612, 1608897, 1609182, - 1609993, 1610889, 1611174, 1611459, 1612270, 1614718, 1615529, 1616340, - 1618617, 1625305, 1627753, 1630201, 1636889, 1639337, 1640233, 1641129, - 1643577, 1646025, 1646921, 1647817, 1650265, 1656953, 1659401, 1661849, - 1668537, 1670985, 1671881, 1672777, 1675225, 1676121, 1676406, 1676691, - 1677502, 1678398, 1678683, 1678968, 1679779, 1682227, 1683038, 1683849, - 1686126, 1688574, 1689470, 1690366, 1692814, 1693710, 1693995, 1694280, - 1695091, 1695987, 1696272, 1696557, 1697368, 1699816, 1700627, 1701438, - 1703715, 1710403, 1712851, 1715299, 1721987, 1724435, 1725246, 1726057, - 1728334, 1730782, 1731593, 1732404, 1734681, 1741369, 1743646, 1745923, - 1752270, 1770542, 1777230, 1783918, 1802190, 1808878, 1811326, 1813774, - 1820462, 1827150, 1829598, 1832046, 1838734, 1857006, 1863694, 1870382, - 1888654, 1895342, 1897790, 1900238, 1906926, 1909374, 1910270, 1911166, - 1913614, 1916062, 1916958, 1917854, 1920302, 1926990, 1929438, 1931886, - 1938574, 1945262, 1947710, 1950158, 1956846, 1959294, 1960190, 1961086, - 1963534, 1965982, 1966878, 1967774, 1970222, 1976910, 1979358, 1981806, - 1988494, 2006766, 2013454, 2020142, 2038414, 2045102, 2047550, 2049998, - 2056686, 2063374, 2065822, 2068270, 2074958, 2093230, 2099918, 2106606, - 2124878, 2131566, 2134014, 2136462, 2143150, 2145598, 2146494, 2147390, - 2149838, 2152286, 2153182, 2154078, 2156526, 2163214, 2165662, 2168110, - 2174798, 2177246, 2178142, 2179038, 2181486, 2182382, 2182667, 2182952, - 2183763, 2184659, 2184944, 2185229, 2186040, 2188488, 2189299, 2190110, - 2192387, 2194835, 2195731, 2196627, 2199075, 2199971, 2200256, 2200541, - 2201352, 2202248, 2202533, 2202818, 2203629, 2206077, 2206888, 2207699, - 2209976, 2216664, 2219112, 2221560, 2228248, 2230696, 2231507, 2232318, - 2234595, 2237043, 2237854, 2238665, 2240942, 2247630, 2249907, 2252184, - 2258531, 2265219, 2267667, 2270115, 2276803, 2279251, 2280147, 2281043, - 2283491, 2285939, 2286835, 2287731, 2290179, 2296867, 2299315, 2301763, - 2308451, 2310899, 2311795, 2312691, 2315139, 2316035, 2316320, 2316605, - 2317416, 2318312, 2318597, 2318882, 2319693, 2322141, 2322952, 2323763, - 2326040, 2328488, 2329384, 2330280, 2332728, 2333624, 2333909, 2334194, - 2335005, 2335901, 2336186, 2336471, 2337282, 2339730, 2340541, 2341352, - 2343629, 2350317, 2352765, 2355213, 2361901, 2364349, 2365160, 2365971, - 2368248, 2370696, 2371507, 2372318, 2374595, 2381283, 2383560, 2385837, - 2392184, 2410456, 2417144, 2423832, 2442104, 2448792, 2451240, 2453688, - 2460376, 2467064, 2469512, 2471960, 2478648, 2496920, 2503608, 2510296, - 2528568, 2535256, 2537704, 2540152, 2546840, 2549288, 2550099, 2550910, - 2553187, 2555635, 2556446, 2557257, 2559534, 2566222, 2568499, 2570776, - 2577123, 2583811, 2586259, 2588707, 2595395, 2597843, 2598654, 2599465, - 2601742, 2604190, 2605001, 2605812, 2608089, 2614777, 2617054, 2619331, - 2625678, 2643950, 2650638, 2657326, 2675598, 2682286, 2684563, 2686840, - 2693187, 2699875, 2702152, 2704429, 2710776, 2729048, 2735395, 2741742, - 2759331, 2766019, 2768467, 2770915, 2777603, 2780051, 2780947, 2781843, - 2784291, 2786739, 2787635, 2788531, 2790979, 2797667, 2800115, 2802563, - 2809251, 2811699, 2812595, 2813491, 2815939, 2816835, 2817163, 2817491, - 2818387, 2819283, 2819611, 2819939, 2820835, 2823283, 2824179, 2825075, - 2827523, 2829971, 2830867, 2831763, 2834211, 2835107, 2835435, 2835763, - 2836659, 2837555, 2837883, 2838211, 2839107, 2841555, 2842451, 2843347, - 2845795, 2852483, 2854931, 2857379, 2864067, 2866515, 2867411, 2868307, - 2870755, 2873203, 2874099, 2874995, 2877443, 2884131, 2886579, 2889027, - 2895715, 2898163, 2899059, 2899955, 2902403, 2903299, 2903627, 2903955, - 2904851, 2905747, 2906075, 2906403, 2907299, 2909747, 2910643, 2911539, - 2913987, 2914883, 2915211, 2915539, 2916435, 2916763, 2916862, 2916961, - 2917246, 2917574, 2917673, 2917772, 2918057, 2918953, 2919238, 2919523, - 2920334, 2921230, 2921558, 2921886, 2922782, 2923110, 2923209, 2923308, - 2923593, 2923921, 2924020, 2924119, 2924404, 2925300, 2925585, 2925870, - 2926681, 2929129, 2930025, 2930921, 2933369, 2934265, 2934550, 2934835, - 2935646, 2936542, 2936827, 2937112, 2937923, 2940371, 2941182, 2941993, - 2944270, 2946718, 2947614, 2948510, 2950958, 2951854, 2952182, 2952510, - 2953406, 2954302, 2954630, 2954958, 2955854, 2958302, 2959198, 2960094, - 2962542, 2963438, 2963766, 2964094, 2964990, 2965318, 2965417, 2965516, - 2965801, 2966129, 2966228, 2966327, 2966612, 2967508, 2967793, 2968078, - 2968889, 2969785, 2970113, 2970441, 2971337, 2971665, 2971764, 2971863, - 2972148, 2972476, 2972575, 2972674, 2972959, 2973855, 2974140, 2974425, - 2975236, 2977684, 2978580, 2979476, 2981924, 2982820, 2983105, 2983390, - 2984201, 2985097, 2985382, 2985667, 2986478, 2988926, 2989737, 2990548, - 2992825, 2999513, 3001961, 3004409, 3011097, 3013545, 3014441, 3015337, - 3017785, 3020233, 3021129, 3022025, 3024473, 3031161, 3033609, 3036057, - 3042745, 3045193, 3046089, 3046985, 3049433, 3050329, 3050614, 3050899, - 3051710, 3052606, 3052891, 3053176, 3053987, 3056435, 3057246, 3058057, - 3060334, 3062782, 3063678, 3064574, 3067022, 3067918, 3068203, 3068488, - 3069299, 3070195, 3070480, 3070765, 3071576, 3074024, 3074835, 3075646, - 3077923, 3084611, 3087059, 3089507, 3096195, 3098643, 3099454, 3100265, - 3102542, 3104990, 3105801, 3106612, 3108889, 3115577, 3117854, 3120131, - 3126478, 3128926, 3129822, 3130718, 3133166, 3134062, 3134390, 3134718, - 3135614, 3136510, 3136838, 3137166, 3138062, 3140510, 3141406, 3142302, - 3144750, 3145646, 3145974, 3146302, 3147198, 3147526, 3147625, 3147724, - 3148009, 3148337, 3148436, 3148535, 3148820, 3149716, 3150001, 3150286, - 3151097, 3151993, 3152321, 3152649, 3153545, 3153873, 3153972, 3154071, - 3154356, 3154684, 3154783, 3154882, 3155167, 3156063, 3156348, 3156633, - 3157444, 3159892, 3160788, 3161684, 3164132, 3165028, 3165313, 3165598, - 3166409, 3167305, 3167590, 3167875, 3168686, 3171134, 3171945, 3172756, - 3175033, 3175929, 3176257, 3176585, 3177481, 3177809, 3177908, 3178007, - 3178292, 3178620, 3178719, 3178818, 3179103, 3179999, 3180284, 3180569, - 3181380, 3181708, 3181807, 3181906, 3182191, 3182290, 3182307, 3182324, - 3182382, 3182481, 3182498, 3182515, 3182573, 3182858, 3182916, 3182974, - 3183165, 3183493, 3183592, 3183691, 3183976, 3184075, 3184092, 3184109, - 3184167, 3184266, 3184283, 3184300, 3184358, 3184643, 3184701, 3184759, - 3184950, 3185846, 3186131, 3186416, 3187227, 3187512, 3187570, 3187628, - 3187819, 3188104, 3188162, 3188220, 3188411, 3189222, 3189413, 3189604, - 3190196, 3191092, 3191420, 3191748, 3192644, 3192972, 3193071, 3193170, - 3193455, 3193783, 3193882, 3193981, 3194266, 3195162, 3195447, 3195732, - 3196543, 3196871, 3196970, 3197069, 3197354, 3197453, 3197470, 3197487, - 3197545, 3197644, 3197661, 3197678, 3197736, 3198021, 3198079, 3198137, - 3198328, 3198656, 3198755, 3198854, 3199139, 3199238, 3199255, 3199272, - 3199330, 3199429, 3199446, 3199463, 3199521, 3199806, 3199864, 3199922, - 3200113, 3201009, 3201294, 3201579, 3202390, 3202675, 3202733, 3202791, - 3202982, 3203267, 3203325, 3203383, 3203574, 3204385, 3204576, 3204767, - 3205359, 3207807, 3208703, 3209599, 3212047, 3212943, 3213228, 3213513, - 3214324, 3215220, 3215505, 3215790, 3216601, 3219049, 3219860, 3220671, - 3222948, 3223844, 3224129, 3224414, 3225225, 3225510, 3225568, 3225626, - 3225817, 3226102, 3226160, 3226218, 3226409, 3227220, 3227411, 3227602, - 3228194, 3229090, 3229375, 3229660, 3230471, 3230756, 3230814, 3230872, - 3231063, 3231348, 3231406, 3231464, 3231655, 3232466, 3232657, 3232848, - 3233440, 3235888, 3236699, 3237510, 3239787, 3240598, 3240789, 3240980, - 3241572, 3242383, 3242574, 3242765, 3243357, 3245634, 3246226, 3246818, - 3248603, 3251051, 3251947, 3252843, 3255291, 3256187, 3256515, 3256843, - 3257739, 3258635, 3258963, 3259291, 3260187, 3262635, 3263531, 3264427, - 3266875, 3267771, 3268099, 3268427, 3269323, 3269651, 3269750, 3269849, - 3270134, 3270462, 3270561, 3270660, 3270945, 3271841, 3272126, 3272411, - 3273222, 3274118, 3274446, 3274774, 3275670, 3275998, 3276097, 3276196, - 3276481, 3276809, 3276908, 3277007, 3277292, 3278188, 3278473, 3278758, - 3279569, 3282017, 3282913, 3283809, 3286257, 3287153, 3287438, 3287723, - 3288534, 3289430, 3289715, 3290000, 3290811, 3293259, 3294070, 3294881, - 3297158, 3298054, 3298382, 3298710, 3299606, 3299934, 3300033, 3300132, - 3300417, 3300745, 3300844, 3300943, 3301228, 3302124, 3302409, 3302694, - 3303505, 3303833, 3303932, 3304031, 3304316, 3304415, 3304432, 3304449, - 3304507, 3304606, 3304623, 3304640, 3304698, 3304983, 3305041, 3305099, - 3305290, 3305618, 3305717, 3305816, 3306101, 3306200, 3306217, 3306234, - 3306292, 3306391, 3306408, 3306425, 3306483, 3306768, 3306826, 3306884, - 3307075, 3307971, 3308256, 3308541, 3309352, 3309637, 3309695, 3309753, - 3309944, 3310229, 3310287, 3310345, 3310536, 3311347, 3311538, 3311729, - 3312321, 3313217, 3313545, 3313873, 3314769, 3315097, 3315196, 3315295, - 3315580, 3315908, 3316007, 3316106, 3316391, 3317287, 3317572, 3317857, - 3318668, 3318996, 3319095, 3319194, 3319479, 3319578, 3319595, 3319612, - 3319670, 3319769, 3319786, 3319803, 3319861, 3320146, 3320204, 3320262, - 3320453, 3320781, 3320880, 3320979, 3321264, 3321363, 3321380, 3321397, - 3321455, 3321554, 3321571, 3321588, 3321646, 3321931, 3321989, 3322047, - 3322238, 3323134, 3323419, 3323704, 3324515, 3324800, 3324858, 3324916, - 3325107, 3325392, 3325450, 3325508, 3325699, 3326510, 3326701, 3326892, - 3327484, 3329932, 3330828, 3331724, 3334172, 3335068, 3335353, 3335638, - 3336449, 3337345, 3337630, 3337915, 3338726, 3341174, 3341985, 3342796, - 3345073, 3345969, 3346254, 3346539, 3347350, 3347635, 3347693, 3347751, - 3347942, 3348227, 3348285, 3348343, 3348534, 3349345, 3349536, 3349727, - 3350319, 3351215, 3351500, 3351785, 3352596, 3352881, 3352939, 3352997, - 3353188, 3353473, 3353531, 3353589, 3353780, 3354591, 3354782, 3354973, - 3355565, 3358013, 3358824, 3359635, 3361912, 3362723, 3362914, 3363105, - 3363697, 3364508, 3364699, 3364890, 3365482, 3367759, 3368351, 3368943, - 3370728, 3377416, 3379864, 3382312, 3389000, 3391448, 3392344, 3393240, - 3395688, 3398136, 3399032, 3399928, 3402376, 3409064, 3411512, 3413960, - 3420648, 3423096, 3423992, 3424888, 3427336, 3428232, 3428517, 3428802, - 3429613, 3430509, 3430794, 3431079, 3431890, 3434338, 3435149, 3435960, - 3438237, 3440685, 3441581, 3442477, 3444925, 3445821, 3446106, 3446391, - 3447202, 3448098, 3448383, 3448668, 3449479, 3451927, 3452738, 3453549, - 3455826, 3462514, 3464962, 3467410, 3474098, 3476546, 3477357, 3478168, - 3480445, 3482893, 3483704, 3484515, 3486792, 3493480, 3495757, 3498034, - 3504381, 3506829, 3507725, 3508621, 3511069, 3511965, 3512250, 3512535, - 3513346, 3514242, 3514527, 3514812, 3515623, 3518071, 3518882, 3519693, - 3521970, 3522866, 3523151, 3523436, 3524247, 3524532, 3524590, 3524648, - 3524839, 3525124, 3525182, 3525240, 3525431, 3526242, 3526433, 3526624, - 3527216, 3528112, 3528397, 3528682, 3529493, 3529778, 3529836, 3529894, - 3530085, 3530370, 3530428, 3530486, 3530677, 3531488, 3531679, 3531870, - 3532462, 3534910, 3535721, 3536532, 3538809, 3539620, 3539811, 3540002, - 3540594, 3541405, 3541596, 3541787, 3542379, 3544656, 3545248, 3545840, - 3547625, 3550073, 3550969, 3551865, 3554313, 3555209, 3555494, 3555779, - 3556590, 3557486, 3557771, 3558056, 3558867, 3561315, 3562126, 3562937, - 3565214, 3566110, 3566395, 3566680, 3567491, 3567776, 3567834, 3567892, - 3568083, 3568368, 3568426, 3568484, 3568675, 3569486, 3569677, 3569868, - 3570460, 3571356, 3571641, 3571926, 3572737, 3573022, 3573080, 3573138, - 3573329, 3573614, 3573672, 3573730, 3573921, 3574732, 3574923, 3575114, - 3575706, 3578154, 3578965, 3579776, 3582053, 3582864, 3583055, 3583246, - 3583838, 3584649, 3584840, 3585031, 3585623, 3587900, 3588492, 3589084, - 3590869, 3597557, 3600005, 3602453, 3609141, 3611589, 3612400, 3613211, - 3615488, 3617936, 3618747, 3619558, 3621835, 3628523, 3630800, 3633077, - 3639424, 3641872, 3642683, 3643494, 3645771, 3646582, 3646773, 3646964, - 3647556, 3648367, 3648558, 3648749, 3649341, 3651618, 3652210, 3652802, - 3654587, 3657035, 3657846, 3658657, 3660934, 3661745, 3661936, 3662127, - 3662719, 3663530, 3663721, 3663912, 3664504, 3666781, 3667373, 3667965, - 3669750, 3676438, 3678715, 3680992, 3687339, 3689616, 3690208, 3690800, - 3692585, 3694862, 3695454, 3696046, 3697831, 3704178, 3705963, 3707748, - 3712994, 3719682, 3722130, 3724578, 3731266, 3733714, 3734610, 3735506, - 3737954, 3740402, 3741298, 3742194, 3744642, 3751330, 3753778, 3756226, - 3762914, 3765362, 3766258, 3767154, 3769602, 3770498, 3770826, 3771154, - 3772050, 3772946, 3773274, 3773602, 3774498, 3776946, 3777842, 3778738, - 3781186, 3783634, 3784530, 3785426, 3787874, 3788770, 3789098, 3789426, - 3790322, 3791218, 3791546, 3791873, 3792769, 3795217, 3796113, 3797009, - 3799457, 3806145, 3808593, 3811041, 3817729, 3820177, 3821073, 3821969, - 3824417, 3826865, 3827761, 3828657, 3831105, 3837793, 3840241, 3842689, - 3849377, 3851825, 3852721, 3853617, 3856065, 3856961, 3857289, 3857617, - 3858513, 3859409, 3859737, 3860065, 3860961, 3863409, 3864305, 3865201, - 3867649, 3868545, 3868873, 3869201, 3870097, 3870425, 3870524, 3870623, - 3870908, 3871236, 3871335, 3871434, 3871719, 3872615, 3872900, 3873185, - 3873996, 3874892, 3875220, 3875548, 3876444, 3876772, 3876871, 3876970, - 3877255, 3877583, 3877682, 3877781, 3878066, 3878962, 3879247, 3879532, - 3880343, 3882791, 3883687, 3884583, 3887031, 3887927, 3888212, 3888497, - 3889308, 3890204, 3890489, 3890774, 3891585, 3894033, 3894844, 3895655, - 3897932, 3900380, 3901276, 3902172, 3904620, 3905516, 3905844, 3906172, - 3907068, 3907964, 3908292, 3908619, 3909515, 3911963, 3912859, 3913755, - 3916203, 3917099, 3917427, 3917755, 3918651, 3918979, 3919078, 3919177, - 3919462, 3919790, 3919889, 3919988, 3920273, 3921169, 3921454, 3921739, - 3922550, 3923446, 3923774, 3924101, 3924997, 3925325, 3925424, 3925523, - 3925808, 3926135, 3926234, 3926330, 3926615, 3927511, 3927796, 3928081, - 3928892, 3931340, 3932236, 3933132, 3935580, 3936476, 3936761, 3937046, - 3937857, 3938753, 3939038, 3939323, 3940134, 3942582, 3943393, 3944204, - 3946481, 3953169, 3955617, 3958065, 3964753, 3967201, 3968097, 3968993, - 3971441, 3973889, 3974785, 3975681, 3978129, 3984817, 3987265, 3989713, - 3996401, 3998849, 3999745, 4000641, 4003089, 4003985, 4004270, 4004555, - 4005366, 4006262, 4006547, 4006832, 4007643, 4010091, 4010902, 4011713, - 4013990, 4016438, 4017334, 4018230, 4020678, 4021574, 4021859, 4022144, - 4022955, 4023851, 4024136, 4024421, 4025232, 4027680, 4028491, 4029302, - 4031579, 4038267, 4040715, 4043163, 4049851, 4052299, 4053110, 4053921, - 4056198, 4058646, 4059457, 4060268, 4062545, 4069233, 4071510, 4073787, - 4080134, 4082582, 4083478, 4084374, 4086822, 4087718, 4088046, 4088374, - 4089270, 4090166, 4090494, 4090822, 4091718, 4094166, 4095062, 4095958, - 4098406, 4099302, 4099630, 4099958, 4100854, 4101182, 4101281, 4101380, - 4101665, 4101993, 4102092, 4102191, 4102476, 4103372, 4103657, 4103942, - 4104753, 4105649, 4105977, 4106305, 4107201, 4107529, 4107628, 4107727, - 4108012, 4108340, 4108439, 4108538, 4108823, 4109719, 4110004, 4110289, - 4111100, 4113548, 4114444, 4115340, 4117788, 4118684, 4118969, 4119254, - 4120065, 4120961, 4121246, 4121531, 4122342, 4124790, 4125601, 4126412, - 4128689, 4129585, 4129913, 4130241, 4131137, 4131465, 4131564, 4131663, - 4131948, 4132276, 4132375, 4132474, 4132759, 4133655, 4133940, 4134225, - 4135036, 4135364, 4135463, 4135562, 4135847, 4135946, 4135963, 4135980, - 4136038, 4136137, 4136154, 4136171, 4136229, 4136514, 4136572, 4136630, - 4136821, 4137149, 4137248, 4137347, 4137632, 4137731, 4137748, 4137765, - 4137823, 4137922, 4137939, 4137956, 4138014, 4138299, 4138357, 4138415, - 4138606, 4139502, 4139787, 4140072, 4140883, 4141168, 4141226, 4141284, - 4141475, 4141760, 4141818, 4141876, 4142067, 4142878, 4143069, 4143260, - 4143852, 4144748, 4145076, 4145404, 4146300, 4146628, 4146727, 4146826, - 4147111, 4147439, 4147538, 4147637, 4147922, 4148818, 4149103, 4149388, - 4150199, 4150527, 4150626, 4150725, 4151010, 4151109, 4151126, 4151143, - 4151201, 4151300, 4151317, 4151334, 4151392, 4151677, 4151735, 4151793, - 4151984, 4152312, 4152411, 4152510, 4152795, 4152894, 4152911, 4152928, - 4152986, 4153085, 4153102, 4153119, 4153177, 4153462, 4153520, 4153578, - 4153769, 4154665, 4154950, 4155235, 4156046, 4156331, 4156389, 4156447, - 4156638, 4156923, 4156981, 4157039, 4157230, 4158041, 4158232, 4158423, - 4159015, 4161463, 4162359, 4163255, 4165703, 4166599, 4166884, 4167169, - 4167980, 4168876, 4169161, 4169446, 4170257, 4172705, 4173516, 4174327, - 4176604, 4177500, 4177785, 4178070, 4178881, 4179166, 4179224, 4179282, - 4179473, 4179758, 4179816, 4179874, 4180065, 4180876, 4181067, 4181258, - 4181850, 4182746, 4183031, 4183316, 4184127, 4184412, 4184470, 4184528, - 4184719, 4185004, 4185062, 4185120, 4185311, 4186122, 4186313, 4186504, - 4187096, 4189544, 4190355, 4191166, 4193443, 4194254, 4194445, 4194636, - 4195228, 4196039, 4196230, 4196421, 4197013, 4199290, 4199882, 4200474, - 4202259, 4204707, 4205603, 4206499, 4208947, 4209843, 4210171, 4210499, - 4211395, 4212291, 4212619, 4212946, 4213842, 4216290, 4217186, 4218082, - 4220530, 4221426, 4221754, 4222082, 4222978, 4223306, 4223405, 4223504, - 4223789, 4224117, 4224216, 4224315, 4224600, 4225496, 4225781, 4226066, - 4226877, 4227773, 4228101, 4228428, 4229324, 4229652, 4229751, 4229850, - 4230135, 4230462, 4230561, 4230657, 4230942, 4231838, 4232123, 4232408, - 4233219, 4235667, 4236563, 4237459, 4239907, 4240803, 4241088, 4241373, - 4242184, 4243080, 4243365, 4243650, 4244461, 4246909, 4247720, 4248531, - 4250808, 4251704, 4252032, 4252360, 4253256, 4253584, 4253683, 4253782, - 4254067, 4254395, 4254494, 4254593, 4254878, 4255774, 4256059, 4256344, - 4257155, 4257483, 4257582, 4257681, 4257966, 4258065, 4258082, 4258099, - 4258157, 4258256, 4258273, 4258290, 4258348, 4258633, 4258691, 4258749, - 4258940, 4259268, 4259367, 4259466, 4259751, 4259850, 4259867, 4259884, - 4259942, 4260041, 4260058, 4260075, 4260133, 4260418, 4260476, 4260534, - 4260725, 4261621, 4261906, 4262191, 4263002, 4263287, 4263345, 4263403, - 4263594, 4263879, 4263937, 4263995, 4264186, 4264997, 4265188, 4265379, - 4265971, 4266867, 4267195, 4267522, 4268418, 4268746, 4268845, 4268944, - 4269229, 4269556, 4269655, 4269751, 4270036, 4270932, 4271217, 4271502, - 4272313, 4272641, 4272740, 4272839, 4273124, 4273223, 4273240, 4273257, - 4273315, 4273414, 4273431, 4273448, 4273506, 4273791, 4273849, 4273907, - 4274098, 4274425, 4274524, 4274620, 4274905, 4275004, 4275021, 4275038, - 4275096, 4275192, 4275209, 4275223, 4275281, 4275566, 4275624, 4275682, - 4275873, 4276769, 4277054, 4277339, 4278150, 4278435, 4278493, 4278551, - 4278742, 4279027, 4279085, 4279143, 4279334, 4280145, 4280336, 4280527, - 4281119, 4283567, 4284463, 4285359, 4287807, 4288703, 4288988, 4289273, - 4290084, 4290980, 4291265, 4291550, 4292361, 4294809, 4295620, 4296431, - 4298708, 4299604, 4299889, 4300174, 4300985, 4301270, 4301328, 4301386, - 4301577, 4301862, 4301920, 4301978, 4302169, 4302980, 4303171, 4303362, - 4303954, 4304850, 4305135, 4305420, 4306231, 4306516, 4306574, 4306632, - 4306823, 4307108, 4307166, 4307224, 4307415, 4308226, 4308417, 4308608, - 4309200, 4311648, 4312459, 4313270, 4315547, 4316358, 4316549, 4316740, - 4317332, 4318143, 4318334, 4318525, 4319117, 4321394, 4321986, 4322578, - 4324363, 4331051, 4333499, 4335947, 4342635, 4345083, 4345979, 4346875, - 4349323, 4351771, 4352667, 4353563, 4356011, 4362699, 4365147, 4367595, - 4374283, 4376731, 4377627, 4378523, 4380971, 4381867, 4382152, 4382437, - 4383248, 4384144, 4384429, 4384714, 4385525, 4387973, 4388784, 4389595, - 4391872, 4394320, 4395216, 4396112, 4398560, 4399456, 4399741, 4400026, - 4400837, 4401733, 4402018, 4402303, 4403114, 4405562, 4406373, 4407184, - 4409461, 4416149, 4418597, 4421045, 4427733, 4430181, 4430992, 4431803, - 4434080, 4436528, 4437339, 4438150, 4440427, 4447115, 4449392, 4451669, - 4458016, 4460464, 4461360, 4462256, 4464704, 4465600, 4465885, 4466170, - 4466981, 4467877, 4468162, 4468447, 4469258, 4471706, 4472517, 4473328, - 4475605, 4476501, 4476786, 4477071, 4477882, 4478167, 4478225, 4478283, - 4478474, 4478759, 4478817, 4478875, 4479066, 4479877, 4480068, 4480259, - 4480851, 4481747, 4482032, 4482317, 4483128, 4483413, 4483471, 4483529, - 4483720, 4484005, 4484063, 4484121, 4484312, 4485123, 4485314, 4485505, - 4486097, 4488545, 4489356, 4490167, 4492444, 4493255, 4493446, 4493637, - 4494229, 4495040, 4495231, 4495422, 4496014, 4498291, 4498883, 4499475, - 4501260, 4503708, 4504604, 4505500, 4507948, 4508844, 4509129, 4509414, - 4510225, 4511121, 4511406, 4511691, 4512502, 4514950, 4515761, 4516572, - 4518849, 4519745, 4520030, 4520315, 4521126, 4521411, 4521469, 4521527, - 4521718, 4522003, 4522061, 4522119, 4522310, 4523121, 4523312, 4523503, - 4524095, 4524991, 4525276, 4525561, 4526372, 4526657, 4526715, 4526773, - 4526964, 4527249, 4527307, 4527365, 4527556, 4528367, 4528558, 4528749, - 4529341, 4531789, 4532600, 4533411, 4535688, 4536499, 4536690, 4536881, - 4537473, 4538284, 4538475, 4538666, 4539258, 4541535, 4542127, 4542719, - 4544504, 4551192, 4553640, 4556088, 4562776, 4565224, 4566035, 4566846, - 4569123, 4571571, 4572382, 4573193, 4575470, 4582158, 4584435, 4586712, - 4593059, 4595507, 4596318, 4597129, 4599406, 4600217, 4600408, 4600599, - 4601191, 4602002, 4602193, 4602384, 4602976, 4605253, 4605845, 4606437, - 4608222, 4610670, 4611481, 4612292, 4614569, 4615380, 4615571, 4615762, - 4616354, 4617165, 4617356, 4617547, 4618139, 4620416, 4621008, 4621600, - 4623385, 4630073, 4632350, 4634627, 4640974, 4643251, 4643843, 4644435, - 4646220, 4648497, 4649089, 4649681, 4651466, 4657813, 4659598, 4661383, - 4666629, 4684901, 4691589, 4698277, 4716549, 4723237, 4725685, 4728133, - 4734821, 4741509, 4743957, 4746405, 4753093, 4771365, 4778053, 4784741, - 4803013, 4809701, 4812149, 4814597, 4821285, 4823733, 4824629, 4825525, - 4827973, 4830421, 4831317, 4832213, 4834661, 4841349, 4843797, 4846245, - 4852933, 4859621, 4862069, 4864517, 4871205, 4873653, 4874549, 4875445, - 4877893, 4880341, 4881237, 4882133, 4884581, 4891269, 4893717, 4896165, - 4902853, 4921125, 4927813, 4934501, 4952773, 4959461, 4961909, 4964357, - 4971045, 4977733, 4980181, 4982629, 4989317, 5007589, 5014277, 5020965, - 5039237, 5045925, 5048373, 5050821, 5057509, 5059957, 5060853, 5061749, - 5064197, 5066645, 5067541, 5068437, 5070885, 5077573, 5080021, 5082469, - 5089157, 5091605, 5092501, 5093397, 5095845, 5096741, 5097026, 5097311, - 5098122, 5099018, 5099303, 5099588, 5100399, 5102847, 5103658, 5104469, - 5106746, 5109194, 5110090, 5110986, 5113434, 5114330, 5114615, 5114900, - 5115711, 5116607, 5116892, 5117177, 5117988, 5120436, 5121247, 5122058, - 5124335, 5131023, 5133471, 5135919, 5142607, 5145055, 5145866, 5146677, - 5148954, 5151402, 5152213, 5153024, 5155301, 5161989, 5164266, 5166543, - 5172890, 5179578, 5182026, 5184474, 5191162, 5193610, 5194506, 5195402, - 5197850, 5200298, 5201194, 5202090, 5204538, 5211226, 5213674, 5216122, - 5222810, 5225258, 5226154, 5227050, 5229498, 5230394, 5230679, 5230964, - 5231775, 5232671, 5232956, 5233241, 5234052, 5236500, 5237311, 5238122, - 5240399, 5242847, 5243743, 5244639, 5247087, 5247983, 5248268, 5248553, - 5249364, 5250260, 5250545, 5250830, 5251641, 5254089, 5254900, 5255711, - 5257988, 5264676, 5267124, 5269572, 5276260, 5278708, 5279519, 5280330, - 5282607, 5285055, 5285866, 5286677, 5288954, 5295642, 5297919, 5300196, - 5306543, 5324815, 5331503, 5338191, 5356463, 5363151, 5365599, 5368047, - 5374735, 5381423, 5383871, 5386319, 5393007, 5411279, 5417967, 5424655, - 5442927, 5449615, 5452063, 5454511, 5461199, 5463647, 5464458, 5465269, - 5467546, 5469994, 5470805, 5471616, 5473893, 5480581, 5482858, 5485135, - 5491482, 5498170, 5500618, 5503066, 5509754, 5512202, 5513013, 5513824, - 5516101, 5518549, 5519360, 5520171, 5522448, 5529136, 5531413, 5533690, - 5540037, 5558309, 5564997, 5571685, 5589957, 5596645, 5598922, 5601199, - 5607546, 5614234, 5616511, 5618788, 5625135, 5643407, 5649754, 5656101, - 5673690, 5680378, 5682826, 5685274, 5691962, 5694410, 5695306, 5696202, - 5698650, 5701098, 5701994, 5702890, 5705338, 5712026, 5714474, 5716922, - 5723610, 5726058, 5726954, 5727850, 5730298, 5731194, 5731479, 5731764, - 5732575, 5733471, 5733756, 5734041, 5734852, 5737300, 5738111, 5738922, - 5741199, 5743647, 5744543, 5745439, 5747887, 5748783, 5749068, 5749353, - 5750164, 5751060, 5751345, 5751630, 5752441, 5754889, 5755700, 5756511, - 5758788, 5765476, 5767924, 5770372, 5777060, 5779508, 5780319, 5781130, - 5783407, 5785855, 5786666, 5787477, 5789754, 5796442, 5798719, 5800996, - 5807343, 5809791, 5810687, 5811583, 5814031, 5814927, 5815212, 5815497, - 5816308, 5817204, 5817489, 5817774, 5818585, 5821033, 5821844, 5822655, - 5824932, 5825828, 5826113, 5826398, 5827209, 5827494, 5827552, 5827610, - 5827801, 5828086, 5828144, 5828202, 5828393, 5829204, 5829395, 5829586, - 5830178, 5831074, 5831359, 5831644, 5832455, 5832740, 5832798, 5832856, - 5833047, 5833332, 5833390, 5833448, 5833639, 5834450, 5834641, 5834832, - 5835424, 5837872, 5838683, 5839494, 5841771, 5842582, 5842773, 5842964, - 5843556, 5844367, 5844558, 5844749, 5845341, 5847618, 5848210, 5848802, - 5850587, 5853035, 5853931, 5854827, 5857275, 5858171, 5858456, 5858741, - 5859552, 5860448, 5860733, 5861018, 5861829, 5864277, 5865088, 5865899, - 5868176, 5869072, 5869357, 5869642, 5870453, 5870738, 5870796, 5870854, - 5871045, 5871330, 5871388, 5871446, 5871637, 5872448, 5872639, 5872830, - 5873422, 5874318, 5874603, 5874888, 5875699, 5875984, 5876042, 5876100, - 5876291, 5876576, 5876634, 5876692, 5876883, 5877694, 5877885, 5878076, - 5878668, 5881116, 5881927, 5882738, 5885015, 5885826, 5886017, 5886208, - 5886800, 5887611, 5887802, 5887993, 5888585, 5890862, 5891454, 5892046, - 5893831, 5900519, 5902967, 5905415, 5912103, 5914551, 5915362, 5916173, - 5918450, 5920898, 5921709, 5922520, 5924797, 5931485, 5933762, 5936039, - 5942386, 5944834, 5945645, 5946456, 5948733, 5949544, 5949735, 5949926, - 5950518, 5951329, 5951520, 5951711, 5952303, 5954580, 5955172, 5955764, - 5957549, 5959997, 5960808, 5961619, 5963896, 5964707, 5964898, 5965089, - 5965681, 5966492, 5966683, 5966874, 5967466, 5969743, 5970335, 5970927, - 5972712, 5979400, 5981677, 5983954, 5990301, 5992578, 5993170, 5993762, - 5995547, 5997824, 5998416, 5999008, 6000793, 6007140, 6008925, 6010710, - 6015956, 6022644, 6025092, 6027540, 6034228, 6036676, 6037572, 6038468, - 6040916, 6043364, 6044260, 6045156, 6047604, 6054292, 6056740, 6059188, - 6065876, 6068324, 6069220, 6070116, 6072564, 6073460, 6073745, 6074030, - 6074841, 6075737, 6076022, 6076307, 6077118, 6079566, 6080377, 6081188, - 6083465, 6085913, 6086809, 6087705, 6090153, 6091049, 6091334, 6091619, - 6092430, 6093326, 6093611, 6093896, 6094707, 6097155, 6097966, 6098777, - 6101054, 6107742, 6110190, 6112638, 6119326, 6121774, 6122585, 6123396, - 6125673, 6128121, 6128932, 6129743, 6132020, 6138708, 6140985, 6143262, - 6149609, 6152057, 6152953, 6153849, 6156297, 6157193, 6157478, 6157763, - 6158574, 6159470, 6159755, 6160040, 6160851, 6163299, 6164110, 6164921, - 6167198, 6168094, 6168379, 6168664, 6169475, 6169760, 6169818, 6169876, - 6170067, 6170352, 6170410, 6170468, 6170659, 6171470, 6171661, 6171852, - 6172444, 6173340, 6173625, 6173910, 6174721, 6175006, 6175064, 6175122, - 6175313, 6175598, 6175656, 6175714, 6175905, 6176716, 6176907, 6177098, - 6177690, 6180138, 6180949, 6181760, 6184037, 6184848, 6185039, 6185230, - 6185822, 6186633, 6186824, 6187015, 6187607, 6189884, 6190476, 6191068, - 6192853, 6195301, 6196197, 6197093, 6199541, 6200437, 6200722, 6201007, - 6201818, 6202714, 6202999, 6203284, 6204095, 6206543, 6207354, 6208165, - 6210442, 6211338, 6211623, 6211908, 6212719, 6213004, 6213062, 6213120, - 6213311, 6213596, 6213654, 6213712, 6213903, 6214714, 6214905, 6215096, - 6215688, 6216584, 6216869, 6217154, 6217965, 6218250, 6218308, 6218366, - 6218557, 6218842, 6218900, 6218958, 6219149, 6219960, 6220151, 6220342, - 6220934, 6223382, 6224193, 6225004, 6227281, 6228092, 6228283, 6228474, - 6229066, 6229877, 6230068, 6230259, 6230851, 6233128, 6233720, 6234312, - 6236097, 6242785, 6245233, 6247681, 6254369, 6256817, 6257628, 6258439, - 6260716, 6263164, 6263975, 6264786, 6267063, 6273751, 6276028, 6278305, - 6284652, 6287100, 6287911, 6288722, 6290999, 6291810, 6292001, 6292192, - 6292784, 6293595, 6293786, 6293977, 6294569, 6296846, 6297438, 6298030, - 6299815, 6302263, 6303074, 6303885, 6306162, 6306973, 6307164, 6307355, - 6307947, 6308758, 6308949, 6309140, 6309732, 6312009, 6312601, 6313193, - 6314978, 6321666, 6323943, 6326220, 6332567, 6334844, 6335436, 6336028, - 6337813, 6340090, 6340682, 6341274, 6343059, 6349406, 6351191, 6352976, - 6358222, 6376494, 6383182, 6389870, 6408142, 6414830, 6417278, 6419726, - 6426414, 6433102, 6435550, 6437998, 6444686, 6462958, 6469646, 6476334, - 6494606, 6501294, 6503742, 6506190, 6512878, 6515326, 6516137, 6516948, - 6519225, 6521673, 6522484, 6523295, 6525572, 6532260, 6534537, 6536814, - 6543161, 6549849, 6552297, 6554745, 6561433, 6563881, 6564692, 6565503, - 6567780, 6570228, 6571039, 6571850, 6574127, 6580815, 6583092, 6585369, - 6591716, 6609988, 6616676, 6623364, 6641636, 6648324, 6650601, 6652878, - 6659225, 6665913, 6668190, 6670467, 6676814, 6695086, 6701433, 6707780, - 6725369, 6732057, 6734505, 6736953, 6743641, 6746089, 6746900, 6747711, - 6749988, 6752436, 6753247, 6754058, 6756335, 6763023, 6765300, 6767577, - 6773924, 6776372, 6777183, 6777994, 6780271, 6781082, 6781273, 6781464, - 6782056, 6782867, 6783058, 6783249, 6783841, 6786118, 6786710, 6787302, - 6789087, 6791535, 6792346, 6793157, 6795434, 6796245, 6796436, 6796627, - 6797219, 6798030, 6798221, 6798412, 6799004, 6801281, 6801873, 6802465, - 6804250, 6810938, 6813215, 6815492, 6821839, 6824116, 6824708, 6825300, - 6827085, 6829362, 6829954, 6830546, 6832331, 6838678, 6840463, 6842248, - 6847494, 6854182, 6856630, 6859078, 6865766, 6868214, 6869025, 6869836, - 6872113, 6874561, 6875372, 6876183, 6878460, 6885148, 6887425, 6889702, - 6896049, 6898497, 6899308, 6900119, 6902396, 6903207, 6903398, 6903589, - 6904181, 6904992, 6905183, 6905374, 6905966, 6908243, 6908835, 6909427, - 6911212, 6913660, 6914471, 6915282, 6917559, 6918370, 6918561, 6918752, - 6919344, 6920155, 6920346, 6920537, 6921129, 6923406, 6923998, 6924590, - 6926375, 6933063, 6935340, 6937617, 6943964, 6946241, 6946833, 6947425, - 6949210, 6951487, 6952079, 6952671, 6954456, 6960803, 6962588, 6964373, - 6969619, 6987891, 6994579, 7001267, 7019539, 7026227, 7028504, 7030781, - 7037128, 7043816, 7046093, 7048370, 7054717, 7072989, 7079336, 7085683, - 7103272, 7109960, 7112237, 7114514, 7120861, 7123138, 7123730, 7124322, - 7126107, 7128384, 7128976, 7129568, 7131353, 7137700, 7139485, 7141270, - 7146516, 7153204, 7155481, 7157758, 7164105, 7166382, 7166974, 7167566, - 7169351, 7171628, 7172220, 7172812, 7174597, 7180944, 7182729, 7184514, - 7189760, 7208032, 7214379, 7220726, 7238315, 7244662, 7246447, 7248232, - 7253478, 7259825, 7261610, 7263395, 7268641, 7286230, 7291476, 7296722, -}; - -} // namespace klotski::codec::offset diff --git a/src/core/short_code/internal/offset/constant/offset.inc b/src/core/short_code/internal/offset/constant/offset.inc new file mode 100644 index 0000000..71fa93d --- /dev/null +++ b/src/core/short_code/internal/offset/constant/offset.inc @@ -0,0 +1,512 @@ +0 , 18272 , 24960 , 31648 , 49920 , 56608 , 59056 , 61504 , +68192 , 74880 , 77328 , 79776 , 86464 , 104736 , 111424 , 118112 , +136384 , 143072 , 145520 , 147968 , 154656 , 157104 , 158000 , 158896 , +161344 , 163792 , 164688 , 165584 , 168032 , 174720 , 177168 , 179616 , +186304 , 192992 , 195440 , 197888 , 204576 , 207024 , 207920 , 208816 , +211264 , 213712 , 214608 , 215504 , 217952 , 224640 , 227088 , 229536 , +236224 , 254496 , 261184 , 267872 , 286144 , 292832 , 295280 , 297728 , +304416 , 311104 , 313552 , 316000 , 322688 , 340960 , 347648 , 354336 , +372608 , 379296 , 381744 , 384192 , 390880 , 393328 , 394224 , 395120 , +397568 , 400016 , 400912 , 401808 , 404256 , 410944 , 413392 , 415840 , +422528 , 424976 , 425872 , 426768 , 429216 , 430112 , 430440 , 430768 , +431664 , 432560 , 432888 , 433216 , 434112 , 436560 , 437456 , 438352 , +440800 , 443248 , 444144 , 445040 , 447488 , 448384 , 448712 , 449040 , +449936 , 450832 , 451160 , 451488 , 452384 , 454832 , 455728 , 456624 , +459072 , 465760 , 468208 , 470656 , 477344 , 479792 , 480688 , 481584 , +484032 , 486480 , 487376 , 488272 , 490720 , 497408 , 499856 , 502304 , +508992 , 515680 , 518128 , 520576 , 527264 , 529712 , 530608 , 531504 , +533952 , 536400 , 537296 , 538192 , 540640 , 547328 , 549776 , 552224 , +558912 , 561360 , 562256 , 563152 , 565600 , 566496 , 566824 , 567152 , +568048 , 568944 , 569272 , 569600 , 570496 , 572944 , 573840 , 574736 , +577184 , 579632 , 580528 , 581424 , 583872 , 584768 , 585096 , 585424 , +586320 , 587216 , 587544 , 587871 , 588767 , 591215 , 592111 , 593007 , +595455 , 602143 , 604591 , 607039 , 613727 , 616175 , 617071 , 617967 , +620415 , 622863 , 623759 , 624655 , 627103 , 633791 , 636239 , 638687 , +645375 , 663647 , 670335 , 677023 , 695295 , 701983 , 704431 , 706879 , +713567 , 720255 , 722703 , 725151 , 731839 , 750111 , 756799 , 763487 , +781759 , 788447 , 790895 , 793343 , 800031 , 802479 , 803375 , 804271 , +806719 , 809167 , 810063 , 810959 , 813407 , 820095 , 822543 , 824991 , +831679 , 838367 , 840815 , 843263 , 849951 , 852399 , 853295 , 854191 , +856639 , 859087 , 859983 , 860879 , 863327 , 870015 , 872463 , 874911 , +881599 , 899871 , 906559 , 913247 , 931519 , 938207 , 940655 , 943103 , +949791 , 956479 , 958927 , 961375 , 968063 , 986335 , 993023 , 999711 , +1017983, 1024671, 1027119, 1029567, 1036255, 1038703, 1039599, 1040495, +1042943, 1045391, 1046287, 1047183, 1049631, 1056319, 1058767, 1061215, +1067903, 1070351, 1071247, 1072143, 1074591, 1075487, 1075815, 1076143, +1077039, 1077935, 1078263, 1078591, 1079487, 1081935, 1082831, 1083727, +1086175, 1088623, 1089519, 1090415, 1092863, 1093759, 1094087, 1094415, +1095311, 1096207, 1096535, 1096863, 1097759, 1100207, 1101103, 1101999, +1104447, 1111135, 1113583, 1116031, 1122719, 1125167, 1126063, 1126959, +1129407, 1131855, 1132751, 1133647, 1136095, 1142783, 1145231, 1147679, +1154367, 1156815, 1157711, 1158607, 1161055, 1161951, 1162279, 1162607, +1163503, 1164399, 1164727, 1165055, 1165951, 1168399, 1169295, 1170191, +1172639, 1173535, 1173863, 1174191, 1175087, 1175415, 1175514, 1175613, +1175898, 1176226, 1176325, 1176424, 1176709, 1177605, 1177890, 1178175, +1178986, 1179882, 1180210, 1180538, 1181434, 1181762, 1181861, 1181960, +1182245, 1182573, 1182672, 1182771, 1183056, 1183952, 1184237, 1184522, +1185333, 1187781, 1188677, 1189573, 1192021, 1192917, 1193202, 1193487, +1194298, 1195194, 1195479, 1195764, 1196575, 1199023, 1199834, 1200645, +1202922, 1205370, 1206266, 1207162, 1209610, 1210506, 1210834, 1211162, +1212058, 1212954, 1213282, 1213610, 1214506, 1216954, 1217850, 1218746, +1221194, 1222090, 1222418, 1222746, 1223642, 1223970, 1224069, 1224168, +1224453, 1224781, 1224880, 1224979, 1225264, 1226160, 1226445, 1226730, +1227541, 1228437, 1228765, 1229093, 1229989, 1230317, 1230416, 1230515, +1230800, 1231128, 1231227, 1231326, 1231611, 1232507, 1232792, 1233077, +1233888, 1236336, 1237232, 1238128, 1240576, 1241472, 1241757, 1242042, +1242853, 1243749, 1244034, 1244319, 1245130, 1247578, 1248389, 1249200, +1251477, 1258165, 1260613, 1263061, 1269749, 1272197, 1273093, 1273989, +1276437, 1278885, 1279781, 1280677, 1283125, 1289813, 1292261, 1294709, +1301397, 1303845, 1304741, 1305637, 1308085, 1308981, 1309266, 1309551, +1310362, 1311258, 1311543, 1311828, 1312639, 1315087, 1315898, 1316709, +1318986, 1321434, 1322330, 1323226, 1325674, 1326570, 1326855, 1327140, +1327951, 1328847, 1329132, 1329417, 1330228, 1332676, 1333487, 1334298, +1336575, 1343263, 1345711, 1348159, 1354847, 1357295, 1358106, 1358917, +1361194, 1363642, 1364453, 1365264, 1367541, 1374229, 1376506, 1378783, +1385130, 1391818, 1394266, 1396714, 1403402, 1405850, 1406746, 1407642, +1410090, 1412538, 1413434, 1414330, 1416778, 1423466, 1425914, 1428362, +1435050, 1437498, 1438394, 1439290, 1441738, 1442634, 1442962, 1443290, +1444186, 1445082, 1445410, 1445738, 1446634, 1449082, 1449978, 1450874, +1453322, 1455770, 1456666, 1457562, 1460010, 1460906, 1461234, 1461562, +1462458, 1463354, 1463682, 1464009, 1464905, 1467353, 1468249, 1469145, +1471593, 1478281, 1480729, 1483177, 1489865, 1492313, 1493209, 1494105, +1496553, 1499001, 1499897, 1500793, 1503241, 1509929, 1512377, 1514825, +1521513, 1523961, 1524857, 1525753, 1528201, 1529097, 1529425, 1529753, +1530649, 1531545, 1531873, 1532201, 1533097, 1535545, 1536441, 1537337, +1539785, 1540681, 1541009, 1541337, 1542233, 1542561, 1542660, 1542759, +1543044, 1543372, 1543471, 1543570, 1543855, 1544751, 1545036, 1545321, +1546132, 1547028, 1547356, 1547684, 1548580, 1548908, 1549007, 1549106, +1549391, 1549719, 1549818, 1549917, 1550202, 1551098, 1551383, 1551668, +1552479, 1554927, 1555823, 1556719, 1559167, 1560063, 1560348, 1560633, +1561444, 1562340, 1562625, 1562910, 1563721, 1566169, 1566980, 1567791, +1570068, 1572516, 1573412, 1574308, 1576756, 1577652, 1577980, 1578308, +1579204, 1580100, 1580428, 1580755, 1581651, 1584099, 1584995, 1585891, +1588339, 1589235, 1589563, 1589891, 1590787, 1591115, 1591214, 1591313, +1591598, 1591926, 1592025, 1592124, 1592409, 1593305, 1593590, 1593875, +1594686, 1595582, 1595910, 1596237, 1597133, 1597461, 1597560, 1597659, +1597944, 1598271, 1598370, 1598466, 1598751, 1599647, 1599932, 1600217, +1601028, 1603476, 1604372, 1605268, 1607716, 1608612, 1608897, 1609182, +1609993, 1610889, 1611174, 1611459, 1612270, 1614718, 1615529, 1616340, +1618617, 1625305, 1627753, 1630201, 1636889, 1639337, 1640233, 1641129, +1643577, 1646025, 1646921, 1647817, 1650265, 1656953, 1659401, 1661849, +1668537, 1670985, 1671881, 1672777, 1675225, 1676121, 1676406, 1676691, +1677502, 1678398, 1678683, 1678968, 1679779, 1682227, 1683038, 1683849, +1686126, 1688574, 1689470, 1690366, 1692814, 1693710, 1693995, 1694280, +1695091, 1695987, 1696272, 1696557, 1697368, 1699816, 1700627, 1701438, +1703715, 1710403, 1712851, 1715299, 1721987, 1724435, 1725246, 1726057, +1728334, 1730782, 1731593, 1732404, 1734681, 1741369, 1743646, 1745923, +1752270, 1770542, 1777230, 1783918, 1802190, 1808878, 1811326, 1813774, +1820462, 1827150, 1829598, 1832046, 1838734, 1857006, 1863694, 1870382, +1888654, 1895342, 1897790, 1900238, 1906926, 1909374, 1910270, 1911166, +1913614, 1916062, 1916958, 1917854, 1920302, 1926990, 1929438, 1931886, +1938574, 1945262, 1947710, 1950158, 1956846, 1959294, 1960190, 1961086, +1963534, 1965982, 1966878, 1967774, 1970222, 1976910, 1979358, 1981806, +1988494, 2006766, 2013454, 2020142, 2038414, 2045102, 2047550, 2049998, +2056686, 2063374, 2065822, 2068270, 2074958, 2093230, 2099918, 2106606, +2124878, 2131566, 2134014, 2136462, 2143150, 2145598, 2146494, 2147390, +2149838, 2152286, 2153182, 2154078, 2156526, 2163214, 2165662, 2168110, +2174798, 2177246, 2178142, 2179038, 2181486, 2182382, 2182667, 2182952, +2183763, 2184659, 2184944, 2185229, 2186040, 2188488, 2189299, 2190110, +2192387, 2194835, 2195731, 2196627, 2199075, 2199971, 2200256, 2200541, +2201352, 2202248, 2202533, 2202818, 2203629, 2206077, 2206888, 2207699, +2209976, 2216664, 2219112, 2221560, 2228248, 2230696, 2231507, 2232318, +2234595, 2237043, 2237854, 2238665, 2240942, 2247630, 2249907, 2252184, +2258531, 2265219, 2267667, 2270115, 2276803, 2279251, 2280147, 2281043, +2283491, 2285939, 2286835, 2287731, 2290179, 2296867, 2299315, 2301763, +2308451, 2310899, 2311795, 2312691, 2315139, 2316035, 2316320, 2316605, +2317416, 2318312, 2318597, 2318882, 2319693, 2322141, 2322952, 2323763, +2326040, 2328488, 2329384, 2330280, 2332728, 2333624, 2333909, 2334194, +2335005, 2335901, 2336186, 2336471, 2337282, 2339730, 2340541, 2341352, +2343629, 2350317, 2352765, 2355213, 2361901, 2364349, 2365160, 2365971, +2368248, 2370696, 2371507, 2372318, 2374595, 2381283, 2383560, 2385837, +2392184, 2410456, 2417144, 2423832, 2442104, 2448792, 2451240, 2453688, +2460376, 2467064, 2469512, 2471960, 2478648, 2496920, 2503608, 2510296, +2528568, 2535256, 2537704, 2540152, 2546840, 2549288, 2550099, 2550910, +2553187, 2555635, 2556446, 2557257, 2559534, 2566222, 2568499, 2570776, +2577123, 2583811, 2586259, 2588707, 2595395, 2597843, 2598654, 2599465, +2601742, 2604190, 2605001, 2605812, 2608089, 2614777, 2617054, 2619331, +2625678, 2643950, 2650638, 2657326, 2675598, 2682286, 2684563, 2686840, +2693187, 2699875, 2702152, 2704429, 2710776, 2729048, 2735395, 2741742, +2759331, 2766019, 2768467, 2770915, 2777603, 2780051, 2780947, 2781843, +2784291, 2786739, 2787635, 2788531, 2790979, 2797667, 2800115, 2802563, +2809251, 2811699, 2812595, 2813491, 2815939, 2816835, 2817163, 2817491, +2818387, 2819283, 2819611, 2819939, 2820835, 2823283, 2824179, 2825075, +2827523, 2829971, 2830867, 2831763, 2834211, 2835107, 2835435, 2835763, +2836659, 2837555, 2837883, 2838211, 2839107, 2841555, 2842451, 2843347, +2845795, 2852483, 2854931, 2857379, 2864067, 2866515, 2867411, 2868307, +2870755, 2873203, 2874099, 2874995, 2877443, 2884131, 2886579, 2889027, +2895715, 2898163, 2899059, 2899955, 2902403, 2903299, 2903627, 2903955, +2904851, 2905747, 2906075, 2906403, 2907299, 2909747, 2910643, 2911539, +2913987, 2914883, 2915211, 2915539, 2916435, 2916763, 2916862, 2916961, +2917246, 2917574, 2917673, 2917772, 2918057, 2918953, 2919238, 2919523, +2920334, 2921230, 2921558, 2921886, 2922782, 2923110, 2923209, 2923308, +2923593, 2923921, 2924020, 2924119, 2924404, 2925300, 2925585, 2925870, +2926681, 2929129, 2930025, 2930921, 2933369, 2934265, 2934550, 2934835, +2935646, 2936542, 2936827, 2937112, 2937923, 2940371, 2941182, 2941993, +2944270, 2946718, 2947614, 2948510, 2950958, 2951854, 2952182, 2952510, +2953406, 2954302, 2954630, 2954958, 2955854, 2958302, 2959198, 2960094, +2962542, 2963438, 2963766, 2964094, 2964990, 2965318, 2965417, 2965516, +2965801, 2966129, 2966228, 2966327, 2966612, 2967508, 2967793, 2968078, +2968889, 2969785, 2970113, 2970441, 2971337, 2971665, 2971764, 2971863, +2972148, 2972476, 2972575, 2972674, 2972959, 2973855, 2974140, 2974425, +2975236, 2977684, 2978580, 2979476, 2981924, 2982820, 2983105, 2983390, +2984201, 2985097, 2985382, 2985667, 2986478, 2988926, 2989737, 2990548, +2992825, 2999513, 3001961, 3004409, 3011097, 3013545, 3014441, 3015337, +3017785, 3020233, 3021129, 3022025, 3024473, 3031161, 3033609, 3036057, +3042745, 3045193, 3046089, 3046985, 3049433, 3050329, 3050614, 3050899, +3051710, 3052606, 3052891, 3053176, 3053987, 3056435, 3057246, 3058057, +3060334, 3062782, 3063678, 3064574, 3067022, 3067918, 3068203, 3068488, +3069299, 3070195, 3070480, 3070765, 3071576, 3074024, 3074835, 3075646, +3077923, 3084611, 3087059, 3089507, 3096195, 3098643, 3099454, 3100265, +3102542, 3104990, 3105801, 3106612, 3108889, 3115577, 3117854, 3120131, +3126478, 3128926, 3129822, 3130718, 3133166, 3134062, 3134390, 3134718, +3135614, 3136510, 3136838, 3137166, 3138062, 3140510, 3141406, 3142302, +3144750, 3145646, 3145974, 3146302, 3147198, 3147526, 3147625, 3147724, +3148009, 3148337, 3148436, 3148535, 3148820, 3149716, 3150001, 3150286, +3151097, 3151993, 3152321, 3152649, 3153545, 3153873, 3153972, 3154071, +3154356, 3154684, 3154783, 3154882, 3155167, 3156063, 3156348, 3156633, +3157444, 3159892, 3160788, 3161684, 3164132, 3165028, 3165313, 3165598, +3166409, 3167305, 3167590, 3167875, 3168686, 3171134, 3171945, 3172756, +3175033, 3175929, 3176257, 3176585, 3177481, 3177809, 3177908, 3178007, +3178292, 3178620, 3178719, 3178818, 3179103, 3179999, 3180284, 3180569, +3181380, 3181708, 3181807, 3181906, 3182191, 3182290, 3182307, 3182324, +3182382, 3182481, 3182498, 3182515, 3182573, 3182858, 3182916, 3182974, +3183165, 3183493, 3183592, 3183691, 3183976, 3184075, 3184092, 3184109, +3184167, 3184266, 3184283, 3184300, 3184358, 3184643, 3184701, 3184759, +3184950, 3185846, 3186131, 3186416, 3187227, 3187512, 3187570, 3187628, +3187819, 3188104, 3188162, 3188220, 3188411, 3189222, 3189413, 3189604, +3190196, 3191092, 3191420, 3191748, 3192644, 3192972, 3193071, 3193170, +3193455, 3193783, 3193882, 3193981, 3194266, 3195162, 3195447, 3195732, +3196543, 3196871, 3196970, 3197069, 3197354, 3197453, 3197470, 3197487, +3197545, 3197644, 3197661, 3197678, 3197736, 3198021, 3198079, 3198137, +3198328, 3198656, 3198755, 3198854, 3199139, 3199238, 3199255, 3199272, +3199330, 3199429, 3199446, 3199463, 3199521, 3199806, 3199864, 3199922, +3200113, 3201009, 3201294, 3201579, 3202390, 3202675, 3202733, 3202791, +3202982, 3203267, 3203325, 3203383, 3203574, 3204385, 3204576, 3204767, +3205359, 3207807, 3208703, 3209599, 3212047, 3212943, 3213228, 3213513, +3214324, 3215220, 3215505, 3215790, 3216601, 3219049, 3219860, 3220671, +3222948, 3223844, 3224129, 3224414, 3225225, 3225510, 3225568, 3225626, +3225817, 3226102, 3226160, 3226218, 3226409, 3227220, 3227411, 3227602, +3228194, 3229090, 3229375, 3229660, 3230471, 3230756, 3230814, 3230872, +3231063, 3231348, 3231406, 3231464, 3231655, 3232466, 3232657, 3232848, +3233440, 3235888, 3236699, 3237510, 3239787, 3240598, 3240789, 3240980, +3241572, 3242383, 3242574, 3242765, 3243357, 3245634, 3246226, 3246818, +3248603, 3251051, 3251947, 3252843, 3255291, 3256187, 3256515, 3256843, +3257739, 3258635, 3258963, 3259291, 3260187, 3262635, 3263531, 3264427, +3266875, 3267771, 3268099, 3268427, 3269323, 3269651, 3269750, 3269849, +3270134, 3270462, 3270561, 3270660, 3270945, 3271841, 3272126, 3272411, +3273222, 3274118, 3274446, 3274774, 3275670, 3275998, 3276097, 3276196, +3276481, 3276809, 3276908, 3277007, 3277292, 3278188, 3278473, 3278758, +3279569, 3282017, 3282913, 3283809, 3286257, 3287153, 3287438, 3287723, +3288534, 3289430, 3289715, 3290000, 3290811, 3293259, 3294070, 3294881, +3297158, 3298054, 3298382, 3298710, 3299606, 3299934, 3300033, 3300132, +3300417, 3300745, 3300844, 3300943, 3301228, 3302124, 3302409, 3302694, +3303505, 3303833, 3303932, 3304031, 3304316, 3304415, 3304432, 3304449, +3304507, 3304606, 3304623, 3304640, 3304698, 3304983, 3305041, 3305099, +3305290, 3305618, 3305717, 3305816, 3306101, 3306200, 3306217, 3306234, +3306292, 3306391, 3306408, 3306425, 3306483, 3306768, 3306826, 3306884, +3307075, 3307971, 3308256, 3308541, 3309352, 3309637, 3309695, 3309753, +3309944, 3310229, 3310287, 3310345, 3310536, 3311347, 3311538, 3311729, +3312321, 3313217, 3313545, 3313873, 3314769, 3315097, 3315196, 3315295, +3315580, 3315908, 3316007, 3316106, 3316391, 3317287, 3317572, 3317857, +3318668, 3318996, 3319095, 3319194, 3319479, 3319578, 3319595, 3319612, +3319670, 3319769, 3319786, 3319803, 3319861, 3320146, 3320204, 3320262, +3320453, 3320781, 3320880, 3320979, 3321264, 3321363, 3321380, 3321397, +3321455, 3321554, 3321571, 3321588, 3321646, 3321931, 3321989, 3322047, +3322238, 3323134, 3323419, 3323704, 3324515, 3324800, 3324858, 3324916, +3325107, 3325392, 3325450, 3325508, 3325699, 3326510, 3326701, 3326892, +3327484, 3329932, 3330828, 3331724, 3334172, 3335068, 3335353, 3335638, +3336449, 3337345, 3337630, 3337915, 3338726, 3341174, 3341985, 3342796, +3345073, 3345969, 3346254, 3346539, 3347350, 3347635, 3347693, 3347751, +3347942, 3348227, 3348285, 3348343, 3348534, 3349345, 3349536, 3349727, +3350319, 3351215, 3351500, 3351785, 3352596, 3352881, 3352939, 3352997, +3353188, 3353473, 3353531, 3353589, 3353780, 3354591, 3354782, 3354973, +3355565, 3358013, 3358824, 3359635, 3361912, 3362723, 3362914, 3363105, +3363697, 3364508, 3364699, 3364890, 3365482, 3367759, 3368351, 3368943, +3370728, 3377416, 3379864, 3382312, 3389000, 3391448, 3392344, 3393240, +3395688, 3398136, 3399032, 3399928, 3402376, 3409064, 3411512, 3413960, +3420648, 3423096, 3423992, 3424888, 3427336, 3428232, 3428517, 3428802, +3429613, 3430509, 3430794, 3431079, 3431890, 3434338, 3435149, 3435960, +3438237, 3440685, 3441581, 3442477, 3444925, 3445821, 3446106, 3446391, +3447202, 3448098, 3448383, 3448668, 3449479, 3451927, 3452738, 3453549, +3455826, 3462514, 3464962, 3467410, 3474098, 3476546, 3477357, 3478168, +3480445, 3482893, 3483704, 3484515, 3486792, 3493480, 3495757, 3498034, +3504381, 3506829, 3507725, 3508621, 3511069, 3511965, 3512250, 3512535, +3513346, 3514242, 3514527, 3514812, 3515623, 3518071, 3518882, 3519693, +3521970, 3522866, 3523151, 3523436, 3524247, 3524532, 3524590, 3524648, +3524839, 3525124, 3525182, 3525240, 3525431, 3526242, 3526433, 3526624, +3527216, 3528112, 3528397, 3528682, 3529493, 3529778, 3529836, 3529894, +3530085, 3530370, 3530428, 3530486, 3530677, 3531488, 3531679, 3531870, +3532462, 3534910, 3535721, 3536532, 3538809, 3539620, 3539811, 3540002, +3540594, 3541405, 3541596, 3541787, 3542379, 3544656, 3545248, 3545840, +3547625, 3550073, 3550969, 3551865, 3554313, 3555209, 3555494, 3555779, +3556590, 3557486, 3557771, 3558056, 3558867, 3561315, 3562126, 3562937, +3565214, 3566110, 3566395, 3566680, 3567491, 3567776, 3567834, 3567892, +3568083, 3568368, 3568426, 3568484, 3568675, 3569486, 3569677, 3569868, +3570460, 3571356, 3571641, 3571926, 3572737, 3573022, 3573080, 3573138, +3573329, 3573614, 3573672, 3573730, 3573921, 3574732, 3574923, 3575114, +3575706, 3578154, 3578965, 3579776, 3582053, 3582864, 3583055, 3583246, +3583838, 3584649, 3584840, 3585031, 3585623, 3587900, 3588492, 3589084, +3590869, 3597557, 3600005, 3602453, 3609141, 3611589, 3612400, 3613211, +3615488, 3617936, 3618747, 3619558, 3621835, 3628523, 3630800, 3633077, +3639424, 3641872, 3642683, 3643494, 3645771, 3646582, 3646773, 3646964, +3647556, 3648367, 3648558, 3648749, 3649341, 3651618, 3652210, 3652802, +3654587, 3657035, 3657846, 3658657, 3660934, 3661745, 3661936, 3662127, +3662719, 3663530, 3663721, 3663912, 3664504, 3666781, 3667373, 3667965, +3669750, 3676438, 3678715, 3680992, 3687339, 3689616, 3690208, 3690800, +3692585, 3694862, 3695454, 3696046, 3697831, 3704178, 3705963, 3707748, +3712994, 3719682, 3722130, 3724578, 3731266, 3733714, 3734610, 3735506, +3737954, 3740402, 3741298, 3742194, 3744642, 3751330, 3753778, 3756226, +3762914, 3765362, 3766258, 3767154, 3769602, 3770498, 3770826, 3771154, +3772050, 3772946, 3773274, 3773602, 3774498, 3776946, 3777842, 3778738, +3781186, 3783634, 3784530, 3785426, 3787874, 3788770, 3789098, 3789426, +3790322, 3791218, 3791546, 3791873, 3792769, 3795217, 3796113, 3797009, +3799457, 3806145, 3808593, 3811041, 3817729, 3820177, 3821073, 3821969, +3824417, 3826865, 3827761, 3828657, 3831105, 3837793, 3840241, 3842689, +3849377, 3851825, 3852721, 3853617, 3856065, 3856961, 3857289, 3857617, +3858513, 3859409, 3859737, 3860065, 3860961, 3863409, 3864305, 3865201, +3867649, 3868545, 3868873, 3869201, 3870097, 3870425, 3870524, 3870623, +3870908, 3871236, 3871335, 3871434, 3871719, 3872615, 3872900, 3873185, +3873996, 3874892, 3875220, 3875548, 3876444, 3876772, 3876871, 3876970, +3877255, 3877583, 3877682, 3877781, 3878066, 3878962, 3879247, 3879532, +3880343, 3882791, 3883687, 3884583, 3887031, 3887927, 3888212, 3888497, +3889308, 3890204, 3890489, 3890774, 3891585, 3894033, 3894844, 3895655, +3897932, 3900380, 3901276, 3902172, 3904620, 3905516, 3905844, 3906172, +3907068, 3907964, 3908292, 3908619, 3909515, 3911963, 3912859, 3913755, +3916203, 3917099, 3917427, 3917755, 3918651, 3918979, 3919078, 3919177, +3919462, 3919790, 3919889, 3919988, 3920273, 3921169, 3921454, 3921739, +3922550, 3923446, 3923774, 3924101, 3924997, 3925325, 3925424, 3925523, +3925808, 3926135, 3926234, 3926330, 3926615, 3927511, 3927796, 3928081, +3928892, 3931340, 3932236, 3933132, 3935580, 3936476, 3936761, 3937046, +3937857, 3938753, 3939038, 3939323, 3940134, 3942582, 3943393, 3944204, +3946481, 3953169, 3955617, 3958065, 3964753, 3967201, 3968097, 3968993, +3971441, 3973889, 3974785, 3975681, 3978129, 3984817, 3987265, 3989713, +3996401, 3998849, 3999745, 4000641, 4003089, 4003985, 4004270, 4004555, +4005366, 4006262, 4006547, 4006832, 4007643, 4010091, 4010902, 4011713, +4013990, 4016438, 4017334, 4018230, 4020678, 4021574, 4021859, 4022144, +4022955, 4023851, 4024136, 4024421, 4025232, 4027680, 4028491, 4029302, +4031579, 4038267, 4040715, 4043163, 4049851, 4052299, 4053110, 4053921, +4056198, 4058646, 4059457, 4060268, 4062545, 4069233, 4071510, 4073787, +4080134, 4082582, 4083478, 4084374, 4086822, 4087718, 4088046, 4088374, +4089270, 4090166, 4090494, 4090822, 4091718, 4094166, 4095062, 4095958, +4098406, 4099302, 4099630, 4099958, 4100854, 4101182, 4101281, 4101380, +4101665, 4101993, 4102092, 4102191, 4102476, 4103372, 4103657, 4103942, +4104753, 4105649, 4105977, 4106305, 4107201, 4107529, 4107628, 4107727, +4108012, 4108340, 4108439, 4108538, 4108823, 4109719, 4110004, 4110289, +4111100, 4113548, 4114444, 4115340, 4117788, 4118684, 4118969, 4119254, +4120065, 4120961, 4121246, 4121531, 4122342, 4124790, 4125601, 4126412, +4128689, 4129585, 4129913, 4130241, 4131137, 4131465, 4131564, 4131663, +4131948, 4132276, 4132375, 4132474, 4132759, 4133655, 4133940, 4134225, +4135036, 4135364, 4135463, 4135562, 4135847, 4135946, 4135963, 4135980, +4136038, 4136137, 4136154, 4136171, 4136229, 4136514, 4136572, 4136630, +4136821, 4137149, 4137248, 4137347, 4137632, 4137731, 4137748, 4137765, +4137823, 4137922, 4137939, 4137956, 4138014, 4138299, 4138357, 4138415, +4138606, 4139502, 4139787, 4140072, 4140883, 4141168, 4141226, 4141284, +4141475, 4141760, 4141818, 4141876, 4142067, 4142878, 4143069, 4143260, +4143852, 4144748, 4145076, 4145404, 4146300, 4146628, 4146727, 4146826, +4147111, 4147439, 4147538, 4147637, 4147922, 4148818, 4149103, 4149388, +4150199, 4150527, 4150626, 4150725, 4151010, 4151109, 4151126, 4151143, +4151201, 4151300, 4151317, 4151334, 4151392, 4151677, 4151735, 4151793, +4151984, 4152312, 4152411, 4152510, 4152795, 4152894, 4152911, 4152928, +4152986, 4153085, 4153102, 4153119, 4153177, 4153462, 4153520, 4153578, +4153769, 4154665, 4154950, 4155235, 4156046, 4156331, 4156389, 4156447, +4156638, 4156923, 4156981, 4157039, 4157230, 4158041, 4158232, 4158423, +4159015, 4161463, 4162359, 4163255, 4165703, 4166599, 4166884, 4167169, +4167980, 4168876, 4169161, 4169446, 4170257, 4172705, 4173516, 4174327, +4176604, 4177500, 4177785, 4178070, 4178881, 4179166, 4179224, 4179282, +4179473, 4179758, 4179816, 4179874, 4180065, 4180876, 4181067, 4181258, +4181850, 4182746, 4183031, 4183316, 4184127, 4184412, 4184470, 4184528, +4184719, 4185004, 4185062, 4185120, 4185311, 4186122, 4186313, 4186504, +4187096, 4189544, 4190355, 4191166, 4193443, 4194254, 4194445, 4194636, +4195228, 4196039, 4196230, 4196421, 4197013, 4199290, 4199882, 4200474, +4202259, 4204707, 4205603, 4206499, 4208947, 4209843, 4210171, 4210499, +4211395, 4212291, 4212619, 4212946, 4213842, 4216290, 4217186, 4218082, +4220530, 4221426, 4221754, 4222082, 4222978, 4223306, 4223405, 4223504, +4223789, 4224117, 4224216, 4224315, 4224600, 4225496, 4225781, 4226066, +4226877, 4227773, 4228101, 4228428, 4229324, 4229652, 4229751, 4229850, +4230135, 4230462, 4230561, 4230657, 4230942, 4231838, 4232123, 4232408, +4233219, 4235667, 4236563, 4237459, 4239907, 4240803, 4241088, 4241373, +4242184, 4243080, 4243365, 4243650, 4244461, 4246909, 4247720, 4248531, +4250808, 4251704, 4252032, 4252360, 4253256, 4253584, 4253683, 4253782, +4254067, 4254395, 4254494, 4254593, 4254878, 4255774, 4256059, 4256344, +4257155, 4257483, 4257582, 4257681, 4257966, 4258065, 4258082, 4258099, +4258157, 4258256, 4258273, 4258290, 4258348, 4258633, 4258691, 4258749, +4258940, 4259268, 4259367, 4259466, 4259751, 4259850, 4259867, 4259884, +4259942, 4260041, 4260058, 4260075, 4260133, 4260418, 4260476, 4260534, +4260725, 4261621, 4261906, 4262191, 4263002, 4263287, 4263345, 4263403, +4263594, 4263879, 4263937, 4263995, 4264186, 4264997, 4265188, 4265379, +4265971, 4266867, 4267195, 4267522, 4268418, 4268746, 4268845, 4268944, +4269229, 4269556, 4269655, 4269751, 4270036, 4270932, 4271217, 4271502, +4272313, 4272641, 4272740, 4272839, 4273124, 4273223, 4273240, 4273257, +4273315, 4273414, 4273431, 4273448, 4273506, 4273791, 4273849, 4273907, +4274098, 4274425, 4274524, 4274620, 4274905, 4275004, 4275021, 4275038, +4275096, 4275192, 4275209, 4275223, 4275281, 4275566, 4275624, 4275682, +4275873, 4276769, 4277054, 4277339, 4278150, 4278435, 4278493, 4278551, +4278742, 4279027, 4279085, 4279143, 4279334, 4280145, 4280336, 4280527, +4281119, 4283567, 4284463, 4285359, 4287807, 4288703, 4288988, 4289273, +4290084, 4290980, 4291265, 4291550, 4292361, 4294809, 4295620, 4296431, +4298708, 4299604, 4299889, 4300174, 4300985, 4301270, 4301328, 4301386, +4301577, 4301862, 4301920, 4301978, 4302169, 4302980, 4303171, 4303362, +4303954, 4304850, 4305135, 4305420, 4306231, 4306516, 4306574, 4306632, +4306823, 4307108, 4307166, 4307224, 4307415, 4308226, 4308417, 4308608, +4309200, 4311648, 4312459, 4313270, 4315547, 4316358, 4316549, 4316740, +4317332, 4318143, 4318334, 4318525, 4319117, 4321394, 4321986, 4322578, +4324363, 4331051, 4333499, 4335947, 4342635, 4345083, 4345979, 4346875, +4349323, 4351771, 4352667, 4353563, 4356011, 4362699, 4365147, 4367595, +4374283, 4376731, 4377627, 4378523, 4380971, 4381867, 4382152, 4382437, +4383248, 4384144, 4384429, 4384714, 4385525, 4387973, 4388784, 4389595, +4391872, 4394320, 4395216, 4396112, 4398560, 4399456, 4399741, 4400026, +4400837, 4401733, 4402018, 4402303, 4403114, 4405562, 4406373, 4407184, +4409461, 4416149, 4418597, 4421045, 4427733, 4430181, 4430992, 4431803, +4434080, 4436528, 4437339, 4438150, 4440427, 4447115, 4449392, 4451669, +4458016, 4460464, 4461360, 4462256, 4464704, 4465600, 4465885, 4466170, +4466981, 4467877, 4468162, 4468447, 4469258, 4471706, 4472517, 4473328, +4475605, 4476501, 4476786, 4477071, 4477882, 4478167, 4478225, 4478283, +4478474, 4478759, 4478817, 4478875, 4479066, 4479877, 4480068, 4480259, +4480851, 4481747, 4482032, 4482317, 4483128, 4483413, 4483471, 4483529, +4483720, 4484005, 4484063, 4484121, 4484312, 4485123, 4485314, 4485505, +4486097, 4488545, 4489356, 4490167, 4492444, 4493255, 4493446, 4493637, +4494229, 4495040, 4495231, 4495422, 4496014, 4498291, 4498883, 4499475, +4501260, 4503708, 4504604, 4505500, 4507948, 4508844, 4509129, 4509414, +4510225, 4511121, 4511406, 4511691, 4512502, 4514950, 4515761, 4516572, +4518849, 4519745, 4520030, 4520315, 4521126, 4521411, 4521469, 4521527, +4521718, 4522003, 4522061, 4522119, 4522310, 4523121, 4523312, 4523503, +4524095, 4524991, 4525276, 4525561, 4526372, 4526657, 4526715, 4526773, +4526964, 4527249, 4527307, 4527365, 4527556, 4528367, 4528558, 4528749, +4529341, 4531789, 4532600, 4533411, 4535688, 4536499, 4536690, 4536881, +4537473, 4538284, 4538475, 4538666, 4539258, 4541535, 4542127, 4542719, +4544504, 4551192, 4553640, 4556088, 4562776, 4565224, 4566035, 4566846, +4569123, 4571571, 4572382, 4573193, 4575470, 4582158, 4584435, 4586712, +4593059, 4595507, 4596318, 4597129, 4599406, 4600217, 4600408, 4600599, +4601191, 4602002, 4602193, 4602384, 4602976, 4605253, 4605845, 4606437, +4608222, 4610670, 4611481, 4612292, 4614569, 4615380, 4615571, 4615762, +4616354, 4617165, 4617356, 4617547, 4618139, 4620416, 4621008, 4621600, +4623385, 4630073, 4632350, 4634627, 4640974, 4643251, 4643843, 4644435, +4646220, 4648497, 4649089, 4649681, 4651466, 4657813, 4659598, 4661383, +4666629, 4684901, 4691589, 4698277, 4716549, 4723237, 4725685, 4728133, +4734821, 4741509, 4743957, 4746405, 4753093, 4771365, 4778053, 4784741, +4803013, 4809701, 4812149, 4814597, 4821285, 4823733, 4824629, 4825525, +4827973, 4830421, 4831317, 4832213, 4834661, 4841349, 4843797, 4846245, +4852933, 4859621, 4862069, 4864517, 4871205, 4873653, 4874549, 4875445, +4877893, 4880341, 4881237, 4882133, 4884581, 4891269, 4893717, 4896165, +4902853, 4921125, 4927813, 4934501, 4952773, 4959461, 4961909, 4964357, +4971045, 4977733, 4980181, 4982629, 4989317, 5007589, 5014277, 5020965, +5039237, 5045925, 5048373, 5050821, 5057509, 5059957, 5060853, 5061749, +5064197, 5066645, 5067541, 5068437, 5070885, 5077573, 5080021, 5082469, +5089157, 5091605, 5092501, 5093397, 5095845, 5096741, 5097026, 5097311, +5098122, 5099018, 5099303, 5099588, 5100399, 5102847, 5103658, 5104469, +5106746, 5109194, 5110090, 5110986, 5113434, 5114330, 5114615, 5114900, +5115711, 5116607, 5116892, 5117177, 5117988, 5120436, 5121247, 5122058, +5124335, 5131023, 5133471, 5135919, 5142607, 5145055, 5145866, 5146677, +5148954, 5151402, 5152213, 5153024, 5155301, 5161989, 5164266, 5166543, +5172890, 5179578, 5182026, 5184474, 5191162, 5193610, 5194506, 5195402, +5197850, 5200298, 5201194, 5202090, 5204538, 5211226, 5213674, 5216122, +5222810, 5225258, 5226154, 5227050, 5229498, 5230394, 5230679, 5230964, +5231775, 5232671, 5232956, 5233241, 5234052, 5236500, 5237311, 5238122, +5240399, 5242847, 5243743, 5244639, 5247087, 5247983, 5248268, 5248553, +5249364, 5250260, 5250545, 5250830, 5251641, 5254089, 5254900, 5255711, +5257988, 5264676, 5267124, 5269572, 5276260, 5278708, 5279519, 5280330, +5282607, 5285055, 5285866, 5286677, 5288954, 5295642, 5297919, 5300196, +5306543, 5324815, 5331503, 5338191, 5356463, 5363151, 5365599, 5368047, +5374735, 5381423, 5383871, 5386319, 5393007, 5411279, 5417967, 5424655, +5442927, 5449615, 5452063, 5454511, 5461199, 5463647, 5464458, 5465269, +5467546, 5469994, 5470805, 5471616, 5473893, 5480581, 5482858, 5485135, +5491482, 5498170, 5500618, 5503066, 5509754, 5512202, 5513013, 5513824, +5516101, 5518549, 5519360, 5520171, 5522448, 5529136, 5531413, 5533690, +5540037, 5558309, 5564997, 5571685, 5589957, 5596645, 5598922, 5601199, +5607546, 5614234, 5616511, 5618788, 5625135, 5643407, 5649754, 5656101, +5673690, 5680378, 5682826, 5685274, 5691962, 5694410, 5695306, 5696202, +5698650, 5701098, 5701994, 5702890, 5705338, 5712026, 5714474, 5716922, +5723610, 5726058, 5726954, 5727850, 5730298, 5731194, 5731479, 5731764, +5732575, 5733471, 5733756, 5734041, 5734852, 5737300, 5738111, 5738922, +5741199, 5743647, 5744543, 5745439, 5747887, 5748783, 5749068, 5749353, +5750164, 5751060, 5751345, 5751630, 5752441, 5754889, 5755700, 5756511, +5758788, 5765476, 5767924, 5770372, 5777060, 5779508, 5780319, 5781130, +5783407, 5785855, 5786666, 5787477, 5789754, 5796442, 5798719, 5800996, +5807343, 5809791, 5810687, 5811583, 5814031, 5814927, 5815212, 5815497, +5816308, 5817204, 5817489, 5817774, 5818585, 5821033, 5821844, 5822655, +5824932, 5825828, 5826113, 5826398, 5827209, 5827494, 5827552, 5827610, +5827801, 5828086, 5828144, 5828202, 5828393, 5829204, 5829395, 5829586, +5830178, 5831074, 5831359, 5831644, 5832455, 5832740, 5832798, 5832856, +5833047, 5833332, 5833390, 5833448, 5833639, 5834450, 5834641, 5834832, +5835424, 5837872, 5838683, 5839494, 5841771, 5842582, 5842773, 5842964, +5843556, 5844367, 5844558, 5844749, 5845341, 5847618, 5848210, 5848802, +5850587, 5853035, 5853931, 5854827, 5857275, 5858171, 5858456, 5858741, +5859552, 5860448, 5860733, 5861018, 5861829, 5864277, 5865088, 5865899, +5868176, 5869072, 5869357, 5869642, 5870453, 5870738, 5870796, 5870854, +5871045, 5871330, 5871388, 5871446, 5871637, 5872448, 5872639, 5872830, +5873422, 5874318, 5874603, 5874888, 5875699, 5875984, 5876042, 5876100, +5876291, 5876576, 5876634, 5876692, 5876883, 5877694, 5877885, 5878076, +5878668, 5881116, 5881927, 5882738, 5885015, 5885826, 5886017, 5886208, +5886800, 5887611, 5887802, 5887993, 5888585, 5890862, 5891454, 5892046, +5893831, 5900519, 5902967, 5905415, 5912103, 5914551, 5915362, 5916173, +5918450, 5920898, 5921709, 5922520, 5924797, 5931485, 5933762, 5936039, +5942386, 5944834, 5945645, 5946456, 5948733, 5949544, 5949735, 5949926, +5950518, 5951329, 5951520, 5951711, 5952303, 5954580, 5955172, 5955764, +5957549, 5959997, 5960808, 5961619, 5963896, 5964707, 5964898, 5965089, +5965681, 5966492, 5966683, 5966874, 5967466, 5969743, 5970335, 5970927, +5972712, 5979400, 5981677, 5983954, 5990301, 5992578, 5993170, 5993762, +5995547, 5997824, 5998416, 5999008, 6000793, 6007140, 6008925, 6010710, +6015956, 6022644, 6025092, 6027540, 6034228, 6036676, 6037572, 6038468, +6040916, 6043364, 6044260, 6045156, 6047604, 6054292, 6056740, 6059188, +6065876, 6068324, 6069220, 6070116, 6072564, 6073460, 6073745, 6074030, +6074841, 6075737, 6076022, 6076307, 6077118, 6079566, 6080377, 6081188, +6083465, 6085913, 6086809, 6087705, 6090153, 6091049, 6091334, 6091619, +6092430, 6093326, 6093611, 6093896, 6094707, 6097155, 6097966, 6098777, +6101054, 6107742, 6110190, 6112638, 6119326, 6121774, 6122585, 6123396, +6125673, 6128121, 6128932, 6129743, 6132020, 6138708, 6140985, 6143262, +6149609, 6152057, 6152953, 6153849, 6156297, 6157193, 6157478, 6157763, +6158574, 6159470, 6159755, 6160040, 6160851, 6163299, 6164110, 6164921, +6167198, 6168094, 6168379, 6168664, 6169475, 6169760, 6169818, 6169876, +6170067, 6170352, 6170410, 6170468, 6170659, 6171470, 6171661, 6171852, +6172444, 6173340, 6173625, 6173910, 6174721, 6175006, 6175064, 6175122, +6175313, 6175598, 6175656, 6175714, 6175905, 6176716, 6176907, 6177098, +6177690, 6180138, 6180949, 6181760, 6184037, 6184848, 6185039, 6185230, +6185822, 6186633, 6186824, 6187015, 6187607, 6189884, 6190476, 6191068, +6192853, 6195301, 6196197, 6197093, 6199541, 6200437, 6200722, 6201007, +6201818, 6202714, 6202999, 6203284, 6204095, 6206543, 6207354, 6208165, +6210442, 6211338, 6211623, 6211908, 6212719, 6213004, 6213062, 6213120, +6213311, 6213596, 6213654, 6213712, 6213903, 6214714, 6214905, 6215096, +6215688, 6216584, 6216869, 6217154, 6217965, 6218250, 6218308, 6218366, +6218557, 6218842, 6218900, 6218958, 6219149, 6219960, 6220151, 6220342, +6220934, 6223382, 6224193, 6225004, 6227281, 6228092, 6228283, 6228474, +6229066, 6229877, 6230068, 6230259, 6230851, 6233128, 6233720, 6234312, +6236097, 6242785, 6245233, 6247681, 6254369, 6256817, 6257628, 6258439, +6260716, 6263164, 6263975, 6264786, 6267063, 6273751, 6276028, 6278305, +6284652, 6287100, 6287911, 6288722, 6290999, 6291810, 6292001, 6292192, +6292784, 6293595, 6293786, 6293977, 6294569, 6296846, 6297438, 6298030, +6299815, 6302263, 6303074, 6303885, 6306162, 6306973, 6307164, 6307355, +6307947, 6308758, 6308949, 6309140, 6309732, 6312009, 6312601, 6313193, +6314978, 6321666, 6323943, 6326220, 6332567, 6334844, 6335436, 6336028, +6337813, 6340090, 6340682, 6341274, 6343059, 6349406, 6351191, 6352976, +6358222, 6376494, 6383182, 6389870, 6408142, 6414830, 6417278, 6419726, +6426414, 6433102, 6435550, 6437998, 6444686, 6462958, 6469646, 6476334, +6494606, 6501294, 6503742, 6506190, 6512878, 6515326, 6516137, 6516948, +6519225, 6521673, 6522484, 6523295, 6525572, 6532260, 6534537, 6536814, +6543161, 6549849, 6552297, 6554745, 6561433, 6563881, 6564692, 6565503, +6567780, 6570228, 6571039, 6571850, 6574127, 6580815, 6583092, 6585369, +6591716, 6609988, 6616676, 6623364, 6641636, 6648324, 6650601, 6652878, +6659225, 6665913, 6668190, 6670467, 6676814, 6695086, 6701433, 6707780, +6725369, 6732057, 6734505, 6736953, 6743641, 6746089, 6746900, 6747711, +6749988, 6752436, 6753247, 6754058, 6756335, 6763023, 6765300, 6767577, +6773924, 6776372, 6777183, 6777994, 6780271, 6781082, 6781273, 6781464, +6782056, 6782867, 6783058, 6783249, 6783841, 6786118, 6786710, 6787302, +6789087, 6791535, 6792346, 6793157, 6795434, 6796245, 6796436, 6796627, +6797219, 6798030, 6798221, 6798412, 6799004, 6801281, 6801873, 6802465, +6804250, 6810938, 6813215, 6815492, 6821839, 6824116, 6824708, 6825300, +6827085, 6829362, 6829954, 6830546, 6832331, 6838678, 6840463, 6842248, +6847494, 6854182, 6856630, 6859078, 6865766, 6868214, 6869025, 6869836, +6872113, 6874561, 6875372, 6876183, 6878460, 6885148, 6887425, 6889702, +6896049, 6898497, 6899308, 6900119, 6902396, 6903207, 6903398, 6903589, +6904181, 6904992, 6905183, 6905374, 6905966, 6908243, 6908835, 6909427, +6911212, 6913660, 6914471, 6915282, 6917559, 6918370, 6918561, 6918752, +6919344, 6920155, 6920346, 6920537, 6921129, 6923406, 6923998, 6924590, +6926375, 6933063, 6935340, 6937617, 6943964, 6946241, 6946833, 6947425, +6949210, 6951487, 6952079, 6952671, 6954456, 6960803, 6962588, 6964373, +6969619, 6987891, 6994579, 7001267, 7019539, 7026227, 7028504, 7030781, +7037128, 7043816, 7046093, 7048370, 7054717, 7072989, 7079336, 7085683, +7103272, 7109960, 7112237, 7114514, 7120861, 7123138, 7123730, 7124322, +7126107, 7128384, 7128976, 7129568, 7131353, 7137700, 7139485, 7141270, +7146516, 7153204, 7155481, 7157758, 7164105, 7166382, 7166974, 7167566, +7169351, 7171628, 7172220, 7172812, 7174597, 7180944, 7182729, 7184514, +7189760, 7208032, 7214379, 7220726, 7238315, 7244662, 7246447, 7248232, +7253478, 7259825, 7261610, 7263395, 7268641, 7286230, 7291476, 7296722, diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x0.inc b/src/core/short_code/internal/offset/constant/offset_0x0.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x0.inc rename to src/core/short_code/internal/offset/constant/offset_0x0.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x1.inc b/src/core/short_code/internal/offset/constant/offset_0x1.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x1.inc rename to src/core/short_code/internal/offset/constant/offset_0x1.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x2.inc b/src/core/short_code/internal/offset/constant/offset_0x2.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x2.inc rename to src/core/short_code/internal/offset/constant/offset_0x2.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x4.inc b/src/core/short_code/internal/offset/constant/offset_0x4.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x4.inc rename to src/core/short_code/internal/offset/constant/offset_0x4.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x5.inc b/src/core/short_code/internal/offset/constant/offset_0x5.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x5.inc rename to src/core/short_code/internal/offset/constant/offset_0x5.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x6.inc b/src/core/short_code/internal/offset/constant/offset_0x6.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x6.inc rename to src/core/short_code/internal/offset/constant/offset_0x6.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x8.inc b/src/core/short_code/internal/offset/constant/offset_0x8.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x8.inc rename to src/core/short_code/internal/offset/constant/offset_0x8.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0x9.inc b/src/core/short_code/internal/offset/constant/offset_0x9.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0x9.inc rename to src/core/short_code/internal/offset/constant/offset_0x9.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0xA.inc b/src/core/short_code/internal/offset/constant/offset_0xA.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0xA.inc rename to src/core/short_code/internal/offset/constant/offset_0xA.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0xC.inc b/src/core/short_code/internal/offset/constant/offset_0xC.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0xC.inc rename to src/core/short_code/internal/offset/constant/offset_0xC.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0xD.inc b/src/core/short_code/internal/offset/constant/offset_0xD.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0xD.inc rename to src/core/short_code/internal/offset/constant/offset_0xD.inc diff --git a/src/core/short_code/internal/offset/range_prefix/offset_0xE.inc b/src/core/short_code/internal/offset/constant/offset_0xE.inc similarity index 100% rename from src/core/short_code/internal/offset/range_prefix/offset_0xE.inc rename to src/core/short_code/internal/offset/constant/offset_0xE.inc diff --git a/src/core/short_code/internal/offset/offset.h b/src/core/short_code/internal/offset/offset.h new file mode 100644 index 0000000..85c7f6a --- /dev/null +++ b/src/core/short_code/internal/offset/offset.h @@ -0,0 +1,68 @@ +#pragma once + +#include + +#include "utils/utility.h" + +namespace klotski::codec { + +/// This is the index for basic ranges, and its position (0 ~ 7311884) in all +/// basic ranges is located according to the first 12-bit (0 ~ 4095) within the +/// 32-bit `range`. + +constexpr auto RANGES_GLOBAL_OFFSET = std::to_array({ + #include "constant/offset.inc" +}); + +/// This is the index for the range prefix. Given the case `head` and the first +/// 12-bit (0 ~ 4095) of the `range`, you can get the positions of all cases in +/// the current `head`. That is, according to the position of 2x2 block and the +/// `range`, the short code range is obtained. + +constexpr auto RANGES_SUBSET_OFFSET = std::to_array({ + std::to_array({ + #include "constant/offset_0x0.inc" + }), + std::to_array({ + #include "constant/offset_0x1.inc" + }), + std::to_array({ + #include "constant/offset_0x2.inc" + }), + {}, // offset_0x3 + + std::to_array({ + #include "constant/offset_0x4.inc" + }), + std::to_array({ + #include "constant/offset_0x5.inc" + }), + std::to_array({ + #include "constant/offset_0x6.inc" + }), + {}, // offset_0x7 + + std::to_array({ + #include "constant/offset_0x8.inc" + }), + std::to_array({ + #include "constant/offset_0x9.inc" + }), + std::to_array({ + #include "constant/offset_0xA.inc" + }), + {}, // offset_0xB + + std::to_array({ + #include "constant/offset_0xC.inc" + }), + std::to_array({ + #include "constant/offset_0xD.inc" + }), + std::to_array({ + #include "constant/offset_0xE.inc" + }), + {}, // offset_0xF +}); + +} // namespace klotski::codec diff --git a/src/core/short_code/internal/offset/range_prefix.h b/src/core/short_code/internal/offset/range_prefix.h deleted file mode 100644 index 6747994..0000000 --- a/src/core/short_code/internal/offset/range_prefix.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -/// This is the index for the range prefix. Given the case `head` and the first -/// 12-bit (0 ~ 4095) of the `range`, you can get the positions of all cases in -/// the current `head`. That is, according to the position of 2x2 block and the -/// `range`, the short code range is obtained. - -#include - -namespace klotski::codec::offset { - -// TODO: using std::array -constexpr uint32_t RANGE_PREFIX_OFFSET[16][4096] = {{ -#include "range_prefix/offset_0x0.inc" -}, { -#include "range_prefix/offset_0x1.inc" -}, { -#include "range_prefix/offset_0x2.inc" -}, { -/// --------------- 0x3 --------------- -}, { -#include "range_prefix/offset_0x4.inc" -}, { -#include "range_prefix/offset_0x5.inc" -}, { -#include "range_prefix/offset_0x6.inc" -}, { -/// --------------- 0x7 --------------- -}, { -#include "range_prefix/offset_0x8.inc" -}, { -#include "range_prefix/offset_0x9.inc" -}, { -#include "range_prefix/offset_0xA.inc" -}, { -/// --------------- 0xB --------------- -}, { -#include "range_prefix/offset_0xC.inc" -}, { -#include "range_prefix/offset_0xD.inc" -}, { -#include "range_prefix/offset_0xE.inc" -}, { -/// --------------- 0xF --------------- -}}; - -} // namespace klotski::codec::offset