github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/consensus/ethash/algorithm.go (about)

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