// Copyright (c) 2024 Karl Gaissmaier // SPDX-License-Identifier: MIT package bart import "cmp" // Please read the ART paper ./doc/artlookup.pdf // to understand the baseIndex algorithm. // hostMasks as lookup table var hostMasks = []uint8{ 0b1111_1111, // bits == 0 0b0111_1111, // bits == 1 0b0011_1111, // bits == 2 0b0001_1111, // bits == 3 0b0000_1111, // bits == 4 0b0000_0111, // bits == 5 0b0000_0011, // bits == 6 0b0000_0001, // bits == 7 0b0000_0000, // bits == 8 } func netMask(mask int) uint8 { return ^hostMasks[uint8(mask)] } const ( // baseIndex of the first host route: prefixToBaseIndex(0,8) firstHostIndex = 0b1_0000_0000 // 256 // baseIndex of the last host route: prefixToBaseIndex(255,8) //nolint:unused lastHostIndex = 0b1_1111_1111 // 511 ) // prefixToBaseIndex, maps a prefix table as a 'complete binary tree'. // This is the so-called baseIndex a.k.a heapFunc: func prefixToBaseIndex(octet byte, prefixLen int) uint { return uint(octet>>(strideLen-prefixLen)) + (1 << prefixLen) } // octetToBaseIndex, just prefixToBaseIndex(octet, 8), a.k.a host routes // but faster, use it for host routes in Lookup. func octetToBaseIndex(octet byte) uint { return uint(octet) + firstHostIndex // just: octet + 256 } // baseIndexToPrefixLen, calc the bits from baseIndex and octect depth func baseIndexToPrefixLen(baseIdx uint, depth int) int { _, pfxLen := baseIndexToPrefix(baseIdx) return depth*strideLen + pfxLen } // hostRoutesByIndex, get range of host routes for this idx. // // idx: 72 // prefix: 32/6 // lower: 256 + 32 = 288 // upper: 256 + (32 | 0b0000_0011) = 291 // // Use the pre computed lookup table. // // func hostRoutesByIndex(idx uint) (uint, uint) { // octet, bits := baseIndexToPrefix(idx) // return octetToBaseIndex(octet), octetToBaseIndex(octet | hostMasks[bits]) // } func hostRoutesByIndex(idx uint) (uint, uint) { item := baseIdxLookupTbl[idx] return uint(item.lower), uint(item.upper) } // baseIndexToPrefix returns the octet and prefix len of baseIdx. // It's the inverse to prefixToBaseIndex. // // Use the pre computed lookup table, bits.LeadingZeros is too slow. // // func baseIndexToPrefix(baseIdx uint) (octet byte, pfxLen int) { // nlz := bits.LeadingZeros(baseIdx) // pfxLen = strconv.IntSize - nlz - 1 // octet = (baseIdx & (0xFF >> (8 - pfxLen))) << (8 - pfxLen) // return octet, pfxLen // } func baseIndexToPrefix(baseIdx uint) (octet byte, pfxLen int) { item := baseIdxLookupTbl[baseIdx] return item.octet, int(item.bits) } // cmpIndexRank, compare SortFunc to sort indexes in prefix sort order. func cmpIndexRank(a, b uint) int { return cmp.Compare(baseIdxLookupTbl[a].rank, baseIdxLookupTbl[b].rank) } // baseIdxLookupTbl // // octet, bits, // host route boundaries, // prefix sort rank // // as lookup table. var baseIdxLookupTbl = [512]struct { octet byte bits int8 lower uint16 // host route lower bound upper uint16 // host route upper bound rank uint16 // prefix sort rank }{ {0, -1, 0, 0, 0}, // idx == 0 invalid! {0, 0, 256, 511, 1}, // idx == 1 {0, 1, 256, 383, 2}, // idx == 2 {128, 1, 384, 511, 257}, // idx == 3 {0, 2, 256, 319, 3}, // idx == 4 {64, 2, 320, 383, 130}, // idx == 5 {128, 2, 384, 447, 258}, // idx == 6 {192, 2, 448, 511, 385}, // idx == 7 {0, 3, 256, 287, 4}, // idx == 8 {32, 3, 288, 319, 67}, // idx == 9 {64, 3, 320, 351, 131}, // idx == 10 {96, 3, 352, 383, 194}, // idx == 11 {128, 3, 384, 415, 259}, // idx == 12 {160, 3, 416, 447, 322}, // idx == 13 {192, 3, 448, 479, 386}, // idx == 14 {224, 3, 480, 511, 449}, // idx == 15 {0, 4, 256, 271, 5}, // idx == 16 {16, 4, 272, 287, 36}, // idx == 17 {32, 4, 288, 303, 68}, // idx == 18 {48, 4, 304, 319, 99}, // idx == 19 {64, 4, 320, 335, 132}, // idx == 20 {80, 4, 336, 351, 163}, // idx == 21 {96, 4, 352, 367, 195}, // idx == 22 {112, 4, 368, 383, 226}, // idx == 23 {128, 4, 384, 399, 260}, // idx == 24 {144, 4, 400, 415, 291}, // idx == 25 {160, 4, 416, 431, 323}, // idx == 26 {176, 4, 432, 447, 354}, // idx == 27 {192, 4, 448, 463, 387}, // idx == 28 {208, 4, 464, 479, 418}, // idx == 29 {224, 4, 480, 495, 450}, // idx == 30 {240, 4, 496, 511, 481}, // idx == 31 {0, 5, 256, 263, 6}, // idx == 32 {8, 5, 264, 271, 21}, // idx == 33 {16, 5, 272, 279, 37}, // idx == 34 {24, 5, 280, 287, 52}, // idx == 35 {32, 5, 288, 295, 69}, // idx == 36 {40, 5, 296, 303, 84}, // idx == 37 {48, 5, 304, 311, 100}, // idx == 38 {56, 5, 312, 319, 115}, // idx == 39 {64, 5, 320, 327, 133}, // idx == 40 {72, 5, 328, 335, 148}, // idx == 41 {80, 5, 336, 343, 164}, // idx == 42 {88, 5, 344, 351, 179}, // idx == 43 {96, 5, 352, 359, 196}, // idx == 44 {104, 5, 360, 367, 211}, // idx == 45 {112, 5, 368, 375, 227}, // idx == 46 {120, 5, 376, 383, 242}, // idx == 47 {128, 5, 384, 391, 261}, // idx == 48 {136, 5, 392, 399, 276}, // idx == 49 {144, 5, 400, 407, 292}, // idx == 50 {152, 5, 408, 415, 307}, // idx == 51 {160, 5, 416, 423, 324}, // idx == 52 {168, 5, 424, 431, 339}, // idx == 53 {176, 5, 432, 439, 355}, // idx == 54 {184, 5, 440, 447, 370}, // idx == 55 {192, 5, 448, 455, 388}, // idx == 56 {200, 5, 456, 463, 403}, // idx == 57 {208, 5, 464, 471, 419}, // idx == 58 {216, 5, 472, 479, 434}, // idx == 59 {224, 5, 480, 487, 451}, // idx == 60 {232, 5, 488, 495, 466}, // idx == 61 {240, 5, 496, 503, 482}, // idx == 62 {248, 5, 504, 511, 497}, // idx == 63 {0, 6, 256, 259, 7}, // idx == 64 {4, 6, 260, 263, 14}, // idx == 65 {8, 6, 264, 267, 22}, // idx == 66 {12, 6, 268, 271, 29}, // idx == 67 {16, 6, 272, 275, 38}, // idx == 68 {20, 6, 276, 279, 45}, // idx == 69 {24, 6, 280, 283, 53}, // idx == 70 {28, 6, 284, 287, 60}, // idx == 71 {32, 6, 288, 291, 70}, // idx == 72 {36, 6, 292, 295, 77}, // idx == 73 {40, 6, 296, 299, 85}, // idx == 74 {44, 6, 300, 303, 92}, // idx == 75 {48, 6, 304, 307, 101}, // idx == 76 {52, 6, 308, 311, 108}, // idx == 77 {56, 6, 312, 315, 116}, // idx == 78 {60, 6, 316, 319, 123}, // idx == 79 {64, 6, 320, 323, 134}, // idx == 80 {68, 6, 324, 327, 141}, // idx == 81 {72, 6, 328, 331, 149}, // idx == 82 {76, 6, 332, 335, 156}, // idx == 83 {80, 6, 336, 339, 165}, // idx == 84 {84, 6, 340, 343, 172}, // idx == 85 {88, 6, 344, 347, 180}, // idx == 86 {92, 6, 348, 351, 187}, // idx == 87 {96, 6, 352, 355, 197}, // idx == 88 {100, 6, 356, 359, 204}, // idx == 89 {104, 6, 360, 363, 212}, // idx == 90 {108, 6, 364, 367, 219}, // idx == 91 {112, 6, 368, 371, 228}, // idx == 92 {116, 6, 372, 375, 235}, // idx == 93 {120, 6, 376, 379, 243}, // idx == 94 {124, 6, 380, 383, 250}, // idx == 95 {128, 6, 384, 387, 262}, // idx == 96 {132, 6, 388, 391, 269}, // idx == 97 {136, 6, 392, 395, 277}, // idx == 98 {140, 6, 396, 399, 284}, // idx == 99 {144, 6, 400, 403, 293}, // idx == 100 {148, 6, 404, 407, 300}, // idx == 101 {152, 6, 408, 411, 308}, // idx == 102 {156, 6, 412, 415, 315}, // idx == 103 {160, 6, 416, 419, 325}, // idx == 104 {164, 6, 420, 423, 332}, // idx == 105 {168, 6, 424, 427, 340}, // idx == 106 {172, 6, 428, 431, 347}, // idx == 107 {176, 6, 432, 435, 356}, // idx == 108 {180, 6, 436, 439, 363}, // idx == 109 {184, 6, 440, 443, 371}, // idx == 110 {188, 6, 444, 447, 378}, // idx == 111 {192, 6, 448, 451, 389}, // idx == 112 {196, 6, 452, 455, 396}, // idx == 113 {200, 6, 456, 459, 404}, // idx == 114 {204, 6, 460, 463, 411}, // idx == 115 {208, 6, 464, 467, 420}, // idx == 116 {212, 6, 468, 471, 427}, // idx == 117 {216, 6, 472, 475, 435}, // idx == 118 {220, 6, 476, 479, 442}, // idx == 119 {224, 6, 480, 483, 452}, // idx == 120 {228, 6, 484, 487, 459}, // idx == 121 {232, 6, 488, 491, 467}, // idx == 122 {236, 6, 492, 495, 474}, // idx == 123 {240, 6, 496, 499, 483}, // idx == 124 {244, 6, 500, 503, 490}, // idx == 125 {248, 6, 504, 507, 498}, // idx == 126 {252, 6, 508, 511, 505}, // idx == 127 {0, 7, 256, 257, 8}, // idx == 128 {2, 7, 258, 259, 11}, // idx == 129 {4, 7, 260, 261, 15}, // idx == 130 {6, 7, 262, 263, 18}, // idx == 131 {8, 7, 264, 265, 23}, // idx == 132 {10, 7, 266, 267, 26}, // idx == 133 {12, 7, 268, 269, 30}, // idx == 134 {14, 7, 270, 271, 33}, // idx == 135 {16, 7, 272, 273, 39}, // idx == 136 {18, 7, 274, 275, 42}, // idx == 137 {20, 7, 276, 277, 46}, // idx == 138 {22, 7, 278, 279, 49}, // idx == 139 {24, 7, 280, 281, 54}, // idx == 140 {26, 7, 282, 283, 57}, // idx == 141 {28, 7, 284, 285, 61}, // idx == 142 {30, 7, 286, 287, 64}, // idx == 143 {32, 7, 288, 289, 71}, // idx == 144 {34, 7, 290, 291, 74}, // idx == 145 {36, 7, 292, 293, 78}, // idx == 146 {38, 7, 294, 295, 81}, // idx == 147 {40, 7, 296, 297, 86}, // idx == 148 {42, 7, 298, 299, 89}, // idx == 149 {44, 7, 300, 301, 93}, // idx == 150 {46, 7, 302, 303, 96}, // idx == 151 {48, 7, 304, 305, 102}, // idx == 152 {50, 7, 306, 307, 105}, // idx == 153 {52, 7, 308, 309, 109}, // idx == 154 {54, 7, 310, 311, 112}, // idx == 155 {56, 7, 312, 313, 117}, // idx == 156 {58, 7, 314, 315, 120}, // idx == 157 {60, 7, 316, 317, 124}, // idx == 158 {62, 7, 318, 319, 127}, // idx == 159 {64, 7, 320, 321, 135}, // idx == 160 {66, 7, 322, 323, 138}, // idx == 161 {68, 7, 324, 325, 142}, // idx == 162 {70, 7, 326, 327, 145}, // idx == 163 {72, 7, 328, 329, 150}, // idx == 164 {74, 7, 330, 331, 153}, // idx == 165 {76, 7, 332, 333, 157}, // idx == 166 {78, 7, 334, 335, 160}, // idx == 167 {80, 7, 336, 337, 166}, // idx == 168 {82, 7, 338, 339, 169}, // idx == 169 {84, 7, 340, 341, 173}, // idx == 170 {86, 7, 342, 343, 176}, // idx == 171 {88, 7, 344, 345, 181}, // idx == 172 {90, 7, 346, 347, 184}, // idx == 173 {92, 7, 348, 349, 188}, // idx == 174 {94, 7, 350, 351, 191}, // idx == 175 {96, 7, 352, 353, 198}, // idx == 176 {98, 7, 354, 355, 201}, // idx == 177 {100, 7, 356, 357, 205}, // idx == 178 {102, 7, 358, 359, 208}, // idx == 179 {104, 7, 360, 361, 213}, // idx == 180 {106, 7, 362, 363, 216}, // idx == 181 {108, 7, 364, 365, 220}, // idx == 182 {110, 7, 366, 367, 223}, // idx == 183 {112, 7, 368, 369, 229}, // idx == 184 {114, 7, 370, 371, 232}, // idx == 185 {116, 7, 372, 373, 236}, // idx == 186 {118, 7, 374, 375, 239}, // idx == 187 {120, 7, 376, 377, 244}, // idx == 188 {122, 7, 378, 379, 247}, // idx == 189 {124, 7, 380, 381, 251}, // idx == 190 {126, 7, 382, 383, 254}, // idx == 191 {128, 7, 384, 385, 263}, // idx == 192 {130, 7, 386, 387, 266}, // idx == 193 {132, 7, 388, 389, 270}, // idx == 194 {134, 7, 390, 391, 273}, // idx == 195 {136, 7, 392, 393, 278}, // idx == 196 {138, 7, 394, 395, 281}, // idx == 197 {140, 7, 396, 397, 285}, // idx == 198 {142, 7, 398, 399, 288}, // idx == 199 {144, 7, 400, 401, 294}, // idx == 200 {146, 7, 402, 403, 297}, // idx == 201 {148, 7, 404, 405, 301}, // idx == 202 {150, 7, 406, 407, 304}, // idx == 203 {152, 7, 408, 409, 309}, // idx == 204 {154, 7, 410, 411, 312}, // idx == 205 {156, 7, 412, 413, 316}, // idx == 206 {158, 7, 414, 415, 319}, // idx == 207 {160, 7, 416, 417, 326}, // idx == 208 {162, 7, 418, 419, 329}, // idx == 209 {164, 7, 420, 421, 333}, // idx == 210 {166, 7, 422, 423, 336}, // idx == 211 {168, 7, 424, 425, 341}, // idx == 212 {170, 7, 426, 427, 344}, // idx == 213 {172, 7, 428, 429, 348}, // idx == 214 {174, 7, 430, 431, 351}, // idx == 215 {176, 7, 432, 433, 357}, // idx == 216 {178, 7, 434, 435, 360}, // idx == 217 {180, 7, 436, 437, 364}, // idx == 218 {182, 7, 438, 439, 367}, // idx == 219 {184, 7, 440, 441, 372}, // idx == 220 {186, 7, 442, 443, 375}, // idx == 221 {188, 7, 444, 445, 379}, // idx == 222 {190, 7, 446, 447, 382}, // idx == 223 {192, 7, 448, 449, 390}, // idx == 224 {194, 7, 450, 451, 393}, // idx == 225 {196, 7, 452, 453, 397}, // idx == 226 {198, 7, 454, 455, 400}, // idx == 227 {200, 7, 456, 457, 405}, // idx == 228 {202, 7, 458, 459, 408}, // idx == 229 {204, 7, 460, 461, 412}, // idx == 230 {206, 7, 462, 463, 415}, // idx == 231 {208, 7, 464, 465, 421}, // idx == 232 {210, 7, 466, 467, 424}, // idx == 233 {212, 7, 468, 469, 428}, // idx == 234 {214, 7, 470, 471, 431}, // idx == 235 {216, 7, 472, 473, 436}, // idx == 236 {218, 7, 474, 475, 439}, // idx == 237 {220, 7, 476, 477, 443}, // idx == 238 {222, 7, 478, 479, 446}, // idx == 239 {224, 7, 480, 481, 453}, // idx == 240 {226, 7, 482, 483, 456}, // idx == 241 {228, 7, 484, 485, 460}, // idx == 242 {230, 7, 486, 487, 463}, // idx == 243 {232, 7, 488, 489, 468}, // idx == 244 {234, 7, 490, 491, 471}, // idx == 245 {236, 7, 492, 493, 475}, // idx == 246 {238, 7, 494, 495, 478}, // idx == 247 {240, 7, 496, 497, 484}, // idx == 248 {242, 7, 498, 499, 487}, // idx == 249 {244, 7, 500, 501, 491}, // idx == 250 {246, 7, 502, 503, 494}, // idx == 251 {248, 7, 504, 505, 499}, // idx == 252 {250, 7, 506, 507, 502}, // idx == 253 {252, 7, 508, 509, 506}, // idx == 254 {254, 7, 510, 511, 509}, // idx == 255 {0, 8, 256, 256, 9}, // idx == 256 -- first host route {1, 8, 257, 257, 10}, // idx == 257 {2, 8, 258, 258, 12}, // idx == 258 {3, 8, 259, 259, 13}, // idx == 259 {4, 8, 260, 260, 16}, // idx == 260 {5, 8, 261, 261, 17}, // idx == 261 {6, 8, 262, 262, 19}, // idx == 262 {7, 8, 263, 263, 20}, // idx == 263 {8, 8, 264, 264, 24}, // idx == 264 {9, 8, 265, 265, 25}, // idx == 265 {10, 8, 266, 266, 27}, // idx == 266 {11, 8, 267, 267, 28}, // idx == 267 {12, 8, 268, 268, 31}, // idx == 268 {13, 8, 269, 269, 32}, // idx == 269 {14, 8, 270, 270, 34}, // idx == 270 {15, 8, 271, 271, 35}, // idx == 271 {16, 8, 272, 272, 40}, // idx == 272 {17, 8, 273, 273, 41}, // idx == 273 {18, 8, 274, 274, 43}, // idx == 274 {19, 8, 275, 275, 44}, // idx == 275 {20, 8, 276, 276, 47}, // idx == 276 {21, 8, 277, 277, 48}, // idx == 277 {22, 8, 278, 278, 50}, // idx == 278 {23, 8, 279, 279, 51}, // idx == 279 {24, 8, 280, 280, 55}, // idx == 280 {25, 8, 281, 281, 56}, // idx == 281 {26, 8, 282, 282, 58}, // idx == 282 {27, 8, 283, 283, 59}, // idx == 283 {28, 8, 284, 284, 62}, // idx == 284 {29, 8, 285, 285, 63}, // idx == 285 {30, 8, 286, 286, 65}, // idx == 286 {31, 8, 287, 287, 66}, // idx == 287 {32, 8, 288, 288, 72}, // idx == 288 {33, 8, 289, 289, 73}, // idx == 289 {34, 8, 290, 290, 75}, // idx == 290 {35, 8, 291, 291, 76}, // idx == 291 {36, 8, 292, 292, 79}, // idx == 292 {37, 8, 293, 293, 80}, // idx == 293 {38, 8, 294, 294, 82}, // idx == 294 {39, 8, 295, 295, 83}, // idx == 295 {40, 8, 296, 296, 87}, // idx == 296 {41, 8, 297, 297, 88}, // idx == 297 {42, 8, 298, 298, 90}, // idx == 298 {43, 8, 299, 299, 91}, // idx == 299 {44, 8, 300, 300, 94}, // idx == 300 {45, 8, 301, 301, 95}, // idx == 301 {46, 8, 302, 302, 97}, // idx == 302 {47, 8, 303, 303, 98}, // idx == 303 {48, 8, 304, 304, 103}, // idx == 304 {49, 8, 305, 305, 104}, // idx == 305 {50, 8, 306, 306, 106}, // idx == 306 {51, 8, 307, 307, 107}, // idx == 307 {52, 8, 308, 308, 110}, // idx == 308 {53, 8, 309, 309, 111}, // idx == 309 {54, 8, 310, 310, 113}, // idx == 310 {55, 8, 311, 311, 114}, // idx == 311 {56, 8, 312, 312, 118}, // idx == 312 {57, 8, 313, 313, 119}, // idx == 313 {58, 8, 314, 314, 121}, // idx == 314 {59, 8, 315, 315, 122}, // idx == 315 {60, 8, 316, 316, 125}, // idx == 316 {61, 8, 317, 317, 126}, // idx == 317 {62, 8, 318, 318, 128}, // idx == 318 {63, 8, 319, 319, 129}, // idx == 319 {64, 8, 320, 320, 136}, // idx == 320 {65, 8, 321, 321, 137}, // idx == 321 {66, 8, 322, 322, 139}, // idx == 322 {67, 8, 323, 323, 140}, // idx == 323 {68, 8, 324, 324, 143}, // idx == 324 {69, 8, 325, 325, 144}, // idx == 325 {70, 8, 326, 326, 146}, // idx == 326 {71, 8, 327, 327, 147}, // idx == 327 {72, 8, 328, 328, 151}, // idx == 328 {73, 8, 329, 329, 152}, // idx == 329 {74, 8, 330, 330, 154}, // idx == 330 {75, 8, 331, 331, 155}, // idx == 331 {76, 8, 332, 332, 158}, // idx == 332 {77, 8, 333, 333, 159}, // idx == 333 {78, 8, 334, 334, 161}, // idx == 334 {79, 8, 335, 335, 162}, // idx == 335 {80, 8, 336, 336, 167}, // idx == 336 {81, 8, 337, 337, 168}, // idx == 337 {82, 8, 338, 338, 170}, // idx == 338 {83, 8, 339, 339, 171}, // idx == 339 {84, 8, 340, 340, 174}, // idx == 340 {85, 8, 341, 341, 175}, // idx == 341 {86, 8, 342, 342, 177}, // idx == 342 {87, 8, 343, 343, 178}, // idx == 343 {88, 8, 344, 344, 182}, // idx == 344 {89, 8, 345, 345, 183}, // idx == 345 {90, 8, 346, 346, 185}, // idx == 346 {91, 8, 347, 347, 186}, // idx == 347 {92, 8, 348, 348, 189}, // idx == 348 {93, 8, 349, 349, 190}, // idx == 349 {94, 8, 350, 350, 192}, // idx == 350 {95, 8, 351, 351, 193}, // idx == 351 {96, 8, 352, 352, 199}, // idx == 352 {97, 8, 353, 353, 200}, // idx == 353 {98, 8, 354, 354, 202}, // idx == 354 {99, 8, 355, 355, 203}, // idx == 355 {100, 8, 356, 356, 206}, // idx == 356 {101, 8, 357, 357, 207}, // idx == 357 {102, 8, 358, 358, 209}, // idx == 358 {103, 8, 359, 359, 210}, // idx == 359 {104, 8, 360, 360, 214}, // idx == 360 {105, 8, 361, 361, 215}, // idx == 361 {106, 8, 362, 362, 217}, // idx == 362 {107, 8, 363, 363, 218}, // idx == 363 {108, 8, 364, 364, 221}, // idx == 364 {109, 8, 365, 365, 222}, // idx == 365 {110, 8, 366, 366, 224}, // idx == 366 {111, 8, 367, 367, 225}, // idx == 367 {112, 8, 368, 368, 230}, // idx == 368 {113, 8, 369, 369, 231}, // idx == 369 {114, 8, 370, 370, 233}, // idx == 370 {115, 8, 371, 371, 234}, // idx == 371 {116, 8, 372, 372, 237}, // idx == 372 {117, 8, 373, 373, 238}, // idx == 373 {118, 8, 374, 374, 240}, // idx == 374 {119, 8, 375, 375, 241}, // idx == 375 {120, 8, 376, 376, 245}, // idx == 376 {121, 8, 377, 377, 246}, // idx == 377 {122, 8, 378, 378, 248}, // idx == 378 {123, 8, 379, 379, 249}, // idx == 379 {124, 8, 380, 380, 252}, // idx == 380 {125, 8, 381, 381, 253}, // idx == 381 {126, 8, 382, 382, 255}, // idx == 382 {127, 8, 383, 383, 256}, // idx == 383 {128, 8, 384, 384, 264}, // idx == 384 {129, 8, 385, 385, 265}, // idx == 385 {130, 8, 386, 386, 267}, // idx == 386 {131, 8, 387, 387, 268}, // idx == 387 {132, 8, 388, 388, 271}, // idx == 388 {133, 8, 389, 389, 272}, // idx == 389 {134, 8, 390, 390, 274}, // idx == 390 {135, 8, 391, 391, 275}, // idx == 391 {136, 8, 392, 392, 279}, // idx == 392 {137, 8, 393, 393, 280}, // idx == 393 {138, 8, 394, 394, 282}, // idx == 394 {139, 8, 395, 395, 283}, // idx == 395 {140, 8, 396, 396, 286}, // idx == 396 {141, 8, 397, 397, 287}, // idx == 397 {142, 8, 398, 398, 289}, // idx == 398 {143, 8, 399, 399, 290}, // idx == 399 {144, 8, 400, 400, 295}, // idx == 400 {145, 8, 401, 401, 296}, // idx == 401 {146, 8, 402, 402, 298}, // idx == 402 {147, 8, 403, 403, 299}, // idx == 403 {148, 8, 404, 404, 302}, // idx == 404 {149, 8, 405, 405, 303}, // idx == 405 {150, 8, 406, 406, 305}, // idx == 406 {151, 8, 407, 407, 306}, // idx == 407 {152, 8, 408, 408, 310}, // idx == 408 {153, 8, 409, 409, 311}, // idx == 409 {154, 8, 410, 410, 313}, // idx == 410 {155, 8, 411, 411, 314}, // idx == 411 {156, 8, 412, 412, 317}, // idx == 412 {157, 8, 413, 413, 318}, // idx == 413 {158, 8, 414, 414, 320}, // idx == 414 {159, 8, 415, 415, 321}, // idx == 415 {160, 8, 416, 416, 327}, // idx == 416 {161, 8, 417, 417, 328}, // idx == 417 {162, 8, 418, 418, 330}, // idx == 418 {163, 8, 419, 419, 331}, // idx == 419 {164, 8, 420, 420, 334}, // idx == 420 {165, 8, 421, 421, 335}, // idx == 421 {166, 8, 422, 422, 337}, // idx == 422 {167, 8, 423, 423, 338}, // idx == 423 {168, 8, 424, 424, 342}, // idx == 424 {169, 8, 425, 425, 343}, // idx == 425 {170, 8, 426, 426, 345}, // idx == 426 {171, 8, 427, 427, 346}, // idx == 427 {172, 8, 428, 428, 349}, // idx == 428 {173, 8, 429, 429, 350}, // idx == 429 {174, 8, 430, 430, 352}, // idx == 430 {175, 8, 431, 431, 353}, // idx == 431 {176, 8, 432, 432, 358}, // idx == 432 {177, 8, 433, 433, 359}, // idx == 433 {178, 8, 434, 434, 361}, // idx == 434 {179, 8, 435, 435, 362}, // idx == 435 {180, 8, 436, 436, 365}, // idx == 436 {181, 8, 437, 437, 366}, // idx == 437 {182, 8, 438, 438, 368}, // idx == 438 {183, 8, 439, 439, 369}, // idx == 439 {184, 8, 440, 440, 373}, // idx == 440 {185, 8, 441, 441, 374}, // idx == 441 {186, 8, 442, 442, 376}, // idx == 442 {187, 8, 443, 443, 377}, // idx == 443 {188, 8, 444, 444, 380}, // idx == 444 {189, 8, 445, 445, 381}, // idx == 445 {190, 8, 446, 446, 383}, // idx == 446 {191, 8, 447, 447, 384}, // idx == 447 {192, 8, 448, 448, 391}, // idx == 448 {193, 8, 449, 449, 392}, // idx == 449 {194, 8, 450, 450, 394}, // idx == 450 {195, 8, 451, 451, 395}, // idx == 451 {196, 8, 452, 452, 398}, // idx == 452 {197, 8, 453, 453, 399}, // idx == 453 {198, 8, 454, 454, 401}, // idx == 454 {199, 8, 455, 455, 402}, // idx == 455 {200, 8, 456, 456, 406}, // idx == 456 {201, 8, 457, 457, 407}, // idx == 457 {202, 8, 458, 458, 409}, // idx == 458 {203, 8, 459, 459, 410}, // idx == 459 {204, 8, 460, 460, 413}, // idx == 460 {205, 8, 461, 461, 414}, // idx == 461 {206, 8, 462, 462, 416}, // idx == 462 {207, 8, 463, 463, 417}, // idx == 463 {208, 8, 464, 464, 422}, // idx == 464 {209, 8, 465, 465, 423}, // idx == 465 {210, 8, 466, 466, 425}, // idx == 466 {211, 8, 467, 467, 426}, // idx == 467 {212, 8, 468, 468, 429}, // idx == 468 {213, 8, 469, 469, 430}, // idx == 469 {214, 8, 470, 470, 432}, // idx == 470 {215, 8, 471, 471, 433}, // idx == 471 {216, 8, 472, 472, 437}, // idx == 472 {217, 8, 473, 473, 438}, // idx == 473 {218, 8, 474, 474, 440}, // idx == 474 {219, 8, 475, 475, 441}, // idx == 475 {220, 8, 476, 476, 444}, // idx == 476 {221, 8, 477, 477, 445}, // idx == 477 {222, 8, 478, 478, 447}, // idx == 478 {223, 8, 479, 479, 448}, // idx == 479 {224, 8, 480, 480, 454}, // idx == 480 {225, 8, 481, 481, 455}, // idx == 481 {226, 8, 482, 482, 457}, // idx == 482 {227, 8, 483, 483, 458}, // idx == 483 {228, 8, 484, 484, 461}, // idx == 484 {229, 8, 485, 485, 462}, // idx == 485 {230, 8, 486, 486, 464}, // idx == 486 {231, 8, 487, 487, 465}, // idx == 487 {232, 8, 488, 488, 469}, // idx == 488 {233, 8, 489, 489, 470}, // idx == 489 {234, 8, 490, 490, 472}, // idx == 490 {235, 8, 491, 491, 473}, // idx == 491 {236, 8, 492, 492, 476}, // idx == 492 {237, 8, 493, 493, 477}, // idx == 493 {238, 8, 494, 494, 479}, // idx == 494 {239, 8, 495, 495, 480}, // idx == 495 {240, 8, 496, 496, 485}, // idx == 496 {241, 8, 497, 497, 486}, // idx == 497 {242, 8, 498, 498, 488}, // idx == 498 {243, 8, 499, 499, 489}, // idx == 499 {244, 8, 500, 500, 492}, // idx == 500 {245, 8, 501, 501, 493}, // idx == 501 {246, 8, 502, 502, 495}, // idx == 502 {247, 8, 503, 503, 496}, // idx == 503 {248, 8, 504, 504, 500}, // idx == 504 {249, 8, 505, 505, 501}, // idx == 505 {250, 8, 506, 506, 503}, // idx == 506 {251, 8, 507, 507, 504}, // idx == 507 {252, 8, 508, 508, 507}, // idx == 508 {253, 8, 509, 509, 508}, // idx == 509 {254, 8, 510, 510, 510}, // idx == 510 {255, 8, 511, 511, 511}, // idx == 511 }