gitlab.com/aquachain/aquachain@v1.17.16-rc3.0.20221018032414-e3ddf1e1c055/consensus/aquahash/algorithm.go (about) 1 // Copyright 2018 The aquachain Authors 2 // This file is part of the aquachain library. 3 // 4 // The aquachain library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The aquachain library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the aquachain library. If not, see <http://www.gnu.org/licenses/>. 16 17 package aquahash 18 19 import ( 20 "encoding/binary" 21 "hash" 22 "reflect" 23 "runtime" 24 "sync" 25 "sync/atomic" 26 "time" 27 "unsafe" 28 29 "gitlab.com/aquachain/aquachain/common" 30 "gitlab.com/aquachain/aquachain/common/bitutil" 31 "gitlab.com/aquachain/aquachain/common/log" 32 "gitlab.com/aquachain/aquachain/crypto" 33 "gitlab.com/aquachain/aquachain/crypto/sha3" 34 ) 35 36 const ( 37 datasetInitBytes = 1 << 30 // Bytes in dataset at genesis 38 datasetGrowthBytes = 1 << 23 // Dataset growth per epoch 39 cacheInitBytes = 1 << 24 // Bytes in cache at genesis 40 cacheGrowthBytes = 1 << 17 // Cache growth per epoch 41 epochLength = 30000 // Blocks per epoch 42 mixBytes = 128 // Width of mix 43 hashBytes = 64 // Hash length in bytes 44 hashWords = 16 // Number of 32 bit ints in a hash 45 datasetParents = 256 // Number of parents of each dataset element 46 cacheRounds = 3 // Number of rounds in cache production 47 loopAccesses = 64 // Number of accesses in hashimoto loop 48 ) 49 50 // hasher is a repetitive hasher allowing the same hash data structures to be 51 // reused between hash runs instead of requiring new ones to be created. 52 type hasher func(dest []byte, data []byte) 53 54 // makeHasher creates a repetitive hasher, allowing the same hash data structures 55 // to be reused between hash runs instead of requiring new ones to be created. 56 // The returned function is not thread safe! 57 func makeHasher(h hash.Hash) hasher { 58 return func(dest []byte, data []byte) { 59 h.Write(data) 60 h.Sum(dest[:0]) 61 h.Reset() 62 } 63 } 64 65 // seedHash is the seed to use for generating a verification cache and the mining 66 // dataset. 67 func seedHash(block uint64, version byte) []byte { 68 if version > 1 { 69 return common.BytesToHash([]byte{version}).Bytes() 70 } 71 seed := make([]byte, 32) 72 if block < epochLength { 73 return seed 74 } 75 keccak256 := makeHasher(sha3.NewKeccak256()) 76 for i := 0; i < int(block/epochLength); i++ { 77 keccak256(seed, seed) 78 } 79 return seed 80 } 81 82 // generateCache creates a verification cache of a given size for an input seed. 83 // The cache production process involves first sequentially filling up 32 MB of 84 // memory, then performing two passes of Sergio Demian Lerner's RandMemoHash 85 // algorithm from Strict Memory Hard Hashing Functions (2014). The output is a 86 // set of 524288 64-byte values. 87 // This method places the result into dest in machine byte order. 88 func generateCache(dest []uint32, epoch uint64, seed []byte) { 89 // Print some debug logs to allow analysis on low end devices 90 logger := log.New("epoch", epoch) 91 92 start := time.Now() 93 defer func() { 94 elapsed := time.Since(start) 95 96 logFn := logger.Debug 97 if elapsed > 3*time.Second { 98 logFn = logger.Info 99 } 100 logFn("Generated aquahash verification cache", "elapsed", common.PrettyDuration(elapsed)) 101 }() 102 // Convert our destination slice to a byte buffer 103 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 104 header.Len *= 4 105 header.Cap *= 4 106 cache := *(*[]byte)(unsafe.Pointer(&header)) 107 108 // Calculate the number of theoretical rows (we'll store in one buffer nonetheless) 109 size := uint64(len(cache)) 110 rows := int(size) / hashBytes 111 112 // Start a monitoring goroutine to report progress on low end devices 113 var progress uint32 114 115 done := make(chan struct{}) 116 defer close(done) 117 118 go func() { 119 for { 120 select { 121 case <-done: 122 return 123 case <-time.After(3 * time.Second): 124 logger.Info("Generating aquahash verification cache", "percentage", atomic.LoadUint32(&progress)*100/uint32(rows)/4, "elapsed", common.PrettyDuration(time.Since(start))) 125 } 126 } 127 }() 128 // Create a hasher to reuse between invocations 129 keccak512 := makeHasher(sha3.NewKeccak512()) 130 131 // Sequentially produce the initial dataset 132 keccak512(cache, seed) 133 for offset := uint64(hashBytes); offset < size; offset += hashBytes { 134 keccak512(cache[offset:], cache[offset-hashBytes:offset]) 135 atomic.AddUint32(&progress, 1) 136 } 137 // Use a low-round version of randmemohash 138 temp := make([]byte, hashBytes) 139 140 for i := 0; i < cacheRounds; i++ { 141 for j := 0; j < rows; j++ { 142 var ( 143 srcOff = ((j - 1 + rows) % rows) * hashBytes 144 dstOff = j * hashBytes 145 xorOff = (binary.LittleEndian.Uint32(cache[dstOff:]) % uint32(rows)) * hashBytes 146 ) 147 bitutil.XORBytes(temp, cache[srcOff:srcOff+hashBytes], cache[xorOff:xorOff+hashBytes]) 148 keccak512(cache[dstOff:], temp) 149 150 atomic.AddUint32(&progress, 1) 151 } 152 } 153 // Swap the byte order on big endian systems and return 154 if !isLittleEndian() { 155 swap(cache) 156 } 157 } 158 159 // swap changes the byte order of the buffer assuming a uint32 representation. 160 func swap(buffer []byte) { 161 for i := 0; i < len(buffer); i += 4 { 162 binary.BigEndian.PutUint32(buffer[i:], binary.LittleEndian.Uint32(buffer[i:])) 163 } 164 } 165 166 // fnv is an algorithm inspired by the FNV hash, which in some cases is used as 167 // a non-associative substitute for XOR. Note that we multiply the prime with 168 // the full 32-bit input, in contrast with the FNV-1 spec which multiplies the 169 // prime with one byte (octet) in turn. 170 func fnv(a, b uint32) uint32 { 171 return a*0x01000193 ^ b 172 } 173 174 // fnvHash mixes in data into mix using the aquahash fnv method. 175 func fnvHash(mix []uint32, data []uint32) { 176 for i := 0; i < len(mix); i++ { 177 mix[i] = mix[i]*0x01000193 ^ data[i] 178 } 179 } 180 181 // generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, 182 // and hashes that to compute a single dataset node. 183 func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte { 184 // Calculate the number of theoretical rows (we use one buffer nonetheless) 185 rows := uint32(len(cache) / hashWords) 186 187 // Initialize the mix 188 mix := make([]byte, hashBytes) 189 190 binary.LittleEndian.PutUint32(mix, cache[(index%rows)*hashWords]^index) 191 for i := 1; i < hashWords; i++ { 192 binary.LittleEndian.PutUint32(mix[i*4:], cache[(index%rows)*hashWords+uint32(i)]) 193 } 194 keccak512(mix, mix) 195 196 // Convert the mix to uint32s to avoid constant bit shifting 197 intMix := make([]uint32, hashWords) 198 for i := 0; i < len(intMix); i++ { 199 intMix[i] = binary.LittleEndian.Uint32(mix[i*4:]) 200 } 201 // fnv it with a lot of random cache nodes based on index 202 for i := uint32(0); i < datasetParents; i++ { 203 parent := fnv(index^i, intMix[i%16]) % rows 204 fnvHash(intMix, cache[parent*hashWords:]) 205 } 206 // Flatten the uint32 mix into a binary one and return 207 for i, val := range intMix { 208 binary.LittleEndian.PutUint32(mix[i*4:], val) 209 } 210 keccak512(mix, mix) 211 return mix 212 } 213 214 // generateDataset generates the entire aquahash dataset for mining. 215 // This method places the result into dest in machine byte order. 216 func generateDataset(dest []uint32, epoch uint64, cache []uint32) { 217 // Print some debug logs to allow analysis on low end devices 218 logger := log.New("epoch", epoch) 219 220 start := time.Now() 221 defer func() { 222 elapsed := time.Since(start) 223 224 logFn := logger.Debug 225 if elapsed > 3*time.Second { 226 logFn = logger.Info 227 } 228 logFn("Generated aquahash verification cache", "elapsed", common.PrettyDuration(elapsed)) 229 }() 230 231 // Figure out whether the bytes need to be swapped for the machine 232 swapped := !isLittleEndian() 233 234 // Convert our destination slice to a byte buffer 235 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 236 header.Len *= 4 237 header.Cap *= 4 238 dataset := *(*[]byte)(unsafe.Pointer(&header)) 239 240 // Generate the dataset on many goroutines since it takes a while 241 threads := runtime.NumCPU() 242 size := uint64(len(dataset)) 243 244 var pend sync.WaitGroup 245 pend.Add(threads) 246 247 var progress uint32 248 for i := 0; i < threads; i++ { 249 go func(id int) { 250 defer pend.Done() 251 252 // Create a hasher to reuse between invocations 253 keccak512 := makeHasher(sha3.NewKeccak512()) 254 255 // Calculate the data segment this thread should generate 256 batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) 257 first := uint32(id) * batch 258 limit := first + batch 259 if limit > uint32(size/hashBytes) { 260 limit = uint32(size / hashBytes) 261 } 262 // Calculate the dataset segment 263 percent := uint32(size / hashBytes / 100) 264 for index := first; index < limit; index++ { 265 item := generateDatasetItem(cache, index, keccak512) 266 if swapped { 267 swap(item) 268 } 269 copy(dataset[index*hashBytes:], item) 270 271 if status := atomic.AddUint32(&progress, 1); status%percent == 0 { 272 logger.Info("Generating DAG in progress", "percentage", uint64(status*100)/(size/hashBytes), "elapsed", common.PrettyDuration(time.Since(start))) 273 } 274 } 275 }(i) 276 } 277 // Wait for all the generators to finish and return 278 pend.Wait() 279 } 280 281 // hashimoto aggregates data from the full dataset in order to produce our final 282 // value for a particular header hash and nonce. 283 func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte) { 284 // Calculate the number of theoretical rows (we use one buffer nonetheless) 285 rows := uint32(size / mixBytes) 286 287 // Combine header+nonce into a 64 byte seed 288 seed := make([]byte, 40) 289 copy(seed, hash) 290 binary.LittleEndian.PutUint64(seed[32:], nonce) 291 292 seed = crypto.Keccak512(seed) 293 seedHead := binary.LittleEndian.Uint32(seed) 294 295 // Start the mix with replicated seed 296 mix := make([]uint32, mixBytes/4) 297 for i := 0; i < len(mix); i++ { 298 mix[i] = binary.LittleEndian.Uint32(seed[i%16*4:]) 299 } 300 // Mix in random dataset nodes 301 temp := make([]uint32, len(mix)) 302 303 for i := 0; i < loopAccesses; i++ { 304 parent := fnv(uint32(i)^seedHead, mix[i%len(mix)]) % rows 305 for j := uint32(0); j < mixBytes/hashBytes; j++ { 306 copy(temp[j*hashWords:], lookup(2*parent+j)) 307 } 308 fnvHash(mix, temp) 309 } 310 // Compress mix 311 for i := 0; i < len(mix); i += 4 { 312 mix[i/4] = fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3]) 313 } 314 mix = mix[:len(mix)/4] 315 316 digest := make([]byte, common.HashLength) 317 for i, val := range mix { 318 binary.LittleEndian.PutUint32(digest[i*4:], val) 319 } 320 return digest, crypto.Keccak256(append(seed, digest...)) 321 } 322 323 // hashimotoLight aggregates data from the full dataset (using only a small 324 // in-memory cache) in order to produce our final value for a particular header 325 // hash and nonce. 326 func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 327 keccak512 := makeHasher(sha3.NewKeccak512()) 328 329 lookup := func(index uint32) []uint32 { 330 rawData := generateDatasetItem(cache, index, keccak512) 331 332 data := make([]uint32, len(rawData)/4) 333 for i := 0; i < len(data); i++ { 334 data[i] = binary.LittleEndian.Uint32(rawData[i*4:]) 335 } 336 return data 337 } 338 return hashimoto(hash, nonce, size, lookup) 339 } 340 341 // hashimotoFull aggregates data from the full dataset (using the full in-memory 342 // dataset) in order to produce our final value for a particular header hash and 343 // nonce. 344 func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 345 lookup := func(index uint32) []uint32 { 346 offset := index * hashWords 347 return dataset[offset : offset+hashWords] 348 } 349 return hashimoto(hash, nonce, uint64(len(dataset))*4, lookup) 350 } 351 352 const maxEpoch = 2048 353 354 // datasetSizes is a lookup table for the aquahash dataset size for the first 2048 355 // epochs (i.e. 61440000 blocks). 356 var datasetSizes = [maxEpoch]uint64{ 357 1073739904, 1082130304, 1090514816, 1098906752, 1107293056, 358 1115684224, 1124070016, 1132461952, 1140849536, 1149232768, 359 1157627776, 1166013824, 1174404736, 1182786944, 1191180416, 360 1199568512, 1207958912, 1216345216, 1224732032, 1233124736, 361 1241513344, 1249902464, 1258290304, 1266673792, 1275067264, 362 1283453312, 1291844992, 1300234112, 1308619904, 1317010048, 363 1325397376, 1333787776, 1342176128, 1350561664, 1358954368, 364 1367339392, 1375731584, 1384118144, 1392507008, 1400897408, 365 1409284736, 1417673344, 1426062464, 1434451072, 1442839168, 366 1451229056, 1459615616, 1468006016, 1476394112, 1484782976, 367 1493171584, 1501559168, 1509948032, 1518337664, 1526726528, 368 1535114624, 1543503488, 1551892096, 1560278656, 1568669056, 369 1577056384, 1585446272, 1593831296, 1602219392, 1610610304, 370 1619000192, 1627386752, 1635773824, 1644164224, 1652555648, 371 1660943488, 1669332608, 1677721216, 1686109312, 1694497664, 372 1702886272, 1711274624, 1719661184, 1728047744, 1736434816, 373 1744829056, 1753218944, 1761606272, 1769995904, 1778382464, 374 1786772864, 1795157888, 1803550592, 1811937664, 1820327552, 375 1828711552, 1837102976, 1845488768, 1853879936, 1862269312, 376 1870656896, 1879048064, 1887431552, 1895825024, 1904212096, 377 1912601216, 1920988544, 1929379456, 1937765504, 1946156672, 378 1954543232, 1962932096, 1971321728, 1979707264, 1988093056, 379 1996487552, 2004874624, 2013262208, 2021653888, 2030039936, 380 2038430848, 2046819968, 2055208576, 2063596672, 2071981952, 381 2080373632, 2088762752, 2097149056, 2105539712, 2113928576, 382 2122315136, 2130700672, 2139092608, 2147483264, 2155872128, 383 2164257664, 2172642176, 2181035392, 2189426048, 2197814912, 384 2206203008, 2214587264, 2222979712, 2231367808, 2239758208, 385 2248145024, 2256527744, 2264922752, 2273312128, 2281701248, 386 2290086272, 2298476672, 2306867072, 2315251072, 2323639168, 387 2332032128, 2340420224, 2348808064, 2357196416, 2365580416, 388 2373966976, 2382363008, 2390748544, 2399139968, 2407530368, 389 2415918976, 2424307328, 2432695424, 2441084288, 2449472384, 390 2457861248, 2466247808, 2474637184, 2483026816, 2491414144, 391 2499803776, 2508191872, 2516582272, 2524970368, 2533359232, 392 2541743488, 2550134144, 2558525056, 2566913408, 2575301504, 393 2583686528, 2592073856, 2600467328, 2608856192, 2617240448, 394 2625631616, 2634022016, 2642407552, 2650796416, 2659188352, 395 2667574912, 2675965312, 2684352896, 2692738688, 2701130624, 396 2709518464, 2717907328, 2726293376, 2734685056, 2743073152, 397 2751462016, 2759851648, 2768232832, 2776625536, 2785017728, 398 2793401984, 2801794432, 2810182016, 2818571648, 2826959488, 399 2835349376, 2843734144, 2852121472, 2860514432, 2868900992, 400 2877286784, 2885676928, 2894069632, 2902451584, 2910843008, 401 2919234688, 2927622784, 2936011648, 2944400768, 2952789376, 402 2961177728, 2969565568, 2977951616, 2986338944, 2994731392, 403 3003120256, 3011508352, 3019895936, 3028287104, 3036675968, 404 3045063808, 3053452928, 3061837696, 3070228352, 3078615424, 405 3087003776, 3095394944, 3103782272, 3112173184, 3120562048, 406 3128944768, 3137339264, 3145725056, 3154109312, 3162505088, 407 3170893184, 3179280256, 3187669376, 3196056704, 3204445568, 408 3212836736, 3221224064, 3229612928, 3238002304, 3246391168, 409 3254778496, 3263165824, 3271556224, 3279944576, 3288332416, 410 3296719232, 3305110912, 3313500032, 3321887104, 3330273152, 411 3338658944, 3347053184, 3355440512, 3363827072, 3372220288, 412 3380608384, 3388997504, 3397384576, 3405774208, 3414163072, 413 3422551936, 3430937984, 3439328384, 3447714176, 3456104576, 414 3464493952, 3472883584, 3481268864, 3489655168, 3498048896, 415 3506434432, 3514826368, 3523213952, 3531603584, 3539987072, 416 3548380288, 3556763264, 3565157248, 3573545344, 3581934464, 417 3590324096, 3598712704, 3607098752, 3615488384, 3623877248, 418 3632265856, 3640646528, 3649043584, 3657430144, 3665821568, 419 3674207872, 3682597504, 3690984832, 3699367808, 3707764352, 420 3716152448, 3724541056, 3732925568, 3741318016, 3749706368, 421 3758091136, 3766481536, 3774872704, 3783260032, 3791650432, 422 3800036224, 3808427648, 3816815488, 3825204608, 3833592704, 423 3841981568, 3850370432, 3858755968, 3867147904, 3875536256, 424 3883920512, 3892313728, 3900702592, 3909087872, 3917478784, 425 3925868416, 3934256512, 3942645376, 3951032192, 3959422336, 426 3967809152, 3976200064, 3984588416, 3992974976, 4001363584, 427 4009751168, 4018141312, 4026530432, 4034911616, 4043308928, 428 4051695488, 4060084352, 4068472448, 4076862848, 4085249408, 429 4093640576, 4102028416, 4110413696, 4118805632, 4127194496, 430 4135583104, 4143971968, 4152360832, 4160746112, 4169135744, 431 4177525888, 4185912704, 4194303616, 4202691968, 4211076736, 432 4219463552, 4227855488, 4236246656, 4244633728, 4253022848, 433 4261412224, 4269799808, 4278184832, 4286578048, 4294962304, 434 4303349632, 4311743104, 4320130432, 4328521088, 4336909184, 435 4345295488, 4353687424, 4362073472, 4370458496, 4378852736, 436 4387238528, 4395630208, 4404019072, 4412407424, 4420790656, 437 4429182848, 4437571456, 4445962112, 4454344064, 4462738048, 438 4471119232, 4479516544, 4487904128, 4496289664, 4504682368, 439 4513068416, 4521459584, 4529846144, 4538232704, 4546619776, 440 4555010176, 4563402112, 4571790208, 4580174464, 4588567936, 441 4596957056, 4605344896, 4613734016, 4622119808, 4630511488, 442 4638898816, 4647287936, 4655675264, 4664065664, 4672451968, 443 4680842624, 4689231488, 4697620352, 4706007424, 4714397056, 444 4722786176, 4731173248, 4739562368, 4747951744, 4756340608, 445 4764727936, 4773114496, 4781504384, 4789894784, 4798283648, 446 4806667648, 4815059584, 4823449472, 4831835776, 4840226176, 447 4848612224, 4857003392, 4865391488, 4873780096, 4882169728, 448 4890557312, 4898946944, 4907333248, 4915722368, 4924110976, 449 4932499328, 4940889728, 4949276032, 4957666432, 4966054784, 450 4974438016, 4982831488, 4991221376, 4999607168, 5007998848, 451 5016386432, 5024763776, 5033164672, 5041544576, 5049941888, 452 5058329728, 5066717056, 5075107456, 5083494272, 5091883904, 453 5100273536, 5108662144, 5117048192, 5125436032, 5133827456, 454 5142215296, 5150605184, 5158993024, 5167382144, 5175769472, 455 5184157568, 5192543872, 5200936064, 5209324928, 5217711232, 456 5226102656, 5234490496, 5242877312, 5251263872, 5259654016, 457 5268040832, 5276434304, 5284819328, 5293209728, 5301598592, 458 5309986688, 5318374784, 5326764416, 5335151488, 5343542144, 459 5351929472, 5360319872, 5368706944, 5377096576, 5385484928, 460 5393871232, 5402263424, 5410650496, 5419040384, 5427426944, 461 5435816576, 5444205952, 5452594816, 5460981376, 5469367936, 462 5477760896, 5486148736, 5494536832, 5502925952, 5511315328, 463 5519703424, 5528089984, 5536481152, 5544869504, 5553256064, 464 5561645696, 5570032768, 5578423936, 5586811264, 5595193216, 465 5603585408, 5611972736, 5620366208, 5628750464, 5637143936, 466 5645528192, 5653921408, 5662310272, 5670694784, 5679082624, 467 5687474048, 5695864448, 5704251008, 5712641408, 5721030272, 468 5729416832, 5737806208, 5746194304, 5754583936, 5762969984, 469 5771358592, 5779748224, 5788137856, 5796527488, 5804911232, 470 5813300608, 5821692544, 5830082176, 5838468992, 5846855552, 471 5855247488, 5863636096, 5872024448, 5880411008, 5888799872, 472 5897186432, 5905576832, 5913966976, 5922352768, 5930744704, 473 5939132288, 5947522432, 5955911296, 5964299392, 5972688256, 474 5981074304, 5989465472, 5997851008, 6006241408, 6014627968, 475 6023015552, 6031408256, 6039796096, 6048185216, 6056574848, 476 6064963456, 6073351808, 6081736064, 6090128768, 6098517632, 477 6106906496, 6115289216, 6123680896, 6132070016, 6140459648, 478 6148849024, 6157237376, 6165624704, 6174009728, 6182403712, 479 6190792064, 6199176064, 6207569792, 6215952256, 6224345216, 480 6232732544, 6241124224, 6249510272, 6257899136, 6266287744, 481 6274676864, 6283065728, 6291454336, 6299843456, 6308232064, 482 6316620928, 6325006208, 6333395584, 6341784704, 6350174848, 483 6358562176, 6366951296, 6375337856, 6383729536, 6392119168, 484 6400504192, 6408895616, 6417283456, 6425673344, 6434059136, 485 6442444672, 6450837376, 6459223424, 6467613056, 6476004224, 486 6484393088, 6492781952, 6501170048, 6509555072, 6517947008, 487 6526336384, 6534725504, 6543112832, 6551500672, 6559888768, 488 6568278656, 6576662912, 6585055616, 6593443456, 6601834112, 489 6610219648, 6618610304, 6626999168, 6635385472, 6643777408, 490 6652164224, 6660552832, 6668941952, 6677330048, 6685719424, 491 6694107776, 6702493568, 6710882176, 6719274112, 6727662976, 492 6736052096, 6744437632, 6752825984, 6761213824, 6769604224, 493 6777993856, 6786383488, 6794770816, 6803158144, 6811549312, 494 6819937664, 6828326528, 6836706176, 6845101696, 6853491328, 495 6861880448, 6870269312, 6878655104, 6887046272, 6895433344, 496 6903822208, 6912212864, 6920596864, 6928988288, 6937377152, 497 6945764992, 6954149248, 6962544256, 6970928768, 6979317376, 498 6987709312, 6996093824, 7004487296, 7012875392, 7021258624, 499 7029652352, 7038038912, 7046427776, 7054818944, 7063207808, 500 7071595136, 7079980928, 7088372608, 7096759424, 7105149824, 501 7113536896, 7121928064, 7130315392, 7138699648, 7147092352, 502 7155479168, 7163865728, 7172249984, 7180648064, 7189036672, 503 7197424768, 7205810816, 7214196608, 7222589824, 7230975104, 504 7239367552, 7247755904, 7256145536, 7264533376, 7272921472, 505 7281308032, 7289694848, 7298088832, 7306471808, 7314864512, 506 7323253888, 7331643008, 7340029568, 7348419712, 7356808832, 507 7365196672, 7373585792, 7381973888, 7390362752, 7398750592, 508 7407138944, 7415528576, 7423915648, 7432302208, 7440690304, 509 7449080192, 7457472128, 7465860992, 7474249088, 7482635648, 510 7491023744, 7499412608, 7507803008, 7516192384, 7524579968, 511 7532967296, 7541358464, 7549745792, 7558134656, 7566524032, 512 7574912896, 7583300992, 7591690112, 7600075136, 7608466816, 513 7616854912, 7625244544, 7633629824, 7642020992, 7650410368, 514 7658794112, 7667187328, 7675574912, 7683961984, 7692349568, 515 7700739712, 7709130368, 7717519232, 7725905536, 7734295424, 516 7742683264, 7751069056, 7759457408, 7767849088, 7776238208, 517 7784626816, 7793014912, 7801405312, 7809792128, 7818179968, 518 7826571136, 7834957184, 7843347328, 7851732352, 7860124544, 519 7868512384, 7876902016, 7885287808, 7893679744, 7902067072, 520 7910455936, 7918844288, 7927230848, 7935622784, 7944009344, 521 7952400256, 7960786048, 7969176704, 7977565312, 7985953408, 522 7994339968, 8002730368, 8011119488, 8019508096, 8027896192, 523 8036285056, 8044674688, 8053062272, 8061448832, 8069838464, 524 8078227328, 8086616704, 8095006592, 8103393664, 8111783552, 525 8120171392, 8128560256, 8136949376, 8145336704, 8153726848, 526 8162114944, 8170503296, 8178891904, 8187280768, 8195669632, 527 8204058496, 8212444544, 8220834176, 8229222272, 8237612672, 528 8246000768, 8254389376, 8262775168, 8271167104, 8279553664, 529 8287944064, 8296333184, 8304715136, 8313108352, 8321497984, 530 8329885568, 8338274432, 8346663296, 8355052928, 8363441536, 531 8371828352, 8380217984, 8388606592, 8396996224, 8405384576, 532 8413772672, 8422161536, 8430549376, 8438939008, 8447326592, 533 8455715456, 8464104832, 8472492928, 8480882048, 8489270656, 534 8497659776, 8506045312, 8514434944, 8522823808, 8531208832, 535 8539602304, 8547990656, 8556378752, 8564768384, 8573154176, 536 8581542784, 8589933952, 8598322816, 8606705024, 8615099264, 537 8623487872, 8631876992, 8640264064, 8648653952, 8657040256, 538 8665430656, 8673820544, 8682209152, 8690592128, 8698977152, 539 8707374464, 8715763328, 8724151424, 8732540032, 8740928384, 540 8749315712, 8757704576, 8766089344, 8774480768, 8782871936, 541 8791260032, 8799645824, 8808034432, 8816426368, 8824812928, 542 8833199488, 8841591424, 8849976448, 8858366336, 8866757248, 543 8875147136, 8883532928, 8891923328, 8900306816, 8908700288, 544 8917088384, 8925478784, 8933867392, 8942250368, 8950644608, 545 8959032704, 8967420544, 8975809664, 8984197504, 8992584064, 546 9000976256, 9009362048, 9017752448, 9026141312, 9034530688, 547 9042917504, 9051307904, 9059694208, 9068084864, 9076471424, 548 9084861824, 9093250688, 9101638528, 9110027648, 9118416512, 549 9126803584, 9135188096, 9143581312, 9151969664, 9160356224, 550 9168747136, 9177134464, 9185525632, 9193910144, 9202302848, 551 9210690688, 9219079552, 9227465344, 9235854464, 9244244864, 552 9252633472, 9261021824, 9269411456, 9277799296, 9286188928, 553 9294574208, 9302965888, 9311351936, 9319740032, 9328131968, 554 9336516736, 9344907392, 9353296768, 9361685888, 9370074752, 555 9378463616, 9386849408, 9395239808, 9403629184, 9412016512, 556 9420405376, 9428795008, 9437181568, 9445570688, 9453960832, 557 9462346624, 9470738048, 9479121536, 9487515008, 9495903616, 558 9504289664, 9512678528, 9521067904, 9529456256, 9537843584, 559 9546233728, 9554621312, 9563011456, 9571398784, 9579788672, 560 9588178304, 9596567168, 9604954496, 9613343104, 9621732992, 561 9630121856, 9638508416, 9646898816, 9655283584, 9663675776, 562 9672061312, 9680449664, 9688840064, 9697230464, 9705617536, 563 9714003584, 9722393984, 9730772608, 9739172224, 9747561088, 564 9755945344, 9764338816, 9772726144, 9781116544, 9789503872, 565 9797892992, 9806282624, 9814670464, 9823056512, 9831439232, 566 9839833984, 9848224384, 9856613504, 9865000576, 9873391232, 567 9881772416, 9890162816, 9898556288, 9906940544, 9915333248, 568 9923721088, 9932108672, 9940496512, 9948888448, 9957276544, 569 9965666176, 9974048384, 9982441088, 9990830464, 9999219584, 570 10007602816, 10015996544, 10024385152, 10032774016, 10041163648, 571 10049548928, 10057940096, 10066329472, 10074717824, 10083105152, 572 10091495296, 10099878784, 10108272256, 10116660608, 10125049216, 573 10133437312, 10141825664, 10150213504, 10158601088, 10166991232, 574 10175378816, 10183766144, 10192157312, 10200545408, 10208935552, 575 10217322112, 10225712768, 10234099328, 10242489472, 10250876032, 576 10259264896, 10267656064, 10276042624, 10284429184, 10292820352, 577 10301209472, 10309598848, 10317987712, 10326375296, 10334763392, 578 10343153536, 10351541632, 10359930752, 10368318592, 10376707456, 579 10385096576, 10393484672, 10401867136, 10410262144, 10418647424, 580 10427039104, 10435425664, 10443810176, 10452203648, 10460589952, 581 10468982144, 10477369472, 10485759104, 10494147712, 10502533504, 582 10510923392, 10519313536, 10527702656, 10536091264, 10544478592, 583 10552867712, 10561255808, 10569642368, 10578032768, 10586423168, 584 10594805632, 10603200128, 10611588992, 10619976064, 10628361344, 585 10636754048, 10645143424, 10653531776, 10661920384, 10670307968, 586 10678696832, 10687086464, 10695475072, 10703863168, 10712246144, 587 10720639616, 10729026688, 10737414784, 10745806208, 10754190976, 588 10762581376, 10770971264, 10779356288, 10787747456, 10796135552, 589 10804525184, 10812915584, 10821301888, 10829692288, 10838078336, 590 10846469248, 10854858368, 10863247232, 10871631488, 10880023424, 591 10888412032, 10896799616, 10905188992, 10913574016, 10921964672, 592 10930352768, 10938742912, 10947132544, 10955518592, 10963909504, 593 10972298368, 10980687488, 10989074816, 10997462912, 11005851776, 594 11014241152, 11022627712, 11031017344, 11039403904, 11047793024, 595 11056184704, 11064570752, 11072960896, 11081343872, 11089737856, 596 11098128256, 11106514816, 11114904448, 11123293568, 11131680128, 597 11140065152, 11148458368, 11156845696, 11165236864, 11173624192, 598 11182013824, 11190402688, 11198790784, 11207179136, 11215568768, 599 11223957376, 11232345728, 11240734592, 11249122688, 11257511296, 600 11265899648, 11274285952, 11282675584, 11291065472, 11299452544, 601 11307842432, 11316231296, 11324616832, 11333009024, 11341395584, 602 11349782656, 11358172288, 11366560384, 11374950016, 11383339648, 603 11391721856, 11400117376, 11408504192, 11416893568, 11425283456, 604 11433671552, 11442061184, 11450444672, 11458837888, 11467226752, 605 11475611776, 11484003968, 11492392064, 11500780672, 11509169024, 606 11517550976, 11525944448, 11534335616, 11542724224, 11551111808, 607 11559500672, 11567890304, 11576277376, 11584667008, 11593056128, 608 11601443456, 11609830016, 11618221952, 11626607488, 11634995072, 609 11643387776, 11651775104, 11660161664, 11668552576, 11676940928, 610 11685330304, 11693718656, 11702106496, 11710496128, 11718882688, 611 11727273088, 11735660416, 11744050048, 11752437376, 11760824704, 612 11769216128, 11777604736, 11785991296, 11794381952, 11802770048, 613 11811157888, 11819548544, 11827932544, 11836324736, 11844713344, 614 11853100928, 11861486464, 11869879936, 11878268032, 11886656896, 615 11895044992, 11903433088, 11911822976, 11920210816, 11928600448, 616 11936987264, 11945375872, 11953761152, 11962151296, 11970543488, 617 11978928512, 11987320448, 11995708288, 12004095104, 12012486272, 618 12020875136, 12029255552, 12037652096, 12046039168, 12054429568, 619 12062813824, 12071206528, 12079594624, 12087983744, 12096371072, 620 12104759936, 12113147264, 12121534592, 12129924992, 12138314624, 621 12146703232, 12155091584, 12163481216, 12171864704, 12180255872, 622 12188643968, 12197034112, 12205424512, 12213811328, 12222199424, 623 12230590336, 12238977664, 12247365248, 12255755392, 12264143488, 624 12272531584, 12280920448, 12289309568, 12297694592, 12306086528, 625 12314475392, 12322865024, 12331253632, 12339640448, 12348029312, 626 12356418944, 12364805248, 12373196672, 12381580928, 12389969024, 627 12398357632, 12406750592, 12415138432, 12423527552, 12431916416, 628 12440304512, 12448692352, 12457081216, 12465467776, 12473859968, 629 12482245504, 12490636672, 12499025536, 12507411584, 12515801728, 630 12524190592, 12532577152, 12540966272, 12549354368, 12557743232, 631 12566129536, 12574523264, 12582911872, 12591299456, 12599688064, 632 12608074624, 12616463488, 12624845696, 12633239936, 12641631616, 633 12650019968, 12658407296, 12666795136, 12675183232, 12683574656, 634 12691960192, 12700350592, 12708740224, 12717128576, 12725515904, 635 12733906816, 12742295168, 12750680192, 12759071872, 12767460736, 636 12775848832, 12784236928, 12792626816, 12801014656, 12809404288, 637 12817789312, 12826181504, 12834568832, 12842954624, 12851345792, 638 12859732352, 12868122496, 12876512128, 12884901248, 12893289088, 639 12901672832, 12910067584, 12918455168, 12926842496, 12935232896, 640 12943620736, 12952009856, 12960396928, 12968786816, 12977176192, 641 12985563776, 12993951104, 13002341504, 13010730368, 13019115392, 642 13027506304, 13035895168, 13044272512, 13052673152, 13061062528, 643 13069446272, 13077838976, 13086227072, 13094613632, 13103000192, 644 13111393664, 13119782528, 13128157568, 13136559232, 13144945024, 645 13153329536, 13161724288, 13170111872, 13178502784, 13186884736, 646 13195279744, 13203667072, 13212057472, 13220445824, 13228832128, 647 13237221248, 13245610624, 13254000512, 13262388352, 13270777472, 648 13279166336, 13287553408, 13295943296, 13304331904, 13312719488, 649 13321108096, 13329494656, 13337885824, 13346274944, 13354663808, 650 13363051136, 13371439232, 13379825024, 13388210816, 13396605056, 651 13404995456, 13413380224, 13421771392, 13430159744, 13438546048, 652 13446937216, 13455326848, 13463708288, 13472103808, 13480492672, 653 13488875648, 13497269888, 13505657728, 13514045312, 13522435712, 654 13530824576, 13539210112, 13547599232, 13555989376, 13564379008, 655 13572766336, 13581154432, 13589544832, 13597932928, 13606320512, 656 13614710656, 13623097472, 13631477632, 13639874944, 13648264064, 657 13656652928, 13665041792, 13673430656, 13681818496, 13690207616, 658 13698595712, 13706982272, 13715373184, 13723762048, 13732150144, 659 13740536704, 13748926592, 13757316224, 13765700992, 13774090112, 660 13782477952, 13790869376, 13799259008, 13807647872, 13816036736, 661 13824425344, 13832814208, 13841202304, 13849591424, 13857978752, 662 13866368896, 13874754688, 13883145344, 13891533184, 13899919232, 663 13908311168, 13916692096, 13925085056, 13933473152, 13941866368, 664 13950253696, 13958643584, 13967032192, 13975417216, 13983807616, 665 13992197504, 14000582272, 14008973696, 14017363072, 14025752192, 666 14034137984, 14042528384, 14050918016, 14059301504, 14067691648, 667 14076083584, 14084470144, 14092852352, 14101249664, 14109635968, 668 14118024832, 14126407552, 14134804352, 14143188608, 14151577984, 669 14159968384, 14168357248, 14176741504, 14185127296, 14193521024, 670 14201911424, 14210301824, 14218685056, 14227067264, 14235467392, 671 14243855488, 14252243072, 14260630144, 14269021568, 14277409408, 672 14285799296, 14294187904, 14302571392, 14310961792, 14319353728, 673 14327738752, 14336130944, 14344518784, 14352906368, 14361296512, 674 14369685376, 14378071424, 14386462592, 14394848128, 14403230848, 675 14411627392, 14420013952, 14428402304, 14436793472, 14445181568, 676 14453569664, 14461959808, 14470347904, 14478737024, 14487122816, 677 14495511424, 14503901824, 14512291712, 14520677504, 14529064832, 678 14537456768, 14545845632, 14554234496, 14562618496, 14571011456, 679 14579398784, 14587789184, 14596172672, 14604564608, 14612953984, 680 14621341312, 14629724288, 14638120832, 14646503296, 14654897536, 681 14663284864, 14671675264, 14680061056, 14688447616, 14696835968, 682 14705228416, 14713616768, 14722003328, 14730392192, 14738784128, 683 14747172736, 14755561088, 14763947648, 14772336512, 14780725376, 684 14789110144, 14797499776, 14805892736, 14814276992, 14822670208, 685 14831056256, 14839444352, 14847836032, 14856222848, 14864612992, 686 14872997504, 14881388672, 14889775744, 14898165376, 14906553472, 687 14914944896, 14923329664, 14931721856, 14940109696, 14948497024, 688 14956887424, 14965276544, 14973663616, 14982053248, 14990439808, 689 14998830976, 15007216768, 15015605888, 15023995264, 15032385152, 690 15040768384, 15049154944, 15057549184, 15065939072, 15074328448, 691 15082715008, 15091104128, 15099493504, 15107879296, 15116269184, 692 15124659584, 15133042304, 15141431936, 15149824384, 15158214272, 693 15166602368, 15174991232, 15183378304, 15191760512, 15200154496, 694 15208542592, 15216931712, 15225323392, 15233708416, 15242098048, 695 15250489216, 15258875264, 15267265408, 15275654528, 15284043136, 696 15292431488, 15300819584, 15309208192, 15317596544, 15325986176, 697 15334374784, 15342763648, 15351151744, 15359540608, 15367929728, 698 15376318336, 15384706432, 15393092992, 15401481856, 15409869952, 699 15418258816, 15426649984, 15435037568, 15443425664, 15451815296, 700 15460203392, 15468589184, 15476979328, 15485369216, 15493755776, 701 15502146944, 15510534272, 15518924416, 15527311232, 15535699072, 702 15544089472, 15552478336, 15560866688, 15569254528, 15577642624, 703 15586031488, 15594419072, 15602809472, 15611199104, 15619586432, 704 15627975296, 15636364928, 15644753792, 15653141888, 15661529216, 705 15669918848, 15678305152, 15686696576, 15695083136, 15703474048, 706 15711861632, 15720251264, 15728636288, 15737027456, 15745417088, 707 15753804928, 15762194048, 15770582656, 15778971008, 15787358336, 708 15795747712, 15804132224, 15812523392, 15820909696, 15829300096, 709 15837691264, 15846071936, 15854466944, 15862855808, 15871244672, 710 15879634816, 15888020608, 15896409728, 15904799104, 15913185152, 711 15921577088, 15929966464, 15938354816, 15946743424, 15955129472, 712 15963519872, 15971907968, 15980296064, 15988684928, 15997073024, 713 16005460864, 16013851264, 16022241152, 16030629248, 16039012736, 714 16047406976, 16055794816, 16064181376, 16072571264, 16080957824, 715 16089346688, 16097737856, 16106125184, 16114514816, 16122904192, 716 16131292544, 16139678848, 16148066944, 16156453504, 16164839552, 717 16173236096, 16181623424, 16190012032, 16198401152, 16206790528, 718 16215177344, 16223567744, 16231956352, 16240344704, 16248731008, 719 16257117824, 16265504384, 16273898624, 16282281856, 16290668672, 720 16299064192, 16307449216, 16315842176, 16324230016, 16332613504, 721 16341006464, 16349394304, 16357783168, 16366172288, 16374561664, 722 16382951296, 16391337856, 16399726208, 16408116352, 16416505472, 723 16424892032, 16433282176, 16441668224, 16450058624, 16458448768, 724 16466836864, 16475224448, 16483613056, 16492001408, 16500391808, 725 16508779648, 16517166976, 16525555328, 16533944192, 16542330752, 726 16550719616, 16559110528, 16567497088, 16575888512, 16584274816, 727 16592665472, 16601051008, 16609442944, 16617832064, 16626218624, 728 16634607488, 16642996096, 16651385728, 16659773824, 16668163712, 729 16676552576, 16684938112, 16693328768, 16701718144, 16710095488, 730 16718492288, 16726883968, 16735272832, 16743661184, 16752049792, 731 16760436608, 16768827008, 16777214336, 16785599104, 16793992832, 732 16802381696, 16810768768, 16819151744, 16827542656, 16835934848, 733 16844323712, 16852711552, 16861101952, 16869489536, 16877876864, 734 16886265728, 16894653056, 16903044736, 16911431296, 16919821696, 735 16928207488, 16936592768, 16944987776, 16953375616, 16961763968, 736 16970152832, 16978540928, 16986929536, 16995319168, 17003704448, 737 17012096896, 17020481152, 17028870784, 17037262208, 17045649536, 738 17054039936, 17062426496, 17070814336, 17079205504, 17087592064, 739 17095978112, 17104369024, 17112759424, 17121147776, 17129536384, 740 17137926016, 17146314368, 17154700928, 17163089792, 17171480192, 741 17179864192, 17188256896, 17196644992, 17205033856, 17213423488, 742 17221811072, 17230198912, 17238588032, 17246976896, 17255360384, 743 17263754624, 17272143232, 17280530048, 17288918912, 17297309312, 744 17305696384, 17314085504, 17322475136, 17330863744, 17339252096, 745 17347640192, 17356026496, 17364413824, 17372796544, 17381190016, 746 17389583488, 17397972608, 17406360704, 17414748544, 17423135872, 747 17431527296, 17439915904, 17448303232, 17456691584, 17465081728, 748 17473468288, 17481857408, 17490247552, 17498635904, 17507022464, 749 17515409024, 17523801728, 17532189824, 17540577664, 17548966016, 750 17557353344, 17565741184, 17574131584, 17582519168, 17590907008, 751 17599296128, 17607687808, 17616076672, 17624455808, 17632852352, 752 17641238656, 17649630848, 17658018944, 17666403968, 17674794112, 753 17683178368, 17691573376, 17699962496, 17708350592, 17716739968, 754 17725126528, 17733517184, 17741898112, 17750293888, 17758673024, 755 17767070336, 17775458432, 17783848832, 17792236928, 17800625536, 756 17809012352, 17817402752, 17825785984, 17834178944, 17842563968, 757 17850955648, 17859344512, 17867732864, 17876119424, 17884511872, 758 17892900224, 17901287296, 17909677696, 17918058112, 17926451072, 759 17934843776, 17943230848, 17951609216, 17960008576, 17968397696, 760 17976784256, 17985175424, 17993564032, 18001952128, 18010339712, 761 18018728576, 18027116672, 18035503232, 18043894144, 18052283264, 762 18060672128, 18069056384, 18077449856, 18085837184, 18094225792, 763 18102613376, 18111004544, 18119388544, 18127781248, 18136170368, 764 18144558976, 18152947328, 18161336192, 18169724288, 18178108544, 765 18186498944, 18194886784, 18203275648, 18211666048, 18220048768, 766 18228444544, 18236833408, 18245220736} 767 768 // cacheSizes is a lookup table for the aquahash verification cache size for the 769 // first 2048 epochs (i.e. 61440000 blocks). 770 var cacheSizes = [maxEpoch]uint64{ 771 16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, 772 17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, 773 18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, 774 19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, 775 20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, 776 21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, 777 22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, 778 23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, 779 24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, 780 25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, 781 25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, 782 26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, 783 27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, 784 28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, 785 29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, 786 30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, 787 31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, 788 32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, 789 33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, 790 34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, 791 35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, 792 36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, 793 36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, 794 37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, 795 38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, 796 39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, 797 40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, 798 41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, 799 42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, 800 43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, 801 44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, 802 45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, 803 46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, 804 47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, 805 47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, 806 48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, 807 49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, 808 50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, 809 51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, 810 52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, 811 53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, 812 54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, 813 55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, 814 56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, 815 57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, 816 58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, 817 58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, 818 59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, 819 60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, 820 61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, 821 62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, 822 63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, 823 64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, 824 65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, 825 66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, 826 67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, 827 68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, 828 69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, 829 69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, 830 70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, 831 71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, 832 72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, 833 73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, 834 74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, 835 75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, 836 76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, 837 77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, 838 78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, 839 79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, 840 80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, 841 81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, 842 81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, 843 82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, 844 83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, 845 84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, 846 85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, 847 86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, 848 87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, 849 88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, 850 89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, 851 90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, 852 91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, 853 92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, 854 92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, 855 93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, 856 94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, 857 95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, 858 96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, 859 97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, 860 98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, 861 99352384, 99482816, 99614272, 99745472, 99876416, 100007104, 862 100138048, 100267072, 100401088, 100529984, 100662592, 100791872, 863 100925248, 101056064, 101187392, 101317952, 101449408, 101580608, 864 101711296, 101841728, 101973824, 102104896, 102235712, 102366016, 865 102498112, 102628672, 102760384, 102890432, 103021888, 103153472, 866 103284032, 103415744, 103545152, 103677248, 103808576, 103939648, 867 104070976, 104201792, 104332736, 104462528, 104594752, 104725952, 868 104854592, 104988608, 105118912, 105247808, 105381184, 105511232, 869 105643072, 105774784, 105903296, 106037056, 106167872, 106298944, 870 106429504, 106561472, 106691392, 106822592, 106954304, 107085376, 871 107216576, 107346368, 107478464, 107609792, 107739712, 107872192, 872 108003136, 108131392, 108265408, 108396224, 108527168, 108657344, 873 108789568, 108920384, 109049792, 109182272, 109312576, 109444928, 874 109572928, 109706944, 109837888, 109969088, 110099648, 110230976, 875 110362432, 110492992, 110624704, 110755264, 110886208, 111017408, 876 111148864, 111279296, 111410752, 111541952, 111673024, 111803456, 877 111933632, 112066496, 112196416, 112328512, 112457792, 112590784, 878 112715968, 112852672, 112983616, 113114944, 113244224, 113376448, 879 113505472, 113639104, 113770304, 113901376, 114031552, 114163264, 880 114294592, 114425536, 114556864, 114687424, 114818624, 114948544, 881 115080512, 115212224, 115343296, 115473472, 115605184, 115736128, 882 115867072, 115997248, 116128576, 116260288, 116391488, 116522944, 883 116652992, 116784704, 116915648, 117046208, 117178304, 117308608, 884 117440192, 117569728, 117701824, 117833024, 117964096, 118094656, 885 118225984, 118357312, 118489024, 118617536, 118749632, 118882112, 886 119012416, 119144384, 119275328, 119406016, 119537344, 119668672, 887 119798464, 119928896, 120061376, 120192832, 120321728, 120454336, 888 120584512, 120716608, 120848192, 120979136, 121109056, 121241408, 889 121372352, 121502912, 121634752, 121764416, 121895744, 122027072, 890 122157632, 122289088, 122421184, 122550592, 122682944, 122813888, 891 122945344, 123075776, 123207488, 123338048, 123468736, 123600704, 892 123731264, 123861952, 123993664, 124124608, 124256192, 124386368, 893 124518208, 124649024, 124778048, 124911296, 125041088, 125173696, 894 125303744, 125432896, 125566912, 125696576, 125829056, 125958592, 895 126090304, 126221248, 126352832, 126483776, 126615232, 126746432, 896 126876608, 127008704, 127139392, 127270336, 127401152, 127532224, 897 127663552, 127794752, 127925696, 128055232, 128188096, 128319424, 898 128449856, 128581312, 128712256, 128843584, 128973632, 129103808, 899 129236288, 129365696, 129498944, 129629888, 129760832, 129892288, 900 130023104, 130154048, 130283968, 130416448, 130547008, 130678336, 901 130807616, 130939456, 131071552, 131202112, 131331776, 131464384, 902 131594048, 131727296, 131858368, 131987392, 132120256, 132250816, 903 132382528, 132513728, 132644672, 132774976, 132905792, 133038016, 904 133168832, 133299392, 133429312, 133562048, 133692992, 133823296, 905 133954624, 134086336, 134217152, 134348608, 134479808, 134607296, 906 134741056, 134872384, 135002944, 135134144, 135265472, 135396544, 907 135527872, 135659072, 135787712, 135921472, 136052416, 136182848, 908 136313792, 136444864, 136576448, 136707904, 136837952, 136970048, 909 137099584, 137232064, 137363392, 137494208, 137625536, 137755712, 910 137887424, 138018368, 138149824, 138280256, 138411584, 138539584, 911 138672832, 138804928, 138936128, 139066688, 139196864, 139328704, 912 139460032, 139590208, 139721024, 139852864, 139984576, 140115776, 913 140245696, 140376512, 140508352, 140640064, 140769856, 140902336, 914 141032768, 141162688, 141294016, 141426496, 141556544, 141687488, 915 141819584, 141949888, 142080448, 142212544, 142342336, 142474432, 916 142606144, 142736192, 142868288, 142997824, 143129408, 143258944, 917 143392448, 143523136, 143653696, 143785024, 143916992, 144045632, 918 144177856, 144309184, 144440768, 144570688, 144701888, 144832448, 919 144965056, 145096384, 145227584, 145358656, 145489856, 145620928, 920 145751488, 145883072, 146011456, 146144704, 146275264, 146407232, 921 146538176, 146668736, 146800448, 146931392, 147062336, 147193664, 922 147324224, 147455936, 147586624, 147717056, 147848768, 147979456, 923 148110784, 148242368, 148373312, 148503232, 148635584, 148766144, 924 148897088, 149028416, 149159488, 149290688, 149420224, 149551552, 925 149683136, 149814976, 149943616, 150076352, 150208064, 150338624, 926 150470464, 150600256, 150732224, 150862784, 150993088, 151125952, 927 151254976, 151388096, 151519168, 151649728, 151778752, 151911104, 928 152042944, 152174144, 152304704, 152435648, 152567488, 152698816, 929 152828992, 152960576, 153091648, 153222976, 153353792, 153484096, 930 153616192, 153747008, 153878336, 154008256, 154139968, 154270912, 931 154402624, 154533824, 154663616, 154795712, 154926272, 155057984, 932 155188928, 155319872, 155450816, 155580608, 155712064, 155843392, 933 155971136, 156106688, 156237376, 156367424, 156499264, 156630976, 934 156761536, 156892352, 157024064, 157155008, 157284416, 157415872, 935 157545536, 157677248, 157810496, 157938112, 158071744, 158203328, 936 158334656, 158464832, 158596288, 158727616, 158858048, 158988992, 937 159121216, 159252416, 159381568, 159513152, 159645632, 159776192, 938 159906496, 160038464, 160169536, 160300352, 160430656, 160563008, 939 160693952, 160822208, 160956352, 161086784, 161217344, 161349184, 940 161480512, 161611456, 161742272, 161873216, 162002752, 162135872, 941 162266432, 162397888, 162529216, 162660032, 162790976, 162922048, 942 163052096, 163184576, 163314752, 163446592, 163577408, 163707968, 943 163839296, 163969984, 164100928, 164233024, 164364224, 164494912, 944 164625856, 164756672, 164887616, 165019072, 165150016, 165280064, 945 165412672, 165543104, 165674944, 165805888, 165936832, 166067648, 946 166198336, 166330048, 166461248, 166591552, 166722496, 166854208, 947 166985408, 167116736, 167246656, 167378368, 167508416, 167641024, 948 167771584, 167903168, 168034112, 168164032, 168295744, 168427456, 949 168557632, 168688448, 168819136, 168951616, 169082176, 169213504, 950 169344832, 169475648, 169605952, 169738048, 169866304, 169999552, 951 170131264, 170262464, 170393536, 170524352, 170655424, 170782016, 952 170917696, 171048896, 171179072, 171310784, 171439936, 171573184, 953 171702976, 171835072, 171966272, 172097216, 172228288, 172359232, 954 172489664, 172621376, 172747712, 172883264, 173014208, 173144512, 955 173275072, 173407424, 173539136, 173669696, 173800768, 173931712, 956 174063424, 174193472, 174325696, 174455744, 174586816, 174718912, 957 174849728, 174977728, 175109696, 175242688, 175374272, 175504832, 958 175636288, 175765696, 175898432, 176028992, 176159936, 176291264, 959 176422592, 176552512, 176684864, 176815424, 176946496, 177076544, 960 177209152, 177340096, 177470528, 177600704, 177731648, 177864256, 961 177994816, 178126528, 178257472, 178387648, 178518464, 178650176, 962 178781888, 178912064, 179044288, 179174848, 179305024, 179436736, 963 179568448, 179698496, 179830208, 179960512, 180092608, 180223808, 964 180354752, 180485696, 180617152, 180748096, 180877504, 181009984, 965 181139264, 181272512, 181402688, 181532608, 181663168, 181795136, 966 181926592, 182057536, 182190016, 182320192, 182451904, 182582336, 967 182713792, 182843072, 182976064, 183107264, 183237056, 183368384, 968 183494848, 183631424, 183762752, 183893824, 184024768, 184154816, 969 184286656, 184417984, 184548928, 184680128, 184810816, 184941248, 970 185072704, 185203904, 185335616, 185465408, 185596352, 185727296, 971 185859904, 185989696, 186121664, 186252992, 186383552, 186514112, 972 186645952, 186777152, 186907328, 187037504, 187170112, 187301824, 973 187429184, 187562048, 187693504, 187825472, 187957184, 188087104, 974 188218304, 188349376, 188481344, 188609728, 188743616, 188874304, 975 189005248, 189136448, 189265088, 189396544, 189528128, 189660992, 976 189791936, 189923264, 190054208, 190182848, 190315072, 190447424, 977 190577984, 190709312, 190840768, 190971328, 191102656, 191233472, 978 191364032, 191495872, 191626816, 191758016, 191888192, 192020288, 979 192148928, 192282176, 192413504, 192542528, 192674752, 192805952, 980 192937792, 193068608, 193198912, 193330496, 193462208, 193592384, 981 193723456, 193854272, 193985984, 194116672, 194247232, 194379712, 982 194508352, 194641856, 194772544, 194900672, 195035072, 195166016, 983 195296704, 195428032, 195558592, 195690304, 195818176, 195952576, 984 196083392, 196214336, 196345792, 196476736, 196607552, 196739008, 985 196869952, 197000768, 197130688, 197262784, 197394368, 197523904, 986 197656384, 197787584, 197916608, 198049472, 198180544, 198310208, 987 198442432, 198573632, 198705088, 198834368, 198967232, 199097792, 988 199228352, 199360192, 199491392, 199621696, 199751744, 199883968, 989 200014016, 200146624, 200276672, 200408128, 200540096, 200671168, 990 200801984, 200933312, 201062464, 201194944, 201326144, 201457472, 991 201588544, 201719744, 201850816, 201981632, 202111552, 202244032, 992 202374464, 202505152, 202636352, 202767808, 202898368, 203030336, 993 203159872, 203292608, 203423296, 203553472, 203685824, 203816896, 994 203947712, 204078272, 204208192, 204341056, 204472256, 204603328, 995 204733888, 204864448, 204996544, 205125568, 205258304, 205388864, 996 205517632, 205650112, 205782208, 205913536, 206044736, 206176192, 997 206307008, 206434496, 206569024, 206700224, 206831168, 206961856, 998 207093056, 207223616, 207355328, 207486784, 207616832, 207749056, 999 207879104, 208010048, 208141888, 208273216, 208404032, 208534336, 1000 208666048, 208796864, 208927424, 209059264, 209189824, 209321792, 1001 209451584, 209582656, 209715136, 209845568, 209976896, 210106432, 1002 210239296, 210370112, 210501568, 210630976, 210763712, 210894272, 1003 211024832, 211156672, 211287616, 211418176, 211549376, 211679296, 1004 211812032, 211942592, 212074432, 212204864, 212334016, 212467648, 1005 212597824, 212727616, 212860352, 212991424, 213120832, 213253952, 1006 213385024, 213515584, 213645632, 213777728, 213909184, 214040128, 1007 214170688, 214302656, 214433728, 214564544, 214695232, 214826048, 1008 214956992, 215089088, 215219776, 215350592, 215482304, 215613248, 1009 215743552, 215874752, 216005312, 216137024, 216267328, 216399296, 1010 216530752, 216661696, 216790592, 216923968, 217054528, 217183168, 1011 217316672, 217448128, 217579072, 217709504, 217838912, 217972672, 1012 218102848, 218233024, 218364736, 218496832, 218627776, 218759104, 1013 218888896, 219021248, 219151936, 219281728, 219413056, 219545024, 1014 219675968, 219807296, 219938624, 220069312, 220200128, 220331456, 1015 220461632, 220592704, 220725184, 220855744, 220987072, 221117888, 1016 221249216, 221378368, 221510336, 221642048, 221772736, 221904832, 1017 222031808, 222166976, 222297536, 222428992, 222559936, 222690368, 1018 222820672, 222953152, 223083968, 223213376, 223345984, 223476928, 1019 223608512, 223738688, 223869376, 224001472, 224132672, 224262848, 1020 224394944, 224524864, 224657344, 224788288, 224919488, 225050432, 1021 225181504, 225312704, 225443776, 225574592, 225704768, 225834176, 1022 225966784, 226097216, 226229824, 226360384, 226491712, 226623424, 1023 226754368, 226885312, 227015104, 227147456, 227278528, 227409472, 1024 227539904, 227669696, 227802944, 227932352, 228065216, 228196288, 1025 228326464, 228457792, 228588736, 228720064, 228850112, 228981056, 1026 229113152, 229243328, 229375936, 229505344, 229636928, 229769152, 1027 229894976, 230030272, 230162368, 230292416, 230424512, 230553152, 1028 230684864, 230816704, 230948416, 231079616, 231210944, 231342016, 1029 231472448, 231603776, 231733952, 231866176, 231996736, 232127296, 1030 232259392, 232388672, 232521664, 232652608, 232782272, 232914496, 1031 233043904, 233175616, 233306816, 233438528, 233569984, 233699776, 1032 233830592, 233962688, 234092224, 234221888, 234353984, 234485312, 1033 234618304, 234749888, 234880832, 235011776, 235142464, 235274048, 1034 235403456, 235535936, 235667392, 235797568, 235928768, 236057152, 1035 236190272, 236322752, 236453312, 236583616, 236715712, 236846528, 1036 236976448, 237108544, 237239104, 237371072, 237501632, 237630784, 1037 237764416, 237895232, 238026688, 238157632, 238286912, 238419392, 1038 238548032, 238681024, 238812608, 238941632, 239075008, 239206336, 1039 239335232, 239466944, 239599168, 239730496, 239861312, 239992384, 1040 240122816, 240254656, 240385856, 240516928, 240647872, 240779072, 1041 240909632, 241040704, 241171904, 241302848, 241433408, 241565248, 1042 241696192, 241825984, 241958848, 242088256, 242220224, 242352064, 1043 242481856, 242611648, 242744896, 242876224, 243005632, 243138496, 1044 243268672, 243400384, 243531712, 243662656, 243793856, 243924544, 1045 244054592, 244187072, 244316608, 244448704, 244580032, 244710976, 1046 244841536, 244972864, 245104448, 245233984, 245365312, 245497792, 1047 245628736, 245759936, 245889856, 246021056, 246152512, 246284224, 1048 246415168, 246545344, 246675904, 246808384, 246939584, 247070144, 1049 247199552, 247331648, 247463872, 247593536, 247726016, 247857088, 1050 247987648, 248116928, 248249536, 248380736, 248512064, 248643008, 1051 248773312, 248901056, 249036608, 249167552, 249298624, 249429184, 1052 249560512, 249692096, 249822784, 249954112, 250085312, 250215488, 1053 250345792, 250478528, 250608704, 250739264, 250870976, 251002816, 1054 251133632, 251263552, 251395136, 251523904, 251657792, 251789248, 1055 251919424, 252051392, 252182464, 252313408, 252444224, 252575552, 1056 252706624, 252836032, 252968512, 253099712, 253227584, 253361728, 1057 253493056, 253623488, 253754432, 253885504, 254017216, 254148032, 1058 254279488, 254410432, 254541376, 254672576, 254803264, 254933824, 1059 255065792, 255196736, 255326528, 255458752, 255589952, 255721408, 1060 255851072, 255983296, 256114624, 256244416, 256374208, 256507712, 1061 256636096, 256768832, 256900544, 257031616, 257162176, 257294272, 1062 257424448, 257555776, 257686976, 257818432, 257949632, 258079552, 1063 258211136, 258342464, 258473408, 258603712, 258734656, 258867008, 1064 258996544, 259127744, 259260224, 259391296, 259522112, 259651904, 1065 259784384, 259915328, 260045888, 260175424, 260308544, 260438336, 1066 260570944, 260700992, 260832448, 260963776, 261092672, 261226304, 1067 261356864, 261487936, 261619648, 261750592, 261879872, 262011968, 1068 262143424, 262274752, 262404416, 262537024, 262667968, 262799296, 1069 262928704, 263061184, 263191744, 263322944, 263454656, 263585216, 1070 263716672, 263847872, 263978944, 264108608, 264241088, 264371648, 1071 264501184, 264632768, 264764096, 264895936, 265024576, 265158464, 1072 265287488, 265418432, 265550528, 265681216, 265813312, 265943488, 1073 266075968, 266206144, 266337728, 266468032, 266600384, 266731072, 1074 266862272, 266993344, 267124288, 267255616, 267386432, 267516992, 1075 267648704, 267777728, 267910592, 268040512, 268172096, 268302784, 1076 268435264, 268566208, 268696256, 268828096, 268959296, 269090368, 1077 269221312, 269352256, 269482688, 269614784, 269745856, 269876416, 1078 270007616, 270139328, 270270272, 270401216, 270531904, 270663616, 1079 270791744, 270924736, 271056832, 271186112, 271317184, 271449536, 1080 271580992, 271711936, 271843136, 271973056, 272105408, 272236352, 1081 272367296, 272498368, 272629568, 272759488, 272891456, 273022784, 1082 273153856, 273284672, 273415616, 273547072, 273677632, 273808448, 1083 273937088, 274071488, 274200896, 274332992, 274463296, 274595392, 1084 274726208, 274857536, 274988992, 275118656, 275250496, 275382208, 1085 275513024, 275643968, 275775296, 275906368, 276037184, 276167872, 1086 276297664, 276429376, 276560576, 276692672, 276822976, 276955072, 1087 277085632, 277216832, 277347008, 277478848, 277609664, 277740992, 1088 277868608, 278002624, 278134336, 278265536, 278395328, 278526784, 1089 278657728, 278789824, 278921152, 279052096, 279182912, 279313088, 1090 279443776, 279576256, 279706048, 279838528, 279969728, 280099648, 1091 280230976, 280361408, 280493632, 280622528, 280755392, 280887104, 1092 281018176, 281147968, 281278912, 281411392, 281542592, 281673152, 1093 281803712, 281935552, 282066496, 282197312, 282329024, 282458816, 1094 282590272, 282720832, 282853184, 282983744, 283115072, 283246144, 1095 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 1096 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 1097 284950208, 285081536}