Skip to content

Instantly share code, notes, and snippets.

@RhodiumToad
Created June 22, 2023 01:29
Show Gist options
  • Save RhodiumToad/87cde334e8dc4bb0366c649ecd227698 to your computer and use it in GitHub Desktop.
Save RhodiumToad/87cde334e8dc4bb0366c649ecd227698 to your computer and use it in GitHub Desktop.
Translation of Ryu float-to-string algorithm into Lua
--
--[[
ryu.d2string(d) -- convert float number d to shortest-exact string
As this code stands, it will produce output only in exponential
notation (e.g. "1e+00" rather than "1"). IEEE format is required.
It is an error to pass in an integer rather than a float.
This needs 64-bit bitwise and integer operations, so it won't run
on luajit or on lua versions < 5.3, and to run on 5.3 you'd have to
take all the <const> quals out.
Copyright 2018-2023 Ulf Adams (original) and Andrew Gierth (translation
and modifications). Licensed under the Boost license.
]]
-- exported funcs
local M = {}
-- testcases
local T = {}
assert(string.pack("J",0):len() == string.pack("d",0):len(),
"size mismatch between lua_Unsigned and double")
local D = require 'ryu_data'
local DOUBLE_MANTISSA_BITS <const> = 52
local DOUBLE_EXPONENT_BITS <const> = 11
local DOUBLE_BIAS <const> = 1023
local DOUBLE_POW5_INV_BITCOUNT <const> = 122
local DOUBLE_POW5_BITCOUNT <const> = 121
-- floor(log10(2^e)), e in [0..1650]
local function log10pow2(e)
return (e * 78913) >> 18
end
function T.log10pow2()
for e = 0,1650 do
assert(log10pow2(e) == math.floor(math.log(2,10) * e), tostring(e))
end
end
-- floor(log10(5^e)), e in [0..2620]
local function log10pow5(e)
return (e * 732923) >> 20
end
function T.log10pow5()
for e = 0,2620 do
assert(log10pow5(e) == math.floor(math.log(5,10) * e), tostring(e))
end
end
-- return 1 if e==0, else ceil(log2(5^e)), e in [0..3528]
local function pow5bits(e)
return ((e * 1217359) >> 19) + 1
end
function T.pow5bits()
assert(pow5bits(0) == 1)
for e = 1,3528 do
assert(pow5bits(e) == math.ceil(math.log(5,2) * e), tostring(e))
end
end
--[[
compute (m*mul) >> j
m is up to 55 bits long, mul is up to 123 bits long, j is such that the
result requires at most 63 bits
Lacking any 128-bit arithmetic, we split both m and mul into 31-bit chunks:
result = (m0 * mul0) [bits 0..61]
+ ((m1 * mul0) << 31) [bits 31..92]
+ ((m0 * mul1) << 31) [bits 31..92]
+ ((m1 * mul1) << 62) [bits 62..123]
+ ((m0 * mul2) << 62) [bits 62..123]
+ ((m1 * mul2) << 93) [bits 93..154]
+ ((m0 * mul3) << 93) [bits 93..154]
+ ((m1 * mul3) << 124) [bits 124..185]
which gives a 186-bit result, but j is at least 115, leaving 71 bits of
which we know that the top 6 are 0.
]]
local unpack = table.unpack
local function mulShift(m, mul, j)
local mul0,mul1,mul2,mul3 = unpack(mul)
local m0,m1 = m & 0x7FFFFFFF, (m >> 31)
local r31 = (m1 * mul0) + (m0 * mul1) + ((m0 * mul0) >> 31)
local r62 = (m1 * mul1) + (m0 * mul2) + (r31 >> 31)
local r93 = (m1 * mul2) + (m0 * mul3) + (r62 >> 31)
local r124 = (m1 * mul3)
local r = (r93 >> 22) + (r124 << 9)
return (r >> (j-115))
end
function T.mulShift()
assert(mulShift(0x7FFFFFFFFFFFFF,{0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x3FFFFFFF},115) == 9223372036854775551)
assert(mulShift(0x7FFFFFFFFFFFFF,{0x00000001,0x00000000,0x00000000,0x20000000},115) == 4611686018427387776)
assert(mulShift(0x54b40b1f852bda,{0x70cdc876,0x187e7c06,0x71b47842,0x14f8b588},116) == 1000000000000000000)
end
local function mulShiftAll(m,mul,j,mmShift)
local m4 = m << 2
return
mulShift(m4, mul, j),
mulShift(m4 + 2, mul, j),
mulShift(m4 - 1 - mmShift, mul, j)
end
local function div5(v)
return v // 5
end
local function div10(v)
return v // 10
end
local function div100(v)
return v // 100
end
-- number of times 5 divides v.
local function pow5factor(v)
local n = 0
while (v % 5) == 0 do
v = v // 5
n = n + 1
end
return n
end
local function multipleOfPowerOf5(v,p)
return pow5factor(v) >= p
end
local function multipleOfPowerOf2(v,p)
return (v & ((1 << p) - 1)) == 0
end
--[[
This is where the real work happens - conversion of a binary
mantissa/binary exponent to a decimal mantissa/exponent.
]]
local function d2d(ieeeMantissa, ieeeExponent)
local e2, m2
if ieeeExponent == 0 then
-- We subtract 2 so that the bounds computation has 2 additional bits.
e2 = 1 - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS - 2
m2 = ieeeMantissa
else
e2 = ieeeExponent - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS - 2;
m2 = (1 << DOUBLE_MANTISSA_BITS) | ieeeMantissa;
end
local even = (m2 & 1) == 0
local acceptBounds = even -- change to false to never rely on round-to-even
-- Step 2: Determine the interval of legal decimal representations.
local mv = m2 << 2
local mmShift = (ieeeMantissa ~= 0 or ieeeExponent <= 1) and 1 or 0
-- We would compute mp and mm like this:
-- uint64 mp = 4 * m2 + 2;
-- uint64 mm = mv - 1 - mmShift;
-- Step 3: Convert to a decimal power base using 128-bit arithmetic.
local vr,vp,vm
local e10
local vmIsTrailingZeros = false
local vrIsTrailingZeros = false
if e2 >= 0 then
local q = log10pow2(e2) - ((e2 > 3) and 1 or 0)
local k = DOUBLE_POW5_INV_BITCOUNT + pow5bits(q) - 1
local i = -e2 + q + k
e10 = q
vr,vp,vm = mulShiftAll(m2, D.DOUBLE_POW5_INV_SPLIT[q], i, mmShift)
if q <= 21 then
--[[
This should use q <= 22, but I think 21 is also safe. Smaller
values may still be safe, but it's more difficult to reason
about them.
Only one of mp, mv, and mm can be a multiple of 5, if any.
]]
local mvMod5 = (mv - 5 * div5(mv))
if mvMod5 == 0 then
vrIsTrailingZeros = multipleOfPowerOf5(mv, q);
elseif acceptBounds then
--[[
Same as min(e2 + (~mm & 1), pow5Factor(mm)) >= q
<=> e2 + (~mm & 1) >= q && pow5Factor(mm) >= q
<=> true && pow5Factor(mm) >= q, since e2 >= q.
]]
vmIsTrailingZeros = multipleOfPowerOf5(mv - 1 - mmShift, q)
else
-- Same as min(e2 + 1, pow5Factor(mp)) >= q
vp = vp - (multipleOfPowerOf5(mv + 2, q) and 1 or 0)
end
end
else
local q = log10pow5(-e2) - ((-e2 > 1) and 1 or 0)
local i = -e2 - q
local k = pow5bits(i) - DOUBLE_POW5_BITCOUNT
local j = q - k
e10 = q + e2;
vr,vp,vm = mulShiftAll(m2, D.DOUBLE_POW5_SPLIT[i], j, mmShift)
if q <= 1 then
--[[
{vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q
trailing 0 bits.
mv = 4 * m2, so it always has at least two trailing 0 bits.
]]
vrIsTrailingZeros = true
if acceptBounds then
--[[
mm = mv - 1 - mmShift, so it has 1 trailing 0 bit iff
mmShift == 1.
]]
vmIsTrailingZeros = mmShift == 1
else
--[[
mp = mv + 2, so it always has at least one trailing 0 bit.
]]
vp = vp - 1
end
elseif q < 63 then
--[[
TODO(ulfjack):Use a tighter bound here. */
We need to compute min(ntz(mv), pow5Factor(mv) - e2) >= q - 1
<=> ntz(mv) >= q - 1 && pow5Factor(mv) - e2 >= q - 1 */
<=> ntz(mv) >= q - 1 (e2 is negative and -e2 >= q) */
<=> (mv & ((1 << (q - 1)) - 1)) == 0
We also need to make sure that the left shift does not
overflow.
]]
vrIsTrailingZeros = multipleOfPowerOf2(mv, q - 1)
end
end
--[[
Step 4: Find the shortest decimal representation in the interval of
legal representations.
]]
local removed = 0
local lastRemovedDigit = 0
local output
-- On average, we remove ~2 digits.
if vmIsTrailingZeros or vrIsTrailingZeros then
-- General case, which happens rarely (~0.7%).
while true do
local vpDiv10 = div10(vp)
local vmDiv10 = div10(vm)
if vpDiv10 <= vmDiv10 then
break
end
local vmMod10 = vm - 10 * vmDiv10
local vrDiv10 = div10(vr)
local vrMod10 = vr - 10 * vrDiv10
if vmIsTrailingZeros then
vmIsTrailingZeros = vmMod10 == 0
end
if vrIsTrailingZeros then
vrIsTrailingZeros = lastRemovedDigit == 0
end
lastRemovedDigit = vrMod10
vr,vp,vm = vrDiv10, vpDiv10, vmDiv10
removed = removed + 1
end
if vmIsTrailingZeros then
while true do
local vmDiv10 = div10(vm)
local vmMod10 = vm - 10 * vmDiv10
if vmMod10 ~= 0 then
break
end
local vpDiv10 = div10(vp)
local vrDiv10 = div10(vr)
local vrMod10 = vr - 10 * vrDiv10
if vrIsTrailingZeros then
vrIsTrailingZeros = lastRemovedDigit == 0
end
lastRemovedDigit = vrMod10
vr,vp,vm = vrDiv10, vpDiv10, vmDiv10
removed = removed + 1
end
end
if vrIsTrailingZeros and lastRemovedDigit == 5 and vr % 2 == 0 then
-- Round even if the exact number is .....50..0.
lastRemovedDigit = 4
end
--[[
We need to take vr + 1 if vr is outside bounds or we need to round
up.
]]
if (vr == vm and not (acceptBounds and vmIsTrailingZeros))
or (lastRemovedDigit >= 5)
then
output = vr + 1
else
output = vr
end
else
--[[
Specialized for the common case (~99.3%). Percentages below are
relative to this.
]]
local roundUp = false
local vpDiv100 = div100(vp)
local vmDiv100 = div100(vm)
if vpDiv100 > vmDiv100 then
-- Optimization:remove two digits at a time(~86.2 %).
local vrDiv100 = div100(vr)
local vrMod100 = (vr - 100 * vrDiv100)
roundUp = vrMod100 >= 50;
vr,vp,vm = vrDiv100, vpDiv100, vmDiv100
removed = removed + 2
end
while true do
local vpDiv10 = div10(vp)
local vmDiv10 = div10(vm)
if vpDiv10 <= vmDiv10 then
break
end
local vrDiv10 = div10(vr)
local vrMod10 = (vr - 10 * vrDiv10)
roundUp = vrMod10 >= 5
vr,vp,vm = vrDiv10,vpDiv10,vmDiv10
removed = removed + 1
end
--[[
We need to take vr + 1 if vr is outside bounds or we need to round
up.
]]
output = vr + ((vr == vm or roundUp) and 1 or 0)
end
local exp = e10 + removed
return output, exp
end
local function to_chars(mantissa, exponent, sign)
local str = tostring(mantissa)
local sgn = sign and "-" or ""
local exp = string.format("e%+03d", exponent + #str - 1)
if #str > 1 then
return sgn .. str:sub(1,1) .. "." .. str:sub(2) .. exp
else
return sgn .. str .. exp
end
end
local function ieee_decode(d)
assert(type(d)=="number" and math.type(d)=="float", "expected float not integer")
local bits = string.unpack("J",string.pack("d",d))
return
(bits & (1 << 63)) ~= 0,
bits & ((1 << DOUBLE_MANTISSA_BITS) - 1),
(bits >> DOUBLE_MANTISSA_BITS) & ((1 << DOUBLE_EXPONENT_BITS) - 1)
end
local function special_str(sign,zero_mantissa,zero_exponent)
if zero_exponent then
return sign and "-0e0" or "0e0"
elseif zero_mantissa then
return sign and "-Infinity" or "Infinity"
else
return "NaN" -- no sign
end
end
function M.d2string(d)
local ieeeSign, ieeeMantissa, ieeeExponent = ieee_decode(d);
if ieeeExponent == ((1 << DOUBLE_EXPONENT_BITS) - 1)
or (ieeeExponent == 0 and ieeeMantissa == 0)
then
return special_str(ieeeSign, ieeeMantissa == 0, ieeeExponent == 0)
end
local mantissa, exponent = d2d(ieeeMantissa, ieeeExponent)
return to_chars(mantissa, exponent, ieeeSign)
end
function T.d2string()
-- special cases
local specials = {
{ 0.0, "0e0", "0" },
{ -0.0, "-0e0", "-0" },
{ 1/0, "Infinity", "Infinity" },
{ -1/0, "-Infinity", "-Infinity" },
{ 0/0, "NaN", "NaN" }
}
for _,v in ipairs(specials) do
local s = M.d2string(v[1])
if not (s == v[2] or s == v[3]) then
error(string.format("got %s expected %s or %s for %q", s, v[2], v[3], v[1]))
end
end
-- subnormals
-- (we don't assume these will round-trip)
do
local testcases = {
[0x0000000000000001] = "5e-324",
[0x0000000000000002] = "1e-323",
[0x0000000000000003] = "1.5e-323",
[0x0000000000001000] = "2.0237e-320",
[0x0000000100000000] = "2.121995791e-314",
[0x0000010000000000] = "5.43230922487e-312",
[0x0000010100000000] = "5.45352918278e-312",
[0x0000400000000000] = "3.4766779039175e-310",
[0x0000400100000000] = "3.4768901034966e-310",
[0x0000800000000000] = "6.953355807835e-310",
[0x0000800000000001] = "6.95335580783505e-310",
[0x00000000000f4240] = "4.940656e-318",
[0x00000000016e3600] = "1.18575755e-316",
[0x0000008cdcdea440] = "2.989102097996e-312",
[0x000ffffffffffff0] = "2.2250738585071935e-308",
[0x000ffffffffffff1] = "2.225073858507194e-308",
[0x000ffffffffffffe] = "2.2250738585072004e-308",
[0x000fffffffffffff] = "2.225073858507201e-308",
}
for k,v in pairs(testcases) do
local n = string.unpack("d",string.pack("J",k))
local s = M.d2string(n)
if s ~= v then
error(string.format("got %s expected %s for 0x%016x", s, v, n))
end
end
end
-- round-trippables
do
local testcases = {
[0x0010000000000000] = "2.2250738585072014e-308",
[0x0010000000000001] = "2.225073858507202e-308",
[0x0010000000000002] = "2.2250738585072024e-308",
[0x0018000000000000] = "3.337610787760802e-308",
[0x3ddb7cdfd9d7bdba] = "9.999999999999999e-11",
[0x3ddb7cdfd9d7bdbb] = "1e-10",
[0x3ddb7cdfd9d7bdbc] = "1.0000000000000002e-10",
[0x3e112e0be826d694] = "9.999999999999999e-10",
[0x3e112e0be826d695] = "1e-09",
[0x3e112e0be826d696] = "1.0000000000000003e-09",
[0x3e45798ee2308c39] = "9.999999999999999e-09",
[0x3e45798ee2308c3a] = "1e-08",
[0x3e45798ee2308c3b] = "1.0000000000000002e-08",
[0x3e7ad7f29abcaf47] = "9.999999999999998e-08",
[0x3e7ad7f29abcaf48] = "1e-07",
[0x3e7ad7f29abcaf49] = "1.0000000000000001e-07",
[0x3eb0c6f7a0b5ed8c] = "9.999999999999997e-07",
[0x3eb0c6f7a0b5ed8d] = "1e-06",
[0x3eb0c6f7a0b5ed8e] = "1.0000000000000002e-06",
[0x3ee4f8b588e368ef] = "9.999999999999997e-06",
[0x3ee4f8b588e368f0] = "9.999999999999999e-06",
[0x3ee4f8b588e368f1] = "1e-05",
[0x3f1a36e2eb1c432c] = "9.999999999999999e-05",
[0x430c6bf526340000] = "1e+15",
[0x430c6bf526340001] = "1.0000000000000001e+15",
[0x4341c37937e07fff] = "9.999999999999998e+15",
[0x4341c37937e08000] = "1e+16",
[0x4341c37937e08001] = "1.0000000000000002e+16",
[0x4376345785d89fff] = "9.999999999999998e+16",
[0x4376345785d8a000] = "1e+17",
[0x4376345785d8a001] = "1.0000000000000002e+17",
[0x43abc16d674ec7ff] = "9.999999999999999e+17",
[0x43abc16d674ec800] = "1e+18",
[0x43abc16d674ec801] = "1.0000000000000001e+18",
[0x43e158e460913cff] = "9.999999999999998e+18",
[0x43e158e460913d00] = "1e+19",
[0x43e158e460913d01] = "1.0000000000000002e+19",
[0x4415af1d78b58c3f] = "9.999999999999998e+19",
[0x4415af1d78b58c40] = "1e+20",
[0x4415af1d78b58c41] = "1.0000000000000002e+20",
[0x444b1ae4d6e2ef4f] = "9.999999999999999e+20",
[0x444b1ae4d6e2ef50] = "1e+21",
[0x444b1ae4d6e2ef51] = "1.0000000000000001e+21",
[0x4480f0cf064dd591] = "9.999999999999998e+21",
[0x4480f0cf064dd592] = "1e+22",
[0x4480f0cf064dd593] = "1.0000000000000002e+22",
[0x44b52d02c7e14af5] = "9.999999999999997e+22",
[0x44b52d02c7e14af7] = "1.0000000000000001e+23",
[0x44ea784379d99db3] = "9.999999999999998e+23",
[0x44ea784379d99db4] = "1e+24",
[0x44ea784379d99db5] = "1.0000000000000001e+24",
[0x45208b2a2c280290] = "9.999999999999999e+24",
[0x45208b2a2c280291] = "1e+25",
[0x45208b2a2c280292] = "1.0000000000000003e+25",
[0x7feffffffffffffe] = "1.7976931348623155e+308",
[0x7fefffffffffffff] = "1.7976931348623157e+308",
[0x4352000000000003] = "2.0266198323167244e+16",
[0x4358000000000003] = "2.7021597764222988e+16",
[0xc352000000000003] = "-2.0266198323167244e+16",
[0xc358000000000003] = "-2.7021597764222988e+16",
[0x3e60000000000000] = "2.9802322387695312e-08",
[0x434018601510c000] = "9.0608011534336e+15",
[0x43d055dc36f24000] = "4.708356024711512e+18",
[0x43e052961c6f8000] = "9.409340012568248e+18",
[0x4830f0cf064dd592] = "5.764607523034235e+39",
[0x4840f0cf064dd592] = "1.152921504606847e+40",
[0x4850f0cf064dd592] = "2.305843009213694e+40",
[0x0040000000000000] = "1.7800590868057611e-307",
[0x007fffffffffffff] = "2.8480945388892175e-306",
[0x0290000000000000] = "2.446494580089078e-296",
[0x029fffffffffffff] = "4.8929891601781557e-296",
[0x4350000000000000] = "1.8014398509481984e+16",
[0x435fffffffffffff] = "3.6028797018963964e+16",
[0x1330000000000000] = "2.900835519859558e-216",
[0x133fffffffffffff] = "5.801671039719115e-216",
[0x3a6fa7161a4d6e0c] = "3.196104012172126e-27",
}
for k,v in pairs(testcases) do
local n = string.unpack("d",string.pack("J",k))
local s = M.d2string(n)
local rn = tonumber(s)
if s ~= v or n ~= rn then
error(string.format("got %s (%q) expected %s for 0x%016x (%q)", s, rn, v, k, n))
end
end
end
-- These test cases have results that differ if we disable
-- reliance on round-to-even for round-trip input. First result is
-- the round-to-even one, second is not.
do
local testcases = {
[0x4350000000000002] = { "1.801439850948199e+16", "1.8014398509481992e+16" },
[0x4352000000000004] = { "2.026619832316725e+16", "2.0266198323167248e+16" },
[0x4358000000000004] = { "2.702159776422299e+16", "2.7021597764222992e+16" },
[0x435f000000000020] = { "3.490289711212147e+16", "3.4902897112121472e+16" },
[0x4350000000002e06] = { "1.801439850952911e+16", "1.8014398509529112e+16" },
[0xc352bd2668e077c4] = { "-2.109808898695963e+16","-2.1098088986959632e+16" },
[0xc350000000000002] = { "-1.801439850948199e+16", "-1.8014398509481992e+16" },
[0xc352000000000004] = { "-2.026619832316725e+16", "-2.0266198323167248e+16" },
[0xc358000000000004] = { "-2.702159776422299e+16", "-2.7021597764222992e+16" },
[0xc35f000000000020] = { "-3.490289711212147e+16", "-3.4902897112121472e+16" },
[0xc350000000002e06] = { "-1.801439850952911e+16", "-1.8014398509529112e+16" },
[0x44b52d02c7e14af6] = { "1e+23", "9.999999999999999e+22" },
}
for k,vv in pairs(testcases) do
local v = vv[2]
local n = string.unpack("d",string.pack("J",k))
local s = M.d2string(n)
local rn = tonumber(s)
if (not (s == vv[1] or s == vv[2])) or n ~= rn then
error(string.format("got %s (%q) expected %s or %s for 0x%016x (%q)", s, rn, vv[1], vv[2], k, n))
end
end
end
-- These are the cases whose output would differ if we enabled
-- fixed-point processing.
do
local testcases = {
[0x3f1a36e2eb1c432d] = { "0.0001", "1e-04" },
[0x3f1a36e2eb1c432e] = { "0.00010000000000000002", "1.0000000000000002e-04" },
[0x3f50624dd2f1a9fb] = { "0.0009999999999999998", "9.999999999999998e-04", },
[0x3f50624dd2f1a9fc] = { "0.001", "1e-03", },
[0x3f50624dd2f1a9fd] = { "0.0010000000000000002", "1.0000000000000002e-03", },
[0x3f847ae147ae147a] = { "0.009999999999999998", "9.999999999999998e-03", },
[0x3f847ae147ae147b] = { "0.01", "1e-02", },
[0x3f847ae147ae147c] = { "0.010000000000000002", "1.0000000000000002e-02", },
[0x3fb9999999999999] = { "0.09999999999999999", "9.999999999999999e-02", },
[0x3fb999999999999a] = { "0.1", "1e-01", },
[0x3fb999999999999b] = { "0.10000000000000002", "1.0000000000000002e-01", },
[0x3feffffffffffff0] = { "0.9999999999999982", "9.999999999999982e-01", },
[0x3feffffffffffff1] = { "0.9999999999999983", "9.999999999999983e-01", },
[0x3feffffffffffff2] = { "0.9999999999999984", "9.999999999999984e-01", },
[0x3feffffffffffff3] = { "0.9999999999999986", "9.999999999999986e-01", },
[0x3feffffffffffff4] = { "0.9999999999999987", "9.999999999999987e-01", },
[0x3feffffffffffff5] = { "0.9999999999999988", "9.999999999999988e-01", },
[0x3feffffffffffff6] = { "0.9999999999999989", "9.999999999999989e-01", },
[0x3feffffffffffff7] = { "0.999999999999999", "9.99999999999999e-01", },
[0x3feffffffffffff8] = { "0.9999999999999991", "9.999999999999991e-01", },
[0x3feffffffffffff9] = { "0.9999999999999992", "9.999999999999992e-01", },
[0x3feffffffffffffa] = { "0.9999999999999993", "9.999999999999993e-01", },
[0x3feffffffffffffb] = { "0.9999999999999994", "9.999999999999994e-01", },
[0x3feffffffffffffc] = { "0.9999999999999996", "9.999999999999996e-01", },
[0x3feffffffffffffd] = { "0.9999999999999997", "9.999999999999997e-01", },
[0x3feffffffffffffe] = { "0.9999999999999998", "9.999999999999998e-01", },
[0x3fefffffffffffff] = { "0.9999999999999999", "9.999999999999999e-01", },
[0x3ff0000000000000] = { "1", "1e+00", },
[0x3ff0000000000001] = { "1.0000000000000002", "1.0000000000000002e+00", },
[0x3ff0000000000002] = { "1.0000000000000004", "1.0000000000000004e+00", },
[0x3ff0000000000003] = { "1.0000000000000007", "1.0000000000000007e+00", },
[0x3ff0000000000004] = { "1.0000000000000009", "1.0000000000000009e+00", },
[0x3ff0000000000005] = { "1.000000000000001", "1.000000000000001e+00", },
[0x3ff0000000000006] = { "1.0000000000000013", "1.0000000000000013e+00", },
[0x3ff0000000000007] = { "1.0000000000000016", "1.0000000000000016e+00", },
[0x3ff0000000000008] = { "1.0000000000000018", "1.0000000000000018e+00", },
[0x3ff0000000000009] = { "1.000000000000002", "1.000000000000002e+00", },
[0x3ff921fb54442d18] = { "1.5707963267948966", "1.5707963267948966e+00", },
[0x4005bf0a8b14576a] = { "2.7182818284590455", "2.7182818284590455e+00", },
[0x400921fb54442d18] = { "3.141592653589793", "3.141592653589793e+00", },
[0x4023ffffffffffff] = { "9.999999999999998", "9.999999999999998e+00", },
[0x4024000000000000] = { "10", "1e+01", },
[0x4024000000000001] = { "10.000000000000002", "1.0000000000000002e+01", },
[0x4058ffffffffffff] = { "99.99999999999999", "9.999999999999999e+01", },
[0x4059000000000000] = { "100", "1e+02", },
[0x4059000000000001] = { "100.00000000000001", "1.0000000000000001e+02", },
[0x408f3fffffffffff] = { "999.9999999999999", "9.999999999999999e+02", },
[0x408f400000000000] = { "1000", "1e+03", },
[0x408f400000000001] = { "1000.0000000000001", "1.0000000000000001e+03", },
[0x40c387ffffffffff] = { "9999.999999999998", "9.999999999999998e+03", },
[0x40c3880000000000] = { "10000", "1e+04", },
[0x40c3880000000001] = { "10000.000000000002", "1.0000000000000002e+04", },
[0x40f869ffffffffff] = { "99999.99999999999", "9.999999999999999e+04", },
[0x40f86a0000000000] = { "100000", "1e+05", },
[0x40f86a0000000001] = { "100000.00000000001", "1.0000000000000001e+05", },
[0x412e847fffffffff] = { "999999.9999999999", "9.999999999999999e+05", },
[0x412e848000000000] = { "1000000", "1e+06", },
[0x412e848000000001] = { "1000000.0000000001", "1.0000000000000001e+06", },
[0x416312cfffffffff] = { "9999999.999999998", "9.999999999999998e+06", },
[0x416312d000000000] = { "10000000", "1e+07", },
[0x416312d000000001] = { "10000000.000000002", "1.0000000000000002e+07", },
[0x4197d783ffffffff] = { "99999999.99999999", "9.999999999999999e+07", },
[0x4197d78400000000] = { "100000000", "1e+08", },
[0x4197d78400000001] = { "100000000.00000001", "1.0000000000000001e+08", },
[0x41cdcd64ffffffff] = { "999999999.9999999", "9.999999999999999e+08", },
[0x41cdcd6500000000] = { "1000000000", "1e+09", },
[0x41cdcd6500000001] = { "1000000000.0000001", "1.0000000000000001e+09", },
[0x4202a05f1fffffff] = { "9999999999.999998", "9.999999999999998e+09", },
[0x4202a05f20000000] = { "10000000000", "1e+10", },
[0x4202a05f20000001] = { "10000000000.000002", "1.0000000000000002e+10", },
[0x42374876e7ffffff] = { "99999999999.99998", "9.999999999999998e+10", },
[0x42374876e8000000] = { "100000000000", "1e+11", },
[0x42374876e8000001] = { "100000000000.00002", "1.0000000000000002e+11", },
[0x426d1a94a1ffffff] = { "999999999999.9999", "9.999999999999999e+11", },
[0x426d1a94a2000000] = { "1000000000000", "1e+12", },
[0x426d1a94a2000001] = { "1000000000000.0001", "1.0000000000000001e+12", },
[0x42a2309ce53fffff] = { "9999999999999.998", "9.999999999999998e+12", },
[0x42a2309ce5400000] = { "10000000000000", "1e+13", },
[0x42a2309ce5400001] = { "10000000000000.002", "1.0000000000000002e+13", },
[0x42d6bcc41e8fffff] = { "99999999999999.98", "9.999999999999998e+13", },
[0x42d6bcc41e900000] = { "100000000000000", "1e+14", },
[0x42d6bcc41e900001] = { "100000000000000.02", "1.0000000000000002e+14", },
[0x430c6bf52633ffff] = { "999999999999999.9", "9.999999999999999e+14", },
[0x42dc12218377de66] = { "123456789012345.6", "1.234567890123456e+14", },
[0x42a674e79c5fe51f] = { "12345678901234.56", "1.234567890123456e+13", },
[0x4271f71fb04cb74c] = { "1234567890123.456", "1.234567890123456e+12", },
[0x423cbe991a145879] = { "123456789012.3456", "1.234567890123456e+11", },
[0x4206fee0e1a9e061] = { "12345678901.23456", "1.234567890123456e+10", },
[0x41d26580b487e6b4] = { "1234567890.123456", "1.234567890123456e+09", },
[0x419d6f34540ca453] = { "123456789.0123456", "1.234567890123456e+08", },
[0x41678c29dcd6e9dc] = { "12345678.90123456", "1.234567890123456e+07", },
[0x4132d687e3df217d] = { "1234567.890123456", "1.234567890123456e+06", },
[0x40fe240c9fcb68c8] = { "123456.7890123456", "1.234567890123456e+05", },
[0x40c81cd6e63c53d3] = { "12345.67890123456", "1.234567890123456e+04", },
[0x40934a4584fd0fdc] = { "1234.567890123456", "1.234567890123456e+03", },
[0x405edd3c07fb4c93] = { "123.4567890123456", "1.234567890123456e+02", },
[0x4028b0fcd32f7076] = { "12.34567890123456", "1.234567890123456e+01", },
[0x3ff3c0ca428c59f8] = { "1.234567890123456", "1.234567890123456e+00", },
[0x3ff3333333333333] = { "1.2", "1.2e+00", },
[0x3ff3ae147ae147ae] = { "1.23", "1.23e+00", },
[0x3ff3be76c8b43958] = { "1.234", "1.234e+00", },
[0x3ff3c083126e978d] = { "1.2345", "1.2345e+00", },
[0x3ff3c0c1fc8f3238] = { "1.23456", "1.23456e+00", },
[0x3ff3c0c9539b8887] = { "1.234567", "1.234567e+00", },
[0x3ff3c0ca2a5b1d5d] = { "1.2345678", "1.2345678e+00", },
[0x3ff3c0ca4283de1b] = { "1.23456789", "1.23456789e+00", },
[0x3ff3c0ca43db770a] = { "1.234567895", "1.234567895e+00", },
[0x3ff3c0ca428abd53] = { "1.2345678901", "1.2345678901e+00", },
[0x3ff3c0ca428c1d2b] = { "1.23456789012", "1.23456789012e+00", },
[0x3ff3c0ca428c51f2] = { "1.234567890123", "1.234567890123e+00", },
[0x3ff3c0ca428c58fc] = { "1.2345678901234", "1.2345678901234e+00", },
[0x3ff3c0ca428c59dd] = { "1.23456789012345", "1.23456789012345e+00", },
[0x3ff3c0ca428c59f8] = { "1.234567890123456", "1.234567890123456e+00", },
[0x3ff3c0ca428c59fb] = { "1.2345678901234567", "1.2345678901234567e+00", },
[0x40112e0be8047a7d] = { "4.294967294", "4.294967294e+00", },
[0x40112e0be815a889] = { "4.294967295", "4.294967295e+00", },
[0x40112e0be826d695] = { "4.294967296", "4.294967296e+00", },
[0x40112e0be83804a1] = { "4.294967297", "4.294967297e+00", },
[0x40112e0be84932ad] = { "4.294967298", "4.294967298e+00", },
[0x3ff3c0ca2a5b1d5d] = { "1.2345678", "1.2345678e+00", },
}
for k,vv in pairs(testcases) do
local v = vv[2]
local n = string.unpack("d",string.pack("J",k))
local s = M.d2string(n)
local rn = tonumber(s)
if (not (s == vv[1] or s == vv[2])) or n ~= rn then
error(string.format("got %s (%q) expected %s or %s for 0x%016x (%q)", s, rn, vv[1], vv[2], k, n))
end
end
end
-- random values
for i = 1,500000 do
local v = math.random()
if (i % 2) > 0 then v = -v end
local s = M.d2string(v)
local n = tonumber(s)
if v ~= n then
error(string.format("got %s (%q) for %.17g (%q)", s, n, v, v))
end
end
for i = 1,500000 do
local v = 1 / math.random()
if (i % 2) > 0 then v = -v end
local s = M.d2string(v)
local n = tonumber(s)
if v ~= n then
error(string.format("got %s (%q) for %.17g (%q)", s, n, v, v))
end
end
end
function M.run_tests()
local all_ok = true
for name,func in pairs(T) do
local ok,err = pcall(func)
if ok then
print(name,"passed")
else
print(name,"failed",err)
all_ok = false
end
end
return all_ok
end
return M
--end
--
local M = {}
--[[
These tables are generated (by the upstream) using PrintDoubleLookupTable
from the upstream sources at github.com/ulfjack/ryu, and then converted to
31-bit form. Values are in little-endian order.
]]
M.DOUBLE_POW5_INV_SPLIT = { [0]=
{0x00000001,0x00000000,0x00000000,0x20000000}, -- {0x1, 0x400000000000000},
{0x33333334,0x66666666,0x4ccccccc,0x19999999}, -- {0x3333333333333334, 0x333333333333333},
{0x5c28f5c3,0x51eb851e,0x570a3d70,0x147ae147}, -- {0x28f5c28f5c28f5c3, 0x28f5c28f5c28f5c},
{0x3020c49c,0x5b22d0e5,0x78d4fdf3,0x10624dd2}, -- {0xed916872b020c49c, 0x20c49ba5e353f7c},
{0x4d013a93,0x5e9e1b08,0x0e219652,0x1a36e2eb}, -- {0xaf4f0d844d013a93, 0x346dc5d63886594},
{0x70cdc876,0x187e7c06,0x71b47842,0x14f8b588}, -- {0x8c3f3e0370cdc876, 0x29f16b11c6d1e10},
{0x270b06c5,0x2d31fcd2,0x5af6c69b,0x10c6f7a0}, -- {0xd698fe69270b06c5, 0x218def416bdb1a6},
{0x5811a46e,0x61e99483,0x5e57a42b,0x1ad7f29a}, -- {0xf0f4ca41d811a46e, 0x35afe535795e90a},
{0x2cdae9f1,0x67ee1069,0x18461cef,0x15798ee2}, -- {0xf3f70834acdae9f1, 0x2af31dc4611873b},
{0x23e254c1,0x398b4054,0x136b4a59,0x112e0be8}, -- {0x5cc5a02a23e254c1, 0x225c17d04dad296},
{0x396a2135,0x75ab9a20,0x6bdedd5b,0x1b7cdfd9}, -- {0xfad5cd10396a2135, 0x36f9bfb3af7b756},
{0x1454e75e,0x77bc7b4d,0x3cb24aaf,0x15fd7fe1}, -- {0xfbde3da69454e75e, 0x2bfaffc2f2c92ab},
{0x5d10b918,0x5fc9fc3d,0x16f5088c,0x11979981}, -- {0x2fe4fe1edd10b918, 0x232f33025bd4223},
{0x481ac1bf,0x19432d2f,0x24bb40e1,0x1c25c268}, -- {0x4ca19697c81ac1bf, 0x384b84d092ed038},
{0x067bce33,0x7a9c2426,0x5095cd80,0x16849b86}, -- {0x3d4e1213067bce33, 0x2d09370d4257360},
{0x052fd829,0x487ce9b8,0x73ab0acd,0x1203af9e}, -- {0x643e74dc052fd829, 0x24075f3dceac2b3},
{0x21e626a7,0x5a6175f3,0x6c44de15,0x1cd2b297}, -- {0x6d30baf9a1e626a7, 0x39a5652fb113785},
{0x67eb5220,0x484df7f5,0x236a4b44,0x170ef546}, -- {0x2426fbfae7eb5220, 0x2e1dea8c8da92d1},
{0x39890e80,0x39d7f991,0x6921d5d0,0x12725dd1}, -- {0x1cebfcc8b9890e80, 0x24e4bba3a487574},
{0x0f41b0cc,0x29598f4f,0x5b69561a,0x1d83c94f}, -- {0x94acc7a78f41b0cc, 0x3b07929f6da5586},
{0x729af3d7,0x5447a5d8,0x492111ae,0x179ca10c}, -- {0xaa23d2ec729af3d7, 0x2f394219248446b},
{0x5baf2979,0x769fb7e0,0x074da7be,0x12e3b40a}, -- {0xbb4fdbf05baf2979, 0x25c768141d369ef},
{0x2c4b758d,0x0a992634,0x0baf72cb,0x1e392010}, -- {0xc54c931a2c4b758d, 0x3c7240202ebdcb2},
{0x703c5e0b,0x3badb829,0x095928a2,0x182db340}, -- {0x9dd6dc14f03c5e0b, 0x305b66802564a28},
{0x59c9e4d6,0x16249354,0x544753b5,0x1357c299}, -- {0x4b1249aa59c9e4d6, 0x26af8533511d4ed},
{0x760fd489,0x09d41eed,0x6d3eec55,0x1ef2d0f5}, -- {0x44ea0f76f60fd489, 0x3de5a1ebb4fbb15},
{0x780caa07,0x54a9b257,0x576589dd,0x18c240c4}, -- {0x6a54d92bf80caa07, 0x318481895d96277},
{0x133d54d2,0x43baf513,0x791e07e4,0x13ce9a36}, -- {0x21dd7a89933d54d2, 0x279d346de4781f9},
{0x38622150,0x6c5e54eb,0x28300ca0,0x1fb0f6be}, -- {0x362f2a75b8622150, 0x3f61ed7ca0c0328},
{0x604e810d,0x704b7722,0x5359a3b3,0x195a5efe}, -- {0xf825bb91604e810d, 0x32b4bdfd4d668ec},
{0x66a5340b,0x0d092c1b,0x75e14fc3,0x14484bfe}, -- {0xc684960de6a5340b, 0x289097fdd7853f0},
{0x521dc33c,0x2407567c,0x44b43fcf,0x1039d665}, -- {0xd203ab3e521dc33c, 0x2073accb12d0ff3},
{0x3696052c,0x533ef0c7,0x5453994b,0x19f623d5}, -- {0xe99f7863b696052c, 0x33ec47ab514e652},
{0x2bab3757,0x0f658d6c,0x5d0fadd6,0x14c4e977}, -- {0x87b2c6b62bab3757, 0x2989d2ef743eb75},
{0x6fbc2c45,0x25ead789,0x7da624ab,0x109d8792}, -- {0xd2f56bc4efbc2c45, 0x213b0f25f69892a},
{0x192d13a2,0x3caaf276,0x7c3d0778,0x1a95a5b7}, -- {0x1e55793b192d13a2, 0x352b4b6ff0f41de},
{0x475742e8,0x16ef285e,0x1697392d,0x15448493}, -- {0x4b77942f475742e8, 0x2a8909265a5ce4b},
{0x05df68ba,0x2bf286b2,0x4545c757,0x11039d42}, -- {0xd5f9435905df68ba, 0x22073a8515171d5},
{0x56324129,0x2cb73de9,0x553c7225,0x1b38fb9d}, -- {0x565b9ef4d6324129, 0x3671f73b54f1c89},
{0x78283421,0x3d5f64ba,0x2a96c1b7,0x15c72fb1}, -- {0xdeafb25d78283421, 0x2b8e5f62aa5b06d},
{0x2cecf681,0x31191d62,0x3babce2c,0x116c2627}, -- {0x188c8eb12cecf681, 0x22d84c4eeeaf38b},
{0x7b14bd9b,0x1b5b6236,0x7912e37a,0x1be03d0b}, -- {0x8dadb11b7b14bd9b, 0x37c07a17e44b8de},
{0x48dd647c,0x62af81c5,0x140f1c61,0x164cfda3}, -- {0x7157c0e2c8dd647c, 0x2c99fb46503c718},
{0x3a4ab6ca,0x1bbf9b04,0x29a5b04e,0x11d7314f}, -- {0x8ddfcd823a4ab6ca, 0x23ae629ea696c13},
{0x76ddf142,0x2c65c4d3,0x42a2b3b0,0x1c8b8218}, -- {0x1632e269f6ddf142, 0x391704310a8acec},
{0x5f17f435,0x09eb03dc,0x1bb55c8d,0x16d601ad}, -- {0x44f581ee5f17f435, 0x2dac035a6ed5723},
{0x4c1329c4,0x6e559cb0,0x162ab070,0x1244ce24}, -- {0x372ace584c1329c4, 0x24899c4858aac1c},
{0x79b842d3,0x7d55c780,0x09dde71a,0x1d3ae36d}, -- {0xbeaae3c079b842d3, 0x3a75c6da27779c6},
{0x61603576,0x4aab0600,0x3b17ec15,0x17624f8a}, -- {0x6555830061603576, 0x2ec49f14ec5fb05},
{0x4de6912b,0x6eef3800,0x627989aa,0x12b50c6e}, -- {0xb7779c004de6912b, 0x256a18dd89e626a},
{0x163db512,0x64b1f334,0x6a5c0f77,0x1dee7a4a}, -- {0xf258f99a163db512, 0x3bdcf495a9703dd},
{0x11caf741,0x36f4c290,0x0849a5f9,0x17f1fb6f}, -- {0x5b7a614811caf741, 0x2fe3f6de212697e},
{0x0e3bf901,0x5f2a3540,0x6d07b7fa,0x1327fc58}, -- {0xaf951aa00e3bf901, 0x264ff8b1b41edfe},
{0x7d2cc19b,0x7ea9eecc,0x14d9265d,0x1ea6608e}, -- {0x7f54f7667d2cc19b, 0x3d4cc11c5364997},
{0x30f09ae3,0x6554bf0a,0x2a4751e4,0x18851a0b}, -- {0x32aa5f8530f09ae3, 0x310a3416a91d479},
{0x5a5a1582,0x6aaa326e,0x3b6c4183,0x139dae6f}, -- {0xf55519375a5a1582, 0x273b5cdeedb1060},
{0x43c3559d,0x7776b717,0x2be068d2,0x1f62b0b2}, -- {0xbbbb5b8bc3c3559d, 0x3ec56164af81a34},
{0x6969114a,0x5f922c12,0x564d20a8,0x191bc08e}, -- {0x2fc916096969114a, 0x3237811d593482a},
{0x3aba743c,0x32db5675,0x2b70e6ed,0x141633a5}, -- {0x596dab3ababa743c, 0x282c674aadc39bb},
{0x2efb9030,0x0f15dec4,0x55f3ebf1,0x1011c2ea}, -- {0x478aef622efb9030, 0x202385d557cfafc},
{0x4b2c19e6,0x31bc97a0,0x5653131b,0x19b604aa}, -- {0xd8de4bd04b2c19e6, 0x336c0955594c4c6},
{0x08f014b8,0x5afd461a,0x2b75a8e2,0x14919d55}, -- {0xad7ea30d08f014b8, 0x29233aaaadd6a38},
{0x20c01093,0x48ca9e7b,0x6f9153e8,0x10747ddd}, -- {0x24654f3da0c01093, 0x20e8fbbbbe454fa},
{0x346680eb,0x747763f8,0x18e88640,0x1a53fc96}, -- {0x3a3bb1fc346680eb, 0x34a7f92c63a2190},
{0x5d1ecd89,0x29f91cc6,0x7a539e9a,0x150ffd44}, -- {0x94fc8e635d1ecd89, 0x2a1ffa89e94e7a6},
{0x4a7f0ad4,0x54c74a38,0x2ea94bae,0x10d9976a}, -- {0xaa63a51c4a7f0ad4, 0x21b32ed4baa52eb},
{0x7731aaed,0x3ad876c0,0x4aa87917,0x1af5bf10}, -- {0xdd6c3b607731aaed, 0x35eb7e212aa1e45},
{0x78f488bd,0x2f139233,0x6eed2dac,0x159165a6}, -- {0x1789c919f8f488bd, 0x2b22cb4dbbb4b6b},
{0x2d906d64,0x58dc74f6,0x0bf0f156,0x11411e1f}, -- {0xac6e3a7b2d906d64, 0x22823c3e2fc3c55},
{0x15b3e23a,0x27c7218a,0x79818224,0x1b9b6364}, -- {0x13e390c515b3e23a, 0x3736c6c9e606089},
{0x77c31b62,0x396c1ad4,0x479ace83,0x1615e91d}, -- {0xdcb60d6a77c31b62, 0x2c2bd23b1e6b3a0},
{0x7968e2b5,0x7abce243,0x3948a535,0x11ab20e4}, -- {0x7d5e7121f968e2b5, 0x235641c8e52294d},
{0x0f0e3787,0x112e36d3,0x420dd523,0x1c45016d}, -- {0xc8971b698f0e3787, 0x388a02db0837548},
{0x58d82c6c,0x40f1c575,0x01a4aa82,0x169d9abe}, -- {0xa078e2bad8d82c6c, 0x2d3b357c0692aa0},
{0x2d79bd24,0x4d8e3791,0x3483bb9b,0x1217aefe}, -- {0xe6c71bc8ad79bd24, 0x242f5dfcd20eee6},
{0x48c2c839,0x15b058e8,0x07392c2c,0x1cf2b197}, -- {0xad82c7448c2c839, 0x39e5632e1ce4b0b},
{0x3a356cfa,0x77c04720,0x38fa89bc,0x17288e12}, -- {0x3be023903a356cfa, 0x2e511c24e3ea26f},
{0x482abd95,0x5fcd05b3,0x60c86e30,0x1286d80e}, -- {0x2fe682d9c82abd95, 0x250db01d8321b8c},
{0x26aac8ee,0x1948091f,0x3473e381,0x1da48ce4}, -- {0x4ca4048fa6aac8ee, 0x3b4919c8d1cf8e0},
{0x1eef0725,0x7aa0074c,0x105cb600,0x17b6d71d}, -- {0x3d5003a61eef0725, 0x2f6dae3a4172d80},
{0x7f259f51,0x2ee66c3c,0x26b0919a,0x12f8ac17}, -- {0x9773361e7f259f51, 0x25f1582e9ac2466},
{0x6508fee8,0x17d71394,0x0ab41c2a,0x1e5aacf2}, -- {0x8beb89ca6508fee8, 0x3cb559e42ad070a},
{0x373a6586,0x5fdf42dd,0x2229b021,0x18488a5b}, -- {0x6fefa16eb73a6586, 0x309114b688a6c08},
{0x78fb846b,0x664c357d,0x1b548ce7,0x136d3b7c}, -- {0xf3261abef8fb846b, 0x26da76f86d52339},
{0x0e5f3a45,0x23ad2263,0x788747d9,0x1f152bf9}, -- {0x51d691318e5f3a45, 0x3e2a57f3e21d1f6},
{0x71e5c837,0x1c8a81e8,0x7a05d314,0x18ddbcc7}, -- {0xe4540f471e5c837, 0x31bb798fe8174c5},
{0x74b7d360,0x306ece53,0x2e6b0f43,0x13e49706}, -- {0xd8376729f4b7d360, 0x27c92e0cb9ac3d0},
{0x21261eff,0x6717b086,0x7d78186b,0x1fd424d6}, -- {0xf38bd84321261eff, 0x3fa849adf5e061a},
{0x00eb4bff,0x52795a05,0x179346bc,0x197683df}, -- {0x293cad0280eb4bff, 0x32ed07be5e4d1af},
{0x00bc3ccc,0x5b944804,0x5fa90563,0x145ecfe5}, -- {0xedca240200bc3ccc, 0x28bd9fcb7ea4158},
{0x1a3030a4,0x7c76a003,0x4c873782,0x104bd984}, -- {0xbe3b50019a3030a4, 0x2097b309321cde0},
{0x104d1a9f,0x13f10005,0x7a71f26b,0x1a12f5a0}, -- {0xc9f88002904d1a9f, 0x3425eb41e9c7c9a},
{0x403daee6,0x765a666a,0x7b8e5b88,0x14dbf7b3}, -- {0x3b2d3335403daee6, 0x29b7ef67ee396e2},
{0x003158b8,0x2b7b8522,0x62d8493a,0x10aff95c}, -- {0x95bdc291003158b8, 0x215ff2b98b6124e},
{0x4d1bc126,0x125f3b69,0x37c0752a,0x1ab32894}, -- {0x892f9db4cd1bc126, 0x35665128df01d4a},
{0x0a7c9a85,0x0eb295ee,0x5fcd2a88,0x155c2076}, -- {0x7594af70a7c9a85, 0x2ab840ed7f34aa2},
{0x0863aed1,0x588ede58,0x7fd75539,0x1116805e}, -- {0x6c476f2c0863aed1, 0x222d00bdff5d54e},
{0x5a3917b4,0x274afd59,0x1958885c,0x1b5733cb}, -- {0x13a57eacda3917b4, 0x36ae67966562217},
{0x482dac90,0x1f6f3114,0x477a06b0,0x15df5ca2}, -- {0xfb7988a482dac90, 0x2bbeb9451de81ac},
{0x6cf156da,0x32bf5a76,0x6c619ef3,0x117f7d4e}, -- {0xd95fad3b6cf156da, 0x22fefa9db1867bc},
{0x2e4ef15c,0x6acbc3f1,0x470297eb,0x1bff2ee4}, -- {0xf565e1f8ae4ef15c, 0x37fe5dc91c0a5fa},
{0x0b725ab0,0x223c9cc1,0x1f354656,0x1665bf1d}, -- {0x911e4e608b725ab0, 0x2ccb7e3a7cd5195},
{0x0928488d,0x34fd4a34,0x4c2a9eab,0x11eaff4a}, -- {0xda7ea51a0928488d, 0x23d5fe9530aa7aa},
{0x28407415,0x6e621053,0x79ddcaab,0x1cab3210}, -- {0xf7310829a8407415, 0x39566421e7772aa},
{0x6d005cde,0x584e7375,0x617e3bbc,0x16ef5b40}, -- {0x2c2739baed005cde, 0x2ddeb68185f8eef},
{0x24004a4b,0x79d85c5e,0x3464fc96,0x125915cd}, -- {0xbcec2e2f24004a4b, 0x24b22b9ad193f25},
{0x5333aa11,0x295a2d63,0x3a3b2dbe,0x1d5b5615}, -- {0x94ad16b1d333aa11, 0x3ab6ac2ae8ecb6f},
{0x5c2954db,0x5448244f,0x7b628afe,0x177c44dd}, -- {0xaa241227dc2954db, 0x2ef889bbed8a2bf},
{0x635443e2,0x29d3503f,0x491ba265,0x12c9d0b1}, -- {0x54e9a81fe35443e2, 0x2593a163246e899},
{0x1eed396a,0x42ebb399,0x282c3708,0x1e0fb44f}, -- {0x2175d9cc9eed396a, 0x3c1f689ea0b0dc2},
{0x18bdc788,0x4f22f614,0x39bcf8d3,0x180c903f}, -- {0xe7917b0a18bdc788, 0x3019207ee6f3e34},
{0x46fe393a,0x72825e76,0x6163fa42,0x133d4032}, -- {0xb9412f3b46fe393a, 0x267a8065858fe90},
{0x57fd285c,0x6a6a30bd,0x4f065d37,0x1ec866b7}, -- {0xf535185ed7fd285c, 0x3d90cd6f3c1974d},
{0x7997537d,0x0854f3ca,0x3f384a93,0x18a0522c}, -- {0xc42a79e57997537d, 0x3140a458fce12a4},
{0x2e12a931,0x06aa5ca2,0x32936edc,0x13b374f0}, -- {0x3552e512e12a931, 0x2766e9e0ca4dbb7},
{0x63510eb4,0x3ddd6103,0x041f17c6,0x1f8587e7}, -- {0x9eeeb081e3510eb4, 0x3f0b0fce107c5f1},
{0x4f740bc3,0x17e44d9c,0x034c1305,0x19379fec}, -- {0x4bf226ce4f740bc3, 0x326f3fd80d304c1},
{0x72c33c9c,0x46503e16,0x02a3426a,0x142c7ff0}, -- {0xa3281f0b72c33c9c, 0x2858ffe00a8d09a},
{0x7568fd4a,0x384031ab,0x68829b88,0x1023998c}, -- {0x1c2018d5f568fd4a, 0x20473319a20a6e2},
{0x08a7fba9,0x7399e913,0x5a6a9273,0x19d28f47}, -- {0xf9ccf48988a7fba9, 0x33a51e8f69aa49c},
{0x53b99621,0x7614ba75,0x61eedb8f,0x14a8729f}, -- {0xfb0a5d3ad3b99621, 0x2950e53f87bb6e3},
{0x296144e7,0x5e76fb91,0x34bf160c,0x1086c219}, -- {0x2f3b7dc8a96144e7, 0x210d8432d2fc583},
{0x42353b0c,0x4a57f8e8,0x07982347,0x1a71368f}, -- {0xe52bfc7442353b0c, 0x34e26d1e1e608d1},
{0x34f76270,0x6eacc720,0x6c79b5d2,0x15275ed8}, -- {0xb756639034f76270, 0x2a4ebdb1b1e6d74},
{0x5d92b526,0x588a38e6,0x56c7c4a8,0x10ec4be0}, -- {0x2c451c735d92b526, 0x21d897c15b1f12a},
{0x7c1deea3,0x27438e3d,0x57a60774,0x1b13ac9a}, -- {0x13a1c71efc1deea3, 0x362759355e981dd},
{0x634b2550,0x6c360b64,0x12eb3929,0x15a956e2}, -- {0x761b05b2634b2550, 0x2b52adc44bace4a},
{0x6908eaa6,0x235e6f83,0x5bef60ee,0x11544581}, -- {0x91af37c1e908eaa6, 0x22a88b036fbd83b},
{0x5b417770,0x0563e59f,0x464bce4a,0x1bba08cf}, -- {0x82b1f2cfdb417770, 0x3774119f192f392},
{0x629ac5f3,0x1de9847f,0x6b6fd83b,0x162e6d72}, -- {0xcef4c23fe29ac5f3, 0x2c5cdae5adbf60e},
{0x687bd190,0x7e5469ff,0x3c5979c8,0x11bebdf5}, -- {0x3f2a34ffe87bd190, 0x237d7beaf165e72},
{0x5a5fb5b2,0x30870fff,0x2d5bf60e,0x1c646322}, -- {0x984387ffda5fb5b2, 0x38c8c644b56fd83},
{0x484c915b,0x406c0ccc,0x0aaff80b,0x16b6b5b5}, -- {0xe0360666484c915b, 0x2d6d6b6a2abfe02},
{0x53707449,0x005670a3,0x6ef32cd6,0x122bc490}, -- {0x802b3851d3707449, 0x24578921bbccb35},
{0x6be72075,0x33bd8105,0x7e51e156,0x1d12d41a}, -- {0x99dec082ebe72075, 0x3a25a835f947855},
{0x0985b391,0x5c979a6b,0x650e4dde,0x17424348}, -- {0xae4bcd358985b391, 0x2e8486919439377},
{0x3ad15c74,0x7d461522,0x040b717e,0x129b6907}, -- {0xbea30a913ad15c74, 0x2536d20e102dc5f},
{0x77b560b9,0x7ba35503,0x0678b597,0x1dc574d8}, -- {0xfdd1aa81f7b560b9, 0x3b8ae9b019e2d65},
{0x5fc44d61,0x2fb5dd9c,0x38609146,0x17d12a46}, -- {0x97daeece5fc44d61, 0x2fa2548ce182451},
{0x1969d781,0x3fc4b14a,0x46b3a76b,0x130dbb6b}, -- {0xdfe258a51969d781, 0x261b76d71ace9da},
{0x0f0fbf34,0x32d44edd,0x3dec3f12,0x1e7c5f12}, -- {0x996a276e8f0fbf34, 0x3cf8be24f7b0fc4},
{0x3f3fcc2a,0x4243724a,0x7e5698db,0x18637f41}, -- {0xe121b9253f3fcc2a, 0x30c6fe83f95a636},
{0x32997022,0x6835f508,0x651213e2,0x1382cc34}, -- {0xb41afa8432997022, 0x2705986994484f8},
{0x6a8f19cf,0x59efee73,0x21b68637,0x1f37ad21}, -- {0xecf7f739ea8f19cf, 0x3e6f5a4286da18d},
{0x3ba5ae40,0x47f32529,0x67c5382c,0x18f9574d}, -- {0x23f99294bba5ae40, 0x31f2ae9b9f14e0b},
{0x2fb7be99,0x1ff5b754,0x1fd0f9bd,0x13faac3e}, -- {0x4ffadbaa2fb7be99, 0x27f5587c7f43e6f},
{0x1925fdc2,0x7fef8bba,0x194e5c61,0x1ff779fd}, -- {0x7ff7c5dd1925fdc2, 0x3feef3fa6539718},
{0x141e649b,0x198c6fc8,0x610b7d1b,0x1992c7fd}, -- {0xccc637e4141e649b, 0x33258ffb842df46},
{0x434b83af,0x2e09f306,0x00d5fdaf,0x14756ccb}, -- {0xd704f983434b83af, 0x28ead9960357f6b},
{0x4f6f9c8c,0x24d4c26b,0x33de648c,0x105df0a2}, -- {0x126a6135cf6f9c8c, 0x20bbe144cf79923},
{0x18b29414,0x07bad0ac,0x1fca3a7a,0x1a2fe76a}, -- {0x83dd685618b29414, 0x345fced47f28e9e},
{0x608edcdd,0x39624089,0x196e952e,0x14f31f88}, -- {0x9cb12044e08edcdd, 0x29e63f1065ba54b},
{0x33a57d7d,0x2de833a1,0x14587758,0x10c27fa0}, -- {0x16f419d0b3a57d7d, 0x2184ff405161dd6},
{0x6c3bfbfb,0x1640529b,0x3a27255a,0x1ad0cc33}, -- {0x8b20294dec3bfbfb, 0x35a19866e89c956},
{0x3cfcc996,0x78337549,0x481f5114,0x1573d68f}, -- {0x3c19baa4bcfcc996, 0x2ae7ad1f207d445},
{0x30ca3adf,0x135c5dd4,0x6ce5da77,0x11297872}, -- {0xc9ae2eea30ca3adf, 0x2252f0e5b39769d},
{0x1add2afd,0x1efa2fba,0x47d62a58,0x1b758d84}, -- {0xf7d17dd1add2afd, 0x36eb1b091f58a96},
{0x7be42264,0x7f2e8c94,0x0644eeac,0x15f7a46a}, -- {0x3f97464a7be42264, 0x2bef48d41913bab},
{0x631ce850,0x18f20a10,0x38372557,0x1192e9ee}, -- {0xcc790508631ce850, 0x2325d3dce0dc955},
{0x04fb0d4d,0x4183434e,0x0d25088b,0x1c1e4317}, -- {0xe0c1a1a704fb0d4d, 0x383c862e3494222},
{0x1d95a43e,0x1acf690b,0x3db73a09,0x167e9c12}, -- {0x4d67b4859d95a43e, 0x2cfd3824f6dce82},
{0x17aae9cb,0x623f873c,0x7e2c2e6d,0x11fee341}, -- {0x711fc39e17aae9cb, 0x23fdc683f8b0b9b},
{0x0c44a945,0x5065a52d,0x3046b0af,0x1ccb0536}, -- {0xe832d2968c44a945, 0x39960a6cc11ac2b},
{0x3d03ba9e,0x59eaea8a,0x269ef3bf,0x1708d0f8}, -- {0xecf575453d03ba9e, 0x2e11a1f09a7bcef},
{0x6402fbb1,0x2e55886e,0x6bb25c99,0x126d73f9}, -- {0x572ac4376402fbb1, 0x24dae7f3aec9726},
{0x6cd192b5,0x3088da4a,0x791d60f5,0x1d7becc2}, -- {0x58446d256cd192b5, 0x3af7d985e47583d},
{0x23dadbc4,0x73a0aea2,0x2db11a5d,0x17965702}, -- {0x79d0575123dadbc4, 0x2f2cae04b6c4697},
{0x697be303,0x294d5881,0x715a7b7e,0x12deac01}, -- {0x94a6ac40e97be303, 0x25bd5803c569edf},
{0x0f2c9e6c,0x0ee22736,0x1bc3f8ca,0x1e311336}, -- {0x8771139b0f2c9e6c, 0x3c62266c6f0fe32},
{0x58f07ebd,0x3f1b5291,0x63032d6e,0x18274291}, -- {0x9f8da948d8f07ebd, 0x304e85238c0cb5b},
{0x60c06564,0x4c15dba7,0x68cf578b,0x13529ba7}, -- {0xe60aedd3e0c06564, 0x26a5374fa33d5e2},
{0x679a3bd2,0x46895f72,0x0e188c12,0x1eea92a6}, -- {0xa344afb9679a3bd2, 0x3dd5254c3862304},
{0x0614fca8,0x52077f8f,0x71ad3cdb,0x18bba884}, -- {0xe903bfc78614fca8, 0x31775109c6b4f36},
{0x3810ca20,0x74d2cc72,0x415763e2,0x13c9539d}, -- {0xba6966393810ca20, 0x2792a73b055d8f8},
{0x59b4769a,0x54847a50,0x688bd304,0x1fa885c8}, -- {0x2a423d2859b4769a, 0x3f510b91a22f4c1},
{0x47c39215,0x5d36c840,0x206fdc03,0x19539e3a}, -- {0xee9b642047c39215, 0x32a73c7481bf700},
{0x396941aa,0x7dc56d00,0x338cb002,0x1442e4fb}, -- {0xbee2b680396941aa, 0x2885c9f6ce32c00},
{0x61210155,0x7e378a66,0x293d599b,0x103583fc}, -- {0xff1bc53361210155, 0x206b07f8a4f5666},
{0x35019bbb,0x638c10a4,0x5b955c2c,0x19ef3993}, -- {0x31c6085235019bbb, 0x33de73276e5570b},
{0x44014963,0x4fa34083,0x7c777cf0,0x14bf6142}, -- {0x27d1a041c4014963, 0x297ec285f1ddf3c},
{0x50010782,0x594f66cf,0x7d2c63f3,0x10991a9b}, -- {0xeca7b367d0010782, 0x21323537f4b18fc},
{0x0001a59d,0x5bb23e19,0x48470652,0x1a8e90f9}, -- {0xadd91f0c8001a59d, 0x351d21f3211c194},
{0x3334847e,0x62f4fe7a,0x2038d1db,0x153eda61}, -- {0xf17a7f3d3334847e, 0x2a7db4c280e3476},
{0x5c2a0398,0x4f2a652e,0x4cfa417c,0x10ff151a}, -- {0x279532975c2a0398, 0x21fe2a3533e905f},
{0x13766c26,0x31dd6eb1,0x619068c7,0x1b31bb5d}, -- {0xd8eeb75893766c26, 0x366376bb8641a31},
{0x42c52352,0x74b1255a,0x34738705,0x15c162b1}, -- {0x7a5892ad42c52352, 0x2b82c562d1ce1c1},
{0x02374f75,0x76f41de2,0x438f9f37,0x11678227}, -- {0xfb7a0ef102374f75, 0x22cf044f0e3e7cd},
{0x038bb254,0x0b202fd0,0x1f4c31f3,0x1bd8d03f}, -- {0xc59017e8038bb254, 0x37b1a07e7d30c7c},
{0x693c8eaa,0x6f4cf30c,0x32a35b28,0x16470cff}, -- {0x37a67986693c8eaa, 0x2c8e19feca8d6ca},
{0x6dca0bbb,0x72a3f5a3,0x2882af53,0x11d270cc}, -- {0xf951fad1edca0bbb, 0x23a4e198a20abd4},
{0x7c76792b,0x510655d2,0x27377eec,0x1c83e7ad}, -- {0x28832ae97c76792b, 0x3907cf5a9cddfbb},
{0x305ec756,0x40d1de42,0x5292cbf0,0x16cfec8a}, -- {0x2068ef21305ec756, 0x2d9fd9154a4b2fc},
{0x0d189f78,0x33db1835,0x75423cc0,0x123ff06e}, -- {0x19ed8c1a8d189f78, 0x247fe0ddd508f30},
{0x61c0ff26,0x395e8d21,0x0869facd,0x1d331a4b}, -- {0x5caf4690e1c0ff26, 0x3a66349621a7eb3},
{0x01673285,0x144ba41b,0x6d219571,0x175c1508}, -- {0x4a25d20d81673285, 0x2eb82a11b48655c},
{0x1ab8f537,0x76a2e9af,0x70e7aac0,0x12b010d3}, -- {0x3b5174d79ab8f537, 0x256021a7c39eab0},
{0x445b21f1,0x2437dc4b,0x0172aace,0x1de68153}, -- {0x921bee25c45b21f1, 0x3bcd02a605caab3},
{0x69e2818e,0x369316a2,0x678eef0b,0x17eb9aa8}, -- {0xdb498b5169e2818e, 0x2fd735519e3bbc2},
{0x54b53472,0x2ba8dee8,0x52d8bf3c,0x1322e220}, -- {0x15d46f7454b53472, 0x2645c4414b62fcf},
{0x545520b6,0x5f7497da,0x515acb93,0x1e9e369a}, -- {0xefba4bed545520b6, 0x3d3c6d35456b2e4},
{0x10441a2b,0x65f6dfe2,0x277bd60f,0x187e9215}, -- {0xf2fb6ff110441a2b, 0x30fd242a9def583},
{0x59d014ef,0x1e5f1981,0x6c6311a6,0x139874dd}, -- {0x8f2f8cc0d9d014ef, 0x2730e9bbb18c469},
{0x5c80217f,0x63cb5c02,0x13d1b5d6,0x1f5a5496}, -- {0xb1e5ae015c80217f, 0x3eb4a92c4f46d75},
{0x4a001acc,0x03091668,0x0fdaf7df,0x19151078}, -- {0xc1848b344a001acc, 0x322a20f03f6bdf7},
{0x3b3348a3,0x1c074520,0x597bf97f,0x1410d9f9}, -- {0xce03a2903b3348a3, 0x2821b3f365efe5f},
{0x628f6d4f,0x3005d0e6,0x14632dff,0x100d7b2e}, -- {0xd802e873628f6d4f, 0x201af65c518cb7f},
{0x1db2487f,0x333c8171,0x07051665,0x19af2b7d}, -- {0x599e40b89db2487f, 0x335e56fa1c14599},
{0x17c1d399,0x4296cdf4,0x38d0deb7,0x148c22ca}, -- {0xe14b66fa17c1d399, 0x29184594e3437ad},
{0x7967dc7a,0x02123e5c,0x13da4bc6,0x10701bd5}, -- {0x81091f2e7967dc7a, 0x20e037aa4f692f1},
{0x0f0c93f6,0x368396fb,0x062a12d6,0x1a4cf955}, -- {0x9b41cb7d8f0c93f6, 0x3499f2aa18a84b5},
{0x0c0a0ff8,0x5ecfabfc,0x6b54dbde,0x150a6110}, -- {0xaf67d5fe0c0a0ff8, 0x2a14c221ad536f7},
{0x70080cc7,0x6572effc,0x6f77164b,0x10d51a73}, -- {0xf2b977fe70080cc7, 0x21aa34e7bddc592},
{0x4cd9ae0b,0x3beb1994,0x325823ac,0x1aee90b9}, -- {0x1df58cca4cd9ae0b, 0x35dd2172c9608eb},
{0x57148b3c,0x4988e143,0x5b79b623,0x158ba6fa}, -- {0xe4c470a1d7148b3c, 0x2b174df56de6d88},
{0x1276d5ca,0x07a0b436,0x2f9491b6,0x113c8595}, -- {0x83d05a1b1276d5ca, 0x22790b2abe5246d},
{0x03f1560f,0x3f6786bd,0x7f541c56,0x1b9408ee}, -- {0x9fb3c35e83f1560f, 0x372811ddfd50715},
{0x365aab3f,0x65ec6bca,0x4c4349de,0x16100725}, -- {0xb2f635e5365aab3f, 0x2c200e4b310d277},
{0x5eaeef66,0x6b23896e,0x09cf6e4b,0x11a66c1e}, -- {0xf591c4b75eaeef66, 0x234cd83c273db92},
{0x644b18a3,0x5e9f424a,0x5c7f16df,0x1c3d79c9}, -- {0xef4fa125644b18a3, 0x387af39371fc5b7},
{0x69d5ad4f,0x187f683b,0x3065abe6,0x169794a1}, -- {0x8c3fb41de9d5ad4f, 0x2d2f2942c196af9},
{0x2177bdd9,0x79ff8696,0x73848984,0x1212dd4d}, -- {0x3cffc34b2177bdd9, 0x2425ba9bce12261},
{0x68bf9628,0x2998d756,0x6c07426e,0x1ceafbaf}, -- {0x94cc6bab68bf9628, 0x39d5f75fb01d09b},
{0x6d6611b9,0x214712ab,0x099f6858,0x172262f3}, -- {0x10a38955ed6611b9, 0x2e44c5e6267da16},
{0x5784dafb,0x3438dbbc,0x3ae5ed13,0x1281e8c2}, -- {0xda1c6dde5784dafb, 0x2503d184eb97b44},
{0x58d49191,0x6d27c5fa,0x44a314eb,0x1d9ca79d}, -- {0xf693e2fd58d49191, 0x3b394f3b128c53a},
{0x60aa0e0e,0x0a8637fb,0x50827723,0x17b08617}, -- {0xc5431bfde0aa0e0e, 0x2f610c2f4209dc8},
{0x33bb3e72,0x55382cc9,0x26cec5b5,0x12f39e79}, -- {0x6a9c1664b3bb3e72, 0x25e73cf29b3b16d},
{0x6c5eca4f,0x21f37adb,0x3e17a2bc,0x1e529728}, -- {0x10f9bd6dec5eca4f, 0x3ca52e50f85e8af},
{0x704bd50c,0x34c2c8af,0x64dfb563,0x18421286}, -- {0xda616457f04bd50c, 0x3084250d937ed58},
{0x0d09773d,0x43cf06f3,0x1d7fc44f,0x13680ed2}, -- {0xe1e783798d09773d, 0x26d01da475ff113},
{0x480f252e,0x06180b1e,0x48cc6d4c,0x1f0ce483}, -- {0x30c058f480f252e, 0x3e19c9072331b53},
{0x06728425,0x51acd5b2,0x0709f109,0x18d71d36}, -- {0x68d66ad906728425, 0x31ae3a6c1c27c42},
{0x052869b7,0x0e23de28,0x526e5a6e,0x13df4a91}, -- {0x8711ef14052869b7, 0x27be952349b969b},
{0x550d75f2,0x169fc9d9,0x50b090b0,0x1fcbaa82}, -- {0xb4fe4ecd50d75f2, 0x3f97550542c242c},
{0x773df7f5,0x454ca17a,0x5a26da26,0x196fbb9b}, -- {0xa2a650bd773df7f5, 0x32df7737689b689},
{0x2c31932a,0x6aa3b462,0x7b52481e,0x145962e2}, -- {0xb551da312c31932a, 0x28b2c5c5ed49207},
{0x235adc22,0x3bb629e8,0x15db6ce5,0x1047824f}, -- {0x5ddb14f4235adc22, 0x208f049e576db39},
{0x6bc49369,0x5f89dca6,0x6fc57b08,0x1a0c03b1}, -- {0x2fc4ee536bc49369, 0x34180763bf15ec2},
{0x2303a921,0x7fa17d52,0x0c9dfc06,0x14d6695b}, -- {0xbfd0bea92303a921, 0x29acd2b63277f01},
{0x0269541a,0x32e79775,0x0a17fcd2,0x10ab877c}, -- {0x9973cbba8269541a, 0x21570ef8285ff34},
{0x6a42202a,0x37d8f254,0x5cf32e1d,0x1aac0bf9}, -- {0x5bec792a6a42202a, 0x355817f373ccb87},
{0x6e9b4cef,0x46472843,0x7d8f5817,0x15566ffa}, -- {0xe3239421ee9b4cef, 0x2aacdff5f63d605},
{0x25490a59,0x6b6c2036,0x17a5e012,0x1111f32f}, -- {0xb5b6101b25490a59, 0x2223e65e5e97804},
{0x5541aa27,0x4579cd23,0x59096684,0x1b4feb7e}, -- {0x22bce691d541aa27, 0x369fd6fd64259a1},
{0x5dce21b9,0x6ac7d74f,0x14078536,0x15d98932}, -- {0xb563eba7ddce21b9, 0x2bb31264501e14d},
{0x3171b494,0x6f0645d9,0x1006042b,0x117ad428}, -- {0xf78322ecb171b494, 0x22f5a850401810a},
{0x024f8753,0x4b3d3c8f,0x667006ac,0x1bf7b9d9}, -- {0x259e9e47824f8753, 0x37ef73b399c01ab},
{0x1b72d2a9,0x3c30fd3f,0x38599ef0,0x165fc7e1}, -- {0x1e187e9f9b72d2a9, 0x2cbf8fc2e1667bc},
{0x62c24221,0x168d9765,0x137ae58d,0x11e63981}, -- {0x4b46cbb2e2c24221, 0x23cc73024deb963},
{0x1e039d01,0x2415bf09,0x05916f48,0x1ca38f35}, -- {0x120adf849e039d01, 0x39471e6a1645bd2},
{0x319c7d9a,0x3677cc07,0x514125d3,0x16e93f5d}, -- {0xdb3be603b19c7d9a, 0x2dd27ebb4504974},
{0x27b0647c,0x785fd66c,0x27675175,0x125432b1}, -- {0x7c2feb3627b0647c, 0x24a865629d9d45d},
{0x25e7072c,0x5a32f0ad,0x723ee8bc,0x1d53844e}, -- {0x2d197856a5e7072c, 0x3aa7089dc8fba2f},
{0x37ec05bd,0x14f58d57,0x283253ca,0x17760372}, -- {0x8a7ac6abb7ec05bd, 0x2eec06e4a0c94f2},
{0x2cbcd164,0x2a5e0aac,0x535b763b,0x12c4cf8e}, -- {0xd52f05562cbcd164, 0x25899f1d4d6dd8e},
{0x2dfae8a0,0x43c9aaad,0x6bc589f8,0x1e07b27d}, -- {0x21e4d556adfae8a0, 0x3c0f64fbaf1627e},
{0x57fbed4d,0x4fd4888a,0x5637a193,0x18062864}, -- {0xe7ea444557fbed4d, 0x300c50c958de864},
{0x132ff10a,0x5976d3a2,0x44f94e0f,0x13382050}, -- {0xecbb69d1132ff10a, 0x267040a113e5383},
{0x051981aa,0x5bf1529d,0x07f549b2,0x1ec033b4}, -- {0xadf8a94e851981aa, 0x3d8067681fd526c},
{0x50e13488,0x165aa87d,0x399107c2,0x1899c2f6}, -- {0x8b2d543ed0e13488, 0x313385ece6441f0},
{0x0d80f6d3,0x2b7bb9fe,0x7ada6c9b,0x13ae3591}, -- {0xd5bddcff0d80f6d3, 0x275c6b23eb69b26},
{0x7c018aeb,0x125f8ffc,0x115d7a92,0x1f7d2283}, -- {0x892fc7fe7c018aeb, 0x3efa45064575ea4},
{0x499ad589,0x75193ffd,0x744ac874,0x1930e868}, -- {0x3a8c9ffec99ad589, 0x3261d0d1d12b21d},
{0x07af113b,0x10e0fffe,0x76a239f7,0x14272053}, -- {0xc8707fff07af113b, 0x284e40a7da88e7d},
{0x52f2742f,0x73e73331,0x7881c7f8,0x101f4d0f}, -- {0x39f39998d2f2742f, 0x203e9a1fe2071fe},
{0x04b7204b,0x1fd851e9,0x7402d98e,0x19cbae7f}, -- {0x8fec28f484b7204b, 0x33975cffd00b663},
{0x36f8e6a2,0x331374ba,0x7668ae0b,0x14a2f1ff}, -- {0xd989ba5d36f8e6a2, 0x2945e3ffd9a2b82},
{0x2bfa521c,0x0f42c3c8,0x11ed5809,0x10825b33}, -- {0x47a161e42bfa521c, 0x2104b66647b5602},
{0x132a1cf9,0x186ad2da,0x031559a8,0x1a6a2b85}, -- {0xc35696d132a1cf9, 0x34d4570a0c5566a},
{0x4288172d,0x1388a8ae,0x35aaae20,0x1521bc6a}, -- {0x9c454574288172d, 0x2a4378d4d6aab88},
{0x1ba0128b,0x42d3ba25,0x5e2224e6,0x10e7c9ee}, -- {0xa169dd129ba0128b, 0x21cf93dd7888939},
{0x79001dab,0x0485f6a1,0x6369d4a4,0x1b0c764a}, -- {0x242fb50f9001dab, 0x3618ec958da7529},
{0x140017bc,0x36d1921b,0x35ee43b6,0x15a391d5}, -- {0x9b68c90d940017bc, 0x2b4723aad7b90ed},
{0x2999ac96,0x124141af,0x77f1cfc5,0x114fa7dd}, -- {0x4920a0d7a999ac96, 0x229f4fbbdfc73f1},
{0x0f5c4757,0x6a0202b2,0x731c7fa1,0x1bb2a62f}, -- {0x750101590f5c4757, 0x37654c5fcc71fe8},
{0x3f7d05df,0x54ce688e,0x0f49ffb4,0x162884f3}, -- {0x2a6734473f7d05df, 0x2c5109e63d27fed},
{0x65fd9e4c,0x5d71ed3e,0x5907ffc3,0x11ba03f5}, -- {0xeeb8f69f65fd9e4c, 0x237407eb641fff0},
{0x3cc8fd46,0x48b64864,0x5b3fff9f,0x1c5cd322}, -- {0xe45b24323cc8fd46, 0x38b9a6456cfffe7},
{0x30a0ca9f,0x6d5ea050,0x48ffffb2,0x16b0a8e8}, -- {0xb6af502830a0ca9f, 0x2d6151d123fffec},
{0x26e7087f,0x71188040,0x6d99995b,0x1226ed86}, -- {0xf88c402026e7087f, 0x244ddb0db666656},
{0x3e3e73fe,0x4e8d9a00,0x48f5c22c,0x1d0b15a4}, -- {0x2746cd003e3e73fe, 0x3a162b4923d708b},
{0x64fec332,0x3ed7ae66,0x3a5e34f0,0x173c1150}, -- {0x1f6bd73364fec332, 0x2e7822a0e978d3c},
{0x50cbcf5b,0x4bdfbeb8,0x2eb1c3f3,0x12967440}, -- {0xe5efdf5c50cbcf5b, 0x252ce880bac70fc},
{0x1adfb22b,0x7965fdf4,0x311c6cb8,0x1dbd86cd}, -- {0x3cb2fefa1adfb22b, 0x3b7b0d9ac471b2e},
{0x2f195b56,0x611e64c3,0x7416bd60,0x17cad23d}, -- {0x308f3261af195b56, 0x2f95a47bd05af58},
{0x25ade2ab,0x3418509c,0x4345644d,0x1308a831}, -- {0x5a0c284e25ade2ab, 0x261150630d15913},
{0x55e30445,0x535a1a93,0x1ed56d48,0x1e74404f}, -- {0x29ad0d49d5e30445, 0x3ce8809e7b55b52},
{0x5e4f369d,0x2914e20f,0x3244576d,0x185d003f}, -- {0x548a7107de4f369d, 0x30ba007ec9115db},
{0x650c2bb1,0x3a771b3f,0x2836ac57,0x137d99cc}, -- {0xdd3b8d9fe50c2bb1, 0x26fb3398a0dab15},
{0x21ad12b5,0x2a582b99,0x0d2446f2,0x1f2f5c7a}, -- {0x952c15cca1ad12b5, 0x3e5eb8f434911bc},
{0x67bda891,0x6eacefad,0x575038c1,0x18f2b061}, -- {0x775677d6e7bda891, 0x31e560c35d40e30},
{0x063153a7,0x0bbd8c8b,0x5f73609b,0x13f559e7}, -- {0xc5dec645863153a7, 0x27eab3cf7dcd826}
}
assert(#M.DOUBLE_POW5_INV_SPLIT == 291)
M.DOUBLE_POW5_SPLIT = { [0] =
{0x00000000,0x00000000,0x00000000,0x08000000}, -- {0x0, 0x100000000000000},
{0x00000000,0x00000000,0x00000000,0x0a000000}, -- {0x0, 0x140000000000000},
{0x00000000,0x00000000,0x00000000,0x0c800000}, -- {0x0, 0x190000000000000},
{0x00000000,0x00000000,0x00000000,0x0fa00000}, -- {0x0, 0x1f4000000000000},
{0x00000000,0x00000000,0x00000000,0x09c40000}, -- {0x0, 0x138800000000000},
{0x00000000,0x00000000,0x00000000,0x0c350000}, -- {0x0, 0x186a00000000000},
{0x00000000,0x00000000,0x00000000,0x0f424000}, -- {0x0, 0x1e8480000000000},
{0x00000000,0x00000000,0x00000000,0x09896800}, -- {0x0, 0x1312d0000000000},
{0x00000000,0x00000000,0x00000000,0x0bebc200}, -- {0x0, 0x17d784000000000},
{0x00000000,0x00000000,0x00000000,0x0ee6b280}, -- {0x0, 0x1dcd65000000000},
{0x00000000,0x00000000,0x00000000,0x09502f90}, -- {0x0, 0x12a05f200000000},
{0x00000000,0x00000000,0x00000000,0x0ba43b74}, -- {0x0, 0x174876e80000000},
{0x00000000,0x00000000,0x00000000,0x0e8d4a51}, -- {0x0, 0x1d1a94a20000000},
{0x00000000,0x00000000,0x50000000,0x09184e72}, -- {0x0, 0x12309ce54000000},
{0x00000000,0x00000000,0x24000000,0x0b5e620f}, -- {0x0, 0x16bcc41e9000000},
{0x00000000,0x00000000,0x0d000000,0x0e35fa93}, -- {0x0, 0x1c6bf5263400000},
{0x00000000,0x00000000,0x78200000,0x08e1bc9b}, -- {0x0, 0x11c37937e080000},
{0x00000000,0x00000000,0x76280000,0x0b1a2bc2}, -- {0x0, 0x16345785d8a0000},
{0x00000000,0x00000000,0x53b20000,0x0de0b6b3}, -- {0x0, 0x1bc16d674ec8000},
{0x00000000,0x00000000,0x244f4000,0x08ac7230}, -- {0x0, 0x1158e460913d000},
{0x00000000,0x00000000,0x2d631000,0x0ad78ebc}, -- {0x0, 0x15af1d78b58c400},
{0x00000000,0x00000000,0x38bbd400,0x0d8d726b}, -- {0x0, 0x1b1ae4d6e2ef500},
{0x00000000,0x00000000,0x13756480,0x08786783}, -- {0x0, 0x10f0cf064dd5920},
{0x00000000,0x00000000,0x7852bda0,0x0a968163}, -- {0x0, 0x152d02c7e14af68},
{0x00000000,0x00000000,0x76676d08,0x0d3c21bc}, -- {0x0, 0x1a784379d99db42},
{0x00000000,0x00000000,0x0a00a425,0x08459516}, -- {0x4000000000000000, 0x108b2a2c2802909},
{0x00000000,0x20000000,0x4c80cd2e,0x0a56fa5b}, -- {0x9000000000000000, 0x14adf4b7320334b},
{0x00000000,0x68000000,0x3fa10079,0x0cecb8f2}, -- {0x7400000000000000, 0x19d971e4fe8401e},
{0x00000000,0x11000000,0x47c4a04c,0x0813f397}, -- {0x880000000000000, 0x1027e72f1f12813},
{0x00000000,0x15400000,0x39b5c85f,0x0a18f07d}, -- {0xcaa0000000000000, 0x1431e0fae6d7217},
{0x00000000,0x7a900000,0x68233a76,0x0c9f2c9c}, -- {0xbd48000000000000, 0x193e5939a08ce9d},
{0x00000000,0x59340000,0x022c0914,0x0fc6f7c4}, -- {0x2c9a000000000000, 0x1f8def8808b0245},
{0x00000000,0x77c08000,0x415b85ac,0x09dc5ada}, -- {0x3be0400000000000, 0x13b8b5b5056e16b},
{0x00000000,0x15b0a000,0x11b26718,0x0c537191}, -- {0xad8500000000000, 0x18a6e32246c99c6},
{0x00000000,0x1b1cc800,0x361f00de,0x0f684df5}, -- {0x8d8e640000000000, 0x1ed09bead87c037},
{0x00000000,0x70f1fd00,0x31d3608a,0x09a130b9}, -- {0xb878fe8000000000, 0x13426172c74d822},
{0x00000000,0x4d2e7c40,0x5e4838ad,0x0c097ce7}, -- {0x66973e2000000000, 0x1812f9cf7920e2b},
{0x00000000,0x007a1b50,0x55da46d9,0x0f0bdc21}, -- {0x403d0da800000000, 0x1e17b84357691b6},
{0x00000000,0x504c5112,0x05a86c47,0x09676995}, -- {0xe826288900000000, 0x12ced32a16a1b11},
{0x40000000,0x445f6556,0x27128759,0x0bc143fa}, -- {0x622fb2ab40000000, 0x178287f49c4a1d6},
{0x10000000,0x75773eac,0x70d7292f,0x0eb194f8}, -- {0xfabb9f5610000000, 0x1d6329f1c35ca4b},
{0x4a000000,0x796a872b,0x468679bd,0x092efd1b}, -- {0x7cb54395ca000000, 0x125dfa371a19e6f},
{0x3c800000,0x37c528f6,0x3828182d,0x0b7abc62}, -- {0x5be2947b3c800000, 0x16f578c4e0a060b},
{0x0ba00000,0x65b67334,0x06321e38,0x0e596b7b}, -- {0x32db399a0ba00000, 0x1cb2d6f618c878e},
{0x47440000,0x3f920800,0x73df52e3,0x08f7e32c}, -- {0xdfc9040047440000, 0x11efc659cf7d4b8},
{0x59150000,0x2f768a00,0x10d7279c,0x0b35dbf8}, -- {0x17bb450059150000, 0x166bb7f0435c9e7},
{0x6f5a4000,0x3b542c80,0x150cf183,0x0e0352f6}, -- {0xddaa16406f5a4000, 0x1c06a5ec5433c60},
{0x45986800,0x15149bd0,0x6d2816f2,0x08c213d9}, -- {0x8a8a4de845986800, 0x118427b3b4a05bc},
{0x56fe8200,0x5a59c2c4,0x28721cae,0x0af298d0}, -- {0xad2ce16256fe8200, 0x15e531a0a1c872b},
{0x6cbe2280,0x30f03375,0x328ea3da,0x0daf3f04}, -- {0x987819baecbe2280, 0x1b5e7e08ca3a8f6},
{0x53f6d590,0x3e962029,0x5f992668,0x088d8762}, -- {0x1f4b1014d3f6d590, 0x111b0ec57e6499a},
{0x08f48af4,0x4e3ba834,0x377f7002,0x0ab0e93b}, -- {0xa71dd41a08f48af4, 0x1561d276ddfdc00},
{0x0b31adb1,0x21ca9241,0x255f4c03,0x0d5d238a}, -- {0xd0e549208b31adb1, 0x1aba4714957d300},
{0x56ff0c8e,0x051e9b68,0x375b8f82,0x085a3636}, -- {0x828f4db456ff0c8e, 0x10b46c6cdd6e3e0},
{0x6cbecfb2,0x46664242,0x05327362,0x0a70c3c4}, -- {0xa33321216cbecfb2, 0x14e1878814c9cd8},
{0x47ee839e,0x17ffd2d3,0x067f103b,0x0d0cf4b5}, -- {0xcbffe969c7ee839e, 0x1a19e96a19fc40e},
{0x1cf51243,0x7effe3c4,0x140f6a24,0x082818f1}, -- {0x3f7ff1e21cf51243, 0x105031e2503da89},
{0x243256d4,0x1ebfdcb5,0x391344ae,0x0a321f2d}, -- {0x8f5fee5aa43256d4, 0x14643e5ae44d12b},
{0x4d3eec89,0x666fd3e2,0x675815d9,0x0cbea6f8}, -- {0x7337e9f14d3eec89, 0x197d4df19d60576},
{0x208ea7ab,0x200bc8db,0x012e1b50,0x0fee50b7}, -- {0x1005e46da08ea7ab, 0x1fdca16e04b86d4},
{0x045928cb,0x14075d89,0x30bcd112,0x09f4f272}, -- {0x8a03aec4845928cb, 0x13e9e4e4c2f3444},
{0x256f72fd,0x590934eb,0x7cec0556,0x0c722f0e}, -- {0xac849a75a56f72fd, 0x18e45e1df3b0155},
{0x0ecb4fbd,0x2f4b8226,0x5c2706ac,0x0f8ebad2}, -- {0x17a5c1130ecb4fbd, 0x1f1d75a5709c1ab},
{0x693f11d6,0x5d8f3157,0x5998642b,0x09b934c3}, -- {0xeec798abe93f11d6, 0x13726987666190a},
{0x638ed64b,0x54f2fdad,0x4ffe7d36,0x0c2781f4}, -- {0xaa797ed6e38ed64b, 0x184f03e93ff9f4d},
{0x1c728bde,0x2a2fbd19,0x63fe1c84,0x0f316271}, -- {0x1517de8c9c728bde, 0x1e62c4e38ff8721},
{0x61c7976b,0x5a5dd62f,0x0e7ed1d2,0x097edd87}, -- {0xad2eeb17e1c7976b, 0x12fdbb0e39fb474},
{0x5a397d46,0x30f54bbb,0x721e8647,0x0bde94e8}, -- {0xd87aa5ddda397d46, 0x17bd29d1c87a191},
{0x50c7dc97,0x1d329eaa,0x0ea627d9,0x0ed63a23}, -- {0x4e994f5550c7dc97, 0x1dac74463a989f6},
{0x527ce9de,0x623fa32a,0x7927d8e7,0x0945e455}, -- {0xf11fd195527ce9de, 0x128bc8abe49f639},
{0x271c2456,0x5acf8bf5,0x3771cf21,0x0b975d6b}, -- {0x6d67c5faa71c2456, 0x172ebad6ddc73c8},
{0x50e32d6c,0x11836ef2,0x254e42ea,0x0e7d34c6}, -- {0x88c1b77950e32d6c, 0x1cfa698c95390ba},
{0x528dfc63,0x2af22557,0x7750e9d2,0x090e40fb}, -- {0x957912abd28dfc63, 0x121c81f7dd43a74},
{0x47317b7c,0x75aeaead,0x75252446,0x0b51d13a}, -- {0xbad75756c7317b7c, 0x16a3a275d494911},
{0x78fdda5b,0x531a5a58,0x526e6d58,0x0e264589}, -- {0x298d2d2c78fdda5b, 0x1c4c8b1349b9b56},
{0x4b9ea879,0x33f07877,0x03850457,0x08d7eb76}, -- {0xd9f83c3bcb9ea879, 0x11afd6ec0e14115},
{0x3e865297,0x20ec9695,0x4466456d,0x0b0de653}, -- {0x50764b4abe865297, 0x161bcca7119915b},
{0x6e27e73d,0x4927bc3a,0x357fd6c8,0x0dd15fe8}, -- {0x2493de1d6e27e73d, 0x1ba2bfd0d5ff5b2},
{0x64d8f086,0x2db8d5a4,0x216fe63d,0x08a2dbf1}, -- {0x56dc6ad264d8f086, 0x1145b7e285bf98f},
{0x7e0f2ca8,0x59270b0d,0x49cbdfcc,0x0acb92ed}, -- {0x2c938586fe0f2ca8, 0x159725db272f7f3},
{0x3d92f7d2,0x6f70cdd1,0x7c3ed7bf,0x0d7e77a8}, -- {0xf7b866e8bd92f7d2, 0x1afcef51f0fb5ef},
{0x767bdae3,0x75a680a2,0x4da746d7,0x086f0ac9}, -- {0xfad34051767bdae3, 0x10de1593369d1b5},
{0x541ad19c,0x731020cb,0x0111188d,0x0a8acd7c}, -- {0x79881065d41ad19c, 0x15159af80444623},
{0x49218603,0x2fd428fe,0x01555eb1,0x0d2d80db}, -- {0x57ea147f49218603, 0x1a5b01b605557ac},
{0x0db4f3c1,0x6de4999f,0x70d55b2e,0x083c7088}, -- {0xb6f24ccf8db4f3c1, 0x1078e111c3556cb},
{0x712230b2,0x495dc006,0x0d0ab1fa,0x0a4b8cab}, -- {0xa4aee003712230b2, 0x14971956342ac7e},
{0x4d6abcdf,0x1bb53008,0x704d5e79,0x0cde6fd5}, -- {0x4dda98044d6abcdf, 0x19bcdfabc13579e},
{0x3062b60b,0x61513e05,0x56305b0b,0x080b05e5}, -- {0xf0a89f02b062b60b, 0x10160bcb58c16c2},
{0x5c7b638e,0x59a58d86,0x0bbc71ce,0x0a0dc75f}, -- {0xacd2c6c35c7b638e, 0x141b8ebe2ef1c73},
{0x339a3c71,0x300ef0e8,0x6eab8e42,0x0c913936}, -- {0x98077874339a3c71, 0x1922726dbaae390},
{0x4080cb8e,0x7c12ad22,0x4a5671d2,0x0fb58784}, -- {0xbe0956914080cb8e, 0x1f6b0f092959c74},
{0x48507f38,0x6d8bac35,0x6e760723,0x09d174b2}, -- {0xf6c5d61ac8507f38, 0x13a2e965b9d81c8},
{0x7a649f07,0x68ee9742,0x4a1388ec,0x0c45d1df}, -- {0x34774ba17a649f07, 0x188ba3bf284e23b},
{0x58fdc6c8,0x032a3d13,0x3c986b28,0x0f574657}, -- {0x1951e89d8fdc6c8, 0x1eae8caef261aca},
{0x279e9c3d,0x01fa662c,0x55df42f9,0x09968bf6}, -- {0x40fd3316279e9c3d, 0x132d17ed577d0be},
{0x3186434c,0x2278ffb7,0x2b5713b7,0x0bfc2ef4}, -- {0xd13c7fdbb186434c, 0x17f85de8ad5c4ed},
{0x1de7d420,0x0b173fa5,0x362cd8a5,0x0efb3ab1}, -- {0x458b9fd29de7d420, 0x1df67562d8b3629},
{0x22b0e494,0x16ee87c7,0x71dc0767,0x095d04ae}, -- {0xcb7743e3a2b0e494, 0x12ba095dc7701d9},
{0x0b5d1db9,0x7caa29b9,0x4e530940,0x0bb445da}, -- {0x3e5514dc8b5d1db9, 0x17688bb5394c250},
{0x2e346527,0x1bd4b427,0x21e7cb91,0x0ea15751}, -- {0x4dea5a13ae346527, 0x1d42aea2879f2e4},
{0x4ce0bf38,0x6164f098,0x6530df3a,0x0924d692}, -- {0xb0b2784c4ce0bf38, 0x1249ad2594c37ce},
{0x6018ef06,0x39be2cbe,0x3e7d1709,0x0b6e0c37}, -- {0x5cdf165f6018ef06, 0x16dc186ef9f45c2},
{0x381f2ac8,0x682db7ee,0x2e1c5ccb,0x0e498f45}, -- {0xf416dbf7381f2ac8, 0x1c931e8ab871732},
{0x03137abd,0x311c92f5,0x2cd1b9ff,0x08edf98b}, -- {0xd88e497a83137abd, 0x11dbf316b346e7f},
{0x23d8596c,0x1d63b7b2,0x1806287f,0x0b2977ee}, -- {0xceb1dbd923d8596c, 0x1652efdc6018a1f},
{0x6cce6fc7,0x04bca59e,0x5e07b29f,0x0df3d5e9}, -- {0xc25e52cf6cce6fc7, 0x1be7abd3781eca7},
{0x240105dc,0x32f5e783,0x0ac4cfa3,0x08b865b2}, -- {0xd97af3c1a40105dc, 0x1170cb642b133e8},
{0x0d014754,0x1fb36164,0x4d76038c,0x0ae67f1e}, -- {0xfd9b0b20d014754, 0x15ccfe3d35d80e3},
{0x10419929,0x27a039bd,0x20d3846f,0x0da01ee6}, -- {0xd3d01cde90419929, 0x1b403dcc834e11b},
{0x1a28ffb9,0x48c42416,0x748432c5,0x0884134f}, -- {0x6462120b1a28ffb9, 0x1108269fd210cb1},
{0x60b33fa8,0x7af52d1b,0x71a53f76,0x0aa51823}, -- {0xbd7a968de0b33fa8, 0x154a3047c694fdd},
{0x58e00f92,0x59b27862,0x6e0e8f54,0x0d4e5e2c}, -- {0x2cd93c3158e00f92, 0x1a9cbc59b83a3d5},
{0x578c09bb,0x780f8b3d,0x04c91994,0x0850fadc}, -- {0x3c07c59ed78c09bb, 0x10a1f5b81324665},
{0x0d6f0c2a,0x16136e0d,0x05fb5ffa,0x0a653993}, -- {0x8b09b7068d6f0c2a, 0x14ca732617ed7fe},
{0x30cacf34,0x5b984990,0x677a37f8,0x0cfe87f7}, -- {0x2dcc24c830cacf34, 0x19fd0fef9de8dfe},
{0x1e7ec180,0x393f2dfa,0x70ac62fb,0x081f14fa}, -- {0xdc9f96fd1e7ec180, 0x103e29f5c2b18be},
{0x661e71e1,0x278ef978,0x4cd77bba,0x0a26da39}, -- {0x93c77cbc661e71e1, 0x144db473335deee},
{0x7fa60e59,0x7172b7d6,0x000d5aa8,0x0cb090c8}, -- {0x38b95beb7fa60e59, 0x1961219000356aa},
{0x5f8f91ef,0x0dcf65cc,0x0010b153,0x0fdcb4fa}, -- {0xc6e7b2e65f8f91ef, 0x1fb969f40042c54},
{0x7bb9bb35,0x78a19f9f,0x200a6ed3,0x09e9f11c}, -- {0xfc50cfcffbb9bb35, 0x13d3e2388029bb4},
{0x7aa82a03,0x76ca0787,0x280d0a88,0x0c646d63}, -- {0x3b6503c3faa82a03, 0x18c8dac6a0342a2},
{0x79523484,0x147c8969,0x12104d2b,0x0f7d88bc}, -- {0xca3e44b4f9523484, 0x1efb1178484134a},
{0x1bd360d2,0x7ccdd5e2,0x4b4a303a,0x09ae7575}, -- {0xbe66eaf11bd360d2, 0x135ceaeb2d28c0e},
{0x62c83907,0x5c014b5a,0x7e1cbc49,0x0c1a12d2}, -- {0x6e00a5ad62c83907, 0x183425a5f872f12},
{0x3b7a4749,0x13019e31,0x5da3eb5c,0x0f209787}, -- {0x980cf18bb7a4749, 0x1e412f0f768fad7},
{0x752c6c8d,0x4be102de,0x6a867319,0x09745eb4}, -- {0x65f0816f752c6c8d, 0x12e8bd69aa19cc6},
{0x527787b1,0x7ed94396,0x05280fdf,0x0bd17662}, -- {0xff6ca1cb527787b1, 0x17a2ecc414a03f7},
{0x2715699d,0x7e8f947c,0x467213d7,0x0ec5d3fa}, -- {0xff47ca3e2715699d, 0x1d8ba7f519c84f5},
{0x586d6202,0x7f19bccd,0x4c074c66,0x093ba47c}, -- {0xbf8cde66d86d6202, 0x127748f9301d319},
{0x0e88ba83,0x5ee02c01,0x5f091f80,0x0b8a8d9b}, -- {0x2f7016008e88ba83, 0x17151b377c247e0},
{0x322ae923,0x76983701,0x56cb6760,0x0e6d3102}, -- {0x3b4c1b80b22ae923, 0x1cda62055b2d9d8},
{0x6f5ad1b6,0x4a1f2260,0x563f209c,0x09043ea1}, -- {0x250f91306f5ad1b6, 0x12087d4358fc827},
{0x0b318623,0x5ca6eaf9,0x0bcee8c3,0x0b454e4a}, -- {0xee53757c8b318623, 0x168a9c942f3ba30},
{0x2dfde7ac,0x53d0a5b7,0x4ec2a2f4,0x0e16a1dc}, -- {0x29e852dbadfde7ac, 0x1c2d43b93b0a8bd},
{0x4cbeb0cc,0x74626792,0x7139a5d8,0x08ce2529}, -- {0x3a3133c94cbeb0cc, 0x119c4a53c4e6976},
{0x1fee5cff,0x117b0177,0x2d880f4f,0x0b01ae74}, -- {0xc8bd80bb9fee5cff, 0x16035ce8b6203d3},
{0x07e9f43e,0x75d9c1d5,0x38ea1322,0x0dc21a11}, -- {0xbaece0ea87e9f43e, 0x1b843422e3a84c8},
{0x14f238a7,0x69a81925,0x73924bf5,0x0899504a}, -- {0x74d40c9294f238a7, 0x1132a095ce492fd},
{0x3a2ec6d1,0x24121f6e,0x5076def3,0x0abfa45d}, -- {0xd2090fb73a2ec6d1, 0x157f48bb41db7bc},
{0x08ba7885,0x0d16a74a,0x049496b0,0x0d6f8d75}, -- {0x68b53a508ba7885, 0x1adf1aea12525ac},
{0x25748b53,0x082e288e,0x12dcde2e,0x0865b869}, -- {0x8417144725748b53, 0x10cb70d24b7378b},
{0x6ed1ae28,0x4a39b2b1,0x379415b9,0x0a7f2683}, -- {0x651cd958eed1ae28, 0x14fe4d06de5056e},
{0x2a8619b2,0x7cc81f5e,0x25791b27,0x0d1ef024}, -- {0xfe640faf2a8619b2, 0x1a3de04895e46c9},
{0x7a93d00f,0x7dfd139a,0x576bb0f8,0x08335616}, -- {0x3efe89cd7a93d00f, 0x1066ac2d5daec3e},
{0x5938c413,0x1d7c5881,0x2d469d37,0x0a402b9c}, -- {0xcebe2c40d938c413, 0x14805738b51a74d},
{0x0f86f518,0x04db6ea2,0x38984485,0x0cd03683}, -- {0x426db7510f86f518, 0x19a06d06e261121},
{0x29b4592f,0x13092525,0x135f2ad3,0x08022212}, -- {0xc9849292a9b4592f, 0x100444244d7cab4},
{0x54216f7a,0x77cb6e6e,0x5836f587,0x0a02aa96}, -- {0xfbe5b73754216f7a, 0x1405552d60dbd61},
{0x2929cb59,0x75be4a0a,0x2e44b2e9,0x0c83553c}, -- {0x7adf25052929cb59, 0x1906aa78b912cba},
{0x73743e2f,0x332ddc8c,0x39d5dfa4,0x0fa42a8b}, -- {0x1996ee4673743e2f, 0x1f485516e7577e9},
{0x0828a6dd,0x5ffca9d8,0x1425abc6,0x09c69a97}, -- {0xaffe54ec0828a6dd, 0x138d352e5096af1},
{0x0a32d095,0x37fbd44e,0x792f16b8,0x0c38413c}, -- {0x1bfdea270a32d095, 0x18708279e4bc5ae},
{0x4cbf84ba,0x45fac961,0x177adc66,0x0f46518c}, -- {0xa2fd64b0ccbf84ba, 0x1e8ca3185deb719},
{0x7ff7b2f4,0x0bbcbddc,0x4eacc9c0,0x098bf2f7}, -- {0x5de5eee7ff7b2f4, 0x1317e5ef3ab3270},
{0x1ff59fb1,0x0eabed54,0x4257fc30,0x0beeefb5}, -- {0x755f6aa1ff59fb1, 0x17dddf6b095ff0c},
{0x27f3079e,0x1256e8a9,0x72edfb3c,0x0eeaaba2}, -- {0x92b7454a7f3079e, 0x1dd55745cbb7ecf},
{0x68f7e4c3,0x4b765169,0x67d4bd05,0x0952ab45}, -- {0x65bb28b4e8f7e4c3, 0x12a5568b9f52f41},
{0x2335ddf3,0x7e53e5c4,0x21c9ec46,0x0ba75617}, -- {0xbf29f2e22335ddf3, 0x174eac2e8727b11},
{0x2c035570,0x5de8df35,0x0a3c6758,0x0e912b9d}, -- {0x2ef46f9aac035570, 0x1d22573a28f19d6},
{0x2b821566,0x3ab18b81,0x1665c097,0x091abb42}, -- {0xdd58c5c0ab821566, 0x123576845997025},
{0x56629ac0,0x295dee61,0x5bff30bd,0x0b616a12}, -- {0x54aef730d6629ac0, 0x16c2d4256ffcc2f},
{0x0bfb4170,0x53b569fa,0x32fefcec,0x0e39c497}, -- {0x29dab4fd0bfb4170, 0x1c73892ecbfbf3b},
{0x277d08e6,0x7451623c,0x4fdf5e13,0x08e41ade}, -- {0xfa28b11e277d08e6, 0x11c835bd3f7d784},
{0x315c4b1f,0x7165bacb,0x23d73598,0x0b1d2196}, -- {0x38b2dd65b15c4b1f, 0x163a432c8f5cd66},
{0x1db35de7,0x0dbf297e,0x6ccd02ff,0x0de469fb}, -- {0xc6df94bf1db35de7, 0x1bc8d3f7b3340bf},
{0x72901ab0,0x389779ee,0x340021df,0x08aec23d}, -- {0xdc4bbcf772901ab0, 0x115d847ad000877},
{0x4f34215c,0x26bd586a,0x61002a57,0x0ada72cc}, -- {0xd35eac354f34215c, 0x15b4e5998400a95},
{0x230129b4,0x106cae85,0x794034ed,0x0d910f7f}, -- {0x48365742a30129b4, 0x1b221effe500d3b},
{0x25e0ba10,0x1a43ed13,0x7bc82114,0x087aa9af}, -- {0xd21f689a5e0ba10, 0x10f5535fef20845},
{0x0f58e894,0x20d4e858,0x7aba2959,0x0a99541b}, -- {0x506a742c0f58e894, 0x1532a837eae8a56},
{0x132f22b9,0x490a226e,0x7968b3af,0x0d3fa922}, -- {0xe4851137132f22b9, 0x1a7f5245e5a2ceb},
{0x6bfd75b4,0x5da65584,0x6be1704d,0x0847c9b5}, -- {0x6ed32ac26bfd75b4, 0x108f936baf85c13},
{0x06fcd321,0x150feae6,0x26d9cc61,0x0a59bc23}, -- {0x4a87f57306fcd321, 0x14b378469b67318},
{0x48bc07e9,0x3a53e59f,0x10903f79,0x0cf02b2c}, -- {0x5d29f2cfc8bc07e9, 0x19e056584240fde},
{0x5d7584f1,0x74746f83,0x4a5a27ab,0x08161afb}, -- {0xfa3a37c1dd7584f1, 0x102c35f729689ea},
{0x54d2e62e,0x71918b64,0x3cf0b196,0x0a1ba1ba}, -- {0xb8c8c5b254d2e62e, 0x14374374f3c2c65},
{0x6a079fb9,0x4df5ee3d,0x0c2cddfc,0x0ca28a29}, -- {0x26faf71eea079fb9, 0x1945145230b377f},
{0x248987a8,0x617369cd,0x2f38157b,0x0fcb2cb3}, -- {0xf0b9b4e6a48987a8, 0x1f965966bce055e},
{0x26d5f4c9,0x2ce82220,0x0d830d6d,0x09defbf0}, -- {0x5674111026d5f4c9, 0x13bdf7e0360c35b},
{0x308b71fb,0x58222aa8,0x10e3d0c8,0x0c56baec}, -- {0x2c111554308b71fb, 0x18ad75d8438f432},
{0x3cae4e7a,0x6e2ab552,0x151cc4fa,0x0f6c69a7}, -- {0xb7155aa93cae4e7a, 0x1ed8d34e547313e},
{0x45ecf10c,0x64dab153,0x3d31fb1c,0x09a3c208}, -- {0x326d58a9c5ecf10c, 0x13478410f4c7ec7},
{0x37682d4f,0x7e115da8,0x4c7e79e3,0x0c0cb28a}, -- {0xff08aed437682d4f, 0x1819651531f9e78},
{0x454238a3,0x7d95b512,0x1f9e185c,0x0f0fdf2d}, -- {0x3ecada89454238a3, 0x1e1fbe5a7e78617},
{0x4b496366,0x0e7d912b,0x23c2cf3a,0x0969eb7c}, -- {0x873ec895cb496366, 0x12d3d6f88f0b3ce},
{0x3e1bbc3f,0x521cf576,0x2cb38308,0x0bc4665b}, -- {0x290e7abb3e1bbc3f, 0x1788ccb6b2ce0c2},
{0x0da2ab4f,0x66a432d4,0x17e063ca,0x0eb57ff2}, -- {0xb352196a0da2ab4f, 0x1d6affe45f818f2},
{0x4885ab11,0x60269fc4,0x2eec3e5e,0x09316ff7}, -- {0xb0134fe24885ab11, 0x1262dfeebbb0f97},
{0x5aa715d6,0x383047b5,0x1aa74df6,0x0b7dcbf5}, -- {0x9c1823dadaa715d6, 0x16fb97ea6a9d37d},
{0x1150db4b,0x063c59a3,0x41512174,0x0e5d3ef2}, -- {0x31e2cd19150db4b, 0x1cba7de5054485d},
{0x7ad2890f,0x43e5b805,0x48d2b4e8,0x08fa4757}, -- {0x21f2dc02fad2890f, 0x11f48eaf234ad3a},
{0x39872b53,0x54df2607,0x3b076222,0x0b38d92d}, -- {0xaa6f9303b9872b53, 0x1671b25aec1d888},
{0x27e8f628,0x2a16ef89,0x69c93aab,0x0e070f78}, -- {0xd50b77c4a7e8f628, 0x1c0e1ef1a724eaa},
{0x68f199d9,0x0a4e55b5,0x421dc4ab,0x08c469ab}, -- {0xc5272adae8f199d9, 0x1188d357087712a},
{0x232e004f,0x6ce1eb23,0x32a535d5,0x0af58416}, -- {0x7670f591a32e004f, 0x15eb082cca94d75},
{0x0bf98063,0x281a65ec,0x7f4e834b,0x0db2e51b}, -- {0xd40d32f60bf98063, 0x1b65ca37fd3a0d2},
{0x477bf03e,0x09107fb3,0x3f91120f,0x088fcf31}, -- {0xc4883fd9c77bf03e, 0x111f9e62fe44483},
{0x395aec4d,0x6b549fa0,0x6f755692,0x0ab3c2fd}, -- {0xb5aa4fd0395aec4d, 0x156785fbbdd55a4},
{0x47b1a760,0x4629c788,0x2b52ac37,0x0d60b3bd}, -- {0xe314e3c447b1a760, 0x1ac1677aad4ab0d},
{0x2ccf089c,0x5bda1cb5,0x2b13aba2,0x085c7056}, -- {0xaded0e5aaccf089c, 0x10b8e0acac4eae8},
{0x5802cac3,0x32d0a3e2,0x75d8968b,0x0a738c6b}, -- {0xd96851f15802cac3, 0x14e718d7d7625a2},
{0x2e037d74,0x1f84ccdb,0x734ebc2e,0x0d106f86}, -- {0x8fc2666dae037d74, 0x1a20df0dcd3af0b},
{0x0cc22e68,0x73b30009,0x2811359c,0x082a45b4}, -- {0x39d980048cc22e68, 0x10548b68a044d67},
{0x2ff2ba03,0x109fc00b,0x32158304,0x0a34d721}, -- {0x84fe005aff2ba03, 0x1469ae42c8560c1},
{0x1bef6883,0x14c7b00e,0x5e9ae3c5,0x0cc20ce9}, -- {0x4a63d8071bef6883, 0x198419d37a6b8f1},
{0x62eb42a4,0x39f99c11,0x16419cb6,0x0ff29024}, -- {0x9cfcce08e2eb42a4, 0x1fe52048590672d},
{0x0dd309a7,0x043c018b,0x4de901f2,0x09f79a16}, -- {0x821e00c58dd309a7, 0x13ef342d37a407c},
{0x7147cc10,0x454b01ed,0x2163426e,0x0c75809c}, -- {0xa2a580f6f147cc10, 0x18eb0138858d09b},
{0x2d99bf15,0x169dc269,0x29bc130a,0x0f92e0c3}, -- {0x8b4ee134ad99bf15, 0x1f25c186a6f04c2},
{0x6c80176d,0x2e229981,0x0a158be6,0x09bbcc7a}, -- {0x97114cc0ec80176d, 0x137798f428562f9},
{0x27a01d48,0x79ab3fe2,0x4c9aeedf,0x0c2abf98}, -- {0xfcd59ff127a01d48, 0x18557f31326bbb7},
{0x7188249a,0x78160fda,0x5fc1aa97,0x0f356f7e}, -- {0xfc0b07ed7188249a, 0x1e6adefd7f06aa5},
{0x66f516e0,0x7b0dc9e8,0x1bd90a9e,0x098165af}, -- {0xbd86e4f466f516e0, 0x1302cb5e6f642a7},
{0x00b25c98,0x59d13c63,0x02cf4d46,0x0be1bf1b}, -- {0xace89e3180b25c98, 0x17c37e360b3d351},
{0x60def3be,0x30458b7b,0x63832098,0x0eda2ee1}, -- {0x1822c5bde0def3be, 0x1db45dc38e0c826},
{0x2c8b5857,0x1e2b772d,0x0e31f45f,0x09485d4d}, -- {0xcf15bb96ac8b5857, 0x1290ba9a38c7d17},
{0x57ae2e6d,0x05b654f8,0x31be7177,0x0b9a74a0}, -- {0xc2db2a7c57ae2e6d, 0x1734e940c6f9c5d},
{0x6d99ba08,0x6723ea36,0x3e2e0dd4,0x0e8111c8}, -- {0x3391f51b6d99ba08, 0x1d022390f8b8375},
{0x24801445,0x00767262,0x26dcc8a5,0x0910ab1d}, -- {0x403b393124801445, 0x1221563a9b73229},
{0x6da01956,0x20940efa,0x5093face,0x0b54d5e4}, -- {0x904a077d6da01956, 0x16a9abc9424feb3},
{0x49081fac,0x68b912b9,0x64b8f981,0x0e2a0b5d}, -- {0x745c895cc9081fac, 0x1c5416bb92e3e60},
{0x7da513cb,0x1173abb3,0x4ef39bf1,0x08da471a}, -- {0x48b9d5d9fda513cb, 0x11b48e353bce6fc},
{0x7d0e58be,0x35d096a0,0x22b082ed,0x0b10d8e1}, -- {0x5ae84b507d0e58be, 0x1621b1c28ac20bb},
{0x1c51eeee,0x6344bc49,0x4b5ca3a8,0x0dd50f19}, -- {0x31a25e249c51eeee, 0x1baa1e332d728ea},
{0x61b33554,0x3e0af5ad,0x7f19e649,0x08a5296f}, -- {0x5f057ad6e1b33554, 0x114a52dffc67992},
{0x1a2002aa,0x6d8db319,0x7ee05fdb,0x0ace73cb}, -- {0xf6c6d98c9a2002aa, 0x159ce797fb817f6},
{0x40a80354,0x68f11fdf,0x7e9877d2,0x0d8210be}, -- {0xb4788fefc0a80354, 0x1b04217dfa61df4},
{0x58690214,0x6196b3eb,0x2f1f4ae3,0x08714a77}, -- {0xf0cb59f5d8690214, 0x10e294eebc7d2b8},
{0x4e83429a,0x59fc60e6,0x1ae71d9c,0x0a8d9d15}, -- {0x2cfe30734e83429a, 0x151b3a2a6b9c767},
{0x22241340,0x707b7920,0x41a0e503,0x0d31045a}, -- {0xf83dbc9022241340, 0x1a6208b50683940},
{0x15568c08,0x364d2bb4,0x49048f22,0x083ea2b8}, -- {0x9b2695da15568c08, 0x107d457124123c8},
{0x1aac2f0a,0x03e076a1,0x5b45b2eb,0x0a4e4b66}, -- {0xc1f03b509aac2f0a, 0x149c96cd6d16cba},
{0x41573acd,0x64d89449,0x32171fa5,0x0ce1de40}, -- {0x726c4a24c1573acd, 0x19c3bc80c85c7e9},
{0x78d684c0,0x4f075cad,0x1f4e73c7,0x080d2ae8}, -- {0xe783ae56f8d684c0, 0x101a55d07d39cf1},
{0x370c25f0,0x42c933d9,0x272210b9,0x0a1075a2}, -- {0x616499ecb70c25f0, 0x1420eb449c8842e},
{0x64cf2f6c,0x737b80cf,0x70ea94e7,0x0c94930a}, -- {0xf9bdc067e4cf2f6c, 0x19292615c3aa539},
{0x5e02fb47,0x705a6103,0x4d253a21,0x0fb9b7cd}, -- {0x782d3081de02fb47, 0x1f736f9b3494e88},
{0x2ac1dd0c,0x16387ca2,0x40374455,0x09d412e0}, -- {0x4b1c3e512ac1dd0c, 0x13a825c100dd115},
{0x7572544f,0x3bc69bca,0x5045156a,0x0c491798}, -- {0x9de34de57572544f, 0x18922f31411455a},
{0x52cee963,0x0ab842bd,0x64565ac5,0x0f5b5d7e}, -- {0x455c215ed2cee963, 0x1eb6bafd91596b1},
{0x43c151de,0x16b329b6,0x1eb5f8bb,0x09991a6f}, -- {0xcb5994db43c151de, 0x133234de7ad7e2e},
{0x14b1a655,0x7c5ff424,0x066376e9,0x0bff610b}, -- {0x7e2ffa1214b1a655, 0x17fec216198ddba},
{0x19de0feb,0x3b77f12d,0x67fc54a4,0x0eff394d}, -- {0x1dbbf89699de0feb, 0x1dfe729b9ff1529},
{0x202ac9f3,0x652af6bc,0x50fdb4e6,0x095f83d0}, -- {0xb2957b5e202ac9f3, 0x12bf07a143f6d39},
{0x28357c6f,0x3e75b46b,0x653d2220,0x0bb764c4}, -- {0x1f3ada35a8357c6f, 0x176ec98994f4888},
{0x1242db8b,0x4e132186,0x7e8c6aa8,0x0ea53df5}, -- {0x270990c31242db8b, 0x1d4a7bebfa31aaa},
{0x6b69c937,0x30cbf4f3,0x5f17c2a9,0x092746b9}, -- {0x5865fa79eb69c937, 0x124e8d737c5f0aa},
{0x66443b85,0x5cfef230,0x16ddb353,0x0b711868}, -- {0xee7f791866443b85, 0x16e230d05b76cd4},
{0x7fd54a66,0x543eaebc,0x1c952028,0x0e4d5e82}, -- {0x2a1f575e7fd54a66, 0x1c9abd04725480a},
{0x0fe54e80,0x34a72d36,0x31dd3419,0x08f05b11}, -- {0x5a53969b0fe54e80, 0x11e0b622c774d06},
{0x53dea220,0x61d0f883,0x5e54811f,0x0b2c71d5}, -- {0xf0e87c41d3dea220, 0x1658e3ab7952047},
{0x48d64aa8,0x5a4536a4,0x15e9a167,0x0df78e4b}, -- {0xed229b5248d64aa8, 0x1bef1c9657a6859},
{0x6d85eea9,0x686b4226,0x7db204e0,0x08bab8ee}, -- {0x3435a1136d85eea9, 0x117571ddf6c8138},
{0x48e76a53,0x028612b0,0x5d1e8619,0x0ae9672a}, -- {0x4143095848e76a53, 0x15d2ce55747a186},
{0x5b2144e8,0x2327975c,0x3466279f,0x0da3c0f5}, -- {0xd193cbae5b2144e8, 0x1b4781ead1989e7},
{0x78f4cb11,0x45f8be99,0x30bfd8c3,0x08865899}, -- {0xe2fc5f4cf8f4cb11, 0x110cb132c2ff630},
{0x3731fdd5,0x3776ee40,0x5cefcef4,0x0aa7eebf}, -- {0x1bbb77203731fdd5, 0x154fdd7f73bf3bd},
{0x44fe7d4a,0x4554a9d0,0x542bc2b1,0x0d51ea6f}, -- {0x62aa54e844fe7d4a, 0x1aa3d4df50af0ac},
{0x2b1f0e4e,0x7b54ea22,0x649b59ae,0x08533285}, -- {0xbdaa75112b1f0e4e, 0x10a6650b926d66b},
{0x75e6d1e2,0x5a2a24aa,0x1dc2301a,0x0a67ff27}, -- {0xad15125575e6d1e2, 0x14cffe4e7708c06},
{0x5360865b,0x30b4add5,0x0532bc21,0x0d01fef1}, -- {0x585a56ead360865b, 0x1a03fde214caf08},
{0x441c53f8,0x6e70eca5,0x533fb594,0x08213f56}, -- {0x37387652c41c53f8, 0x10427ead4cfed65},
{0x752368f7,0x0a0d27ce,0x280fa2fa,0x0a298f2c}, -- {0x850693e7752368f7, 0x14531e58a03e8be},
{0x526c4334,0x4c9071c2,0x32138bb8,0x0cb3f2f7}, -- {0x264838e1526c4334, 0x1967e5eec84e2ee},
{0x27075402,0x5fb48e33,0x1e986ea6,0x0fe0efb5}, -- {0xafda4719a7075402, 0x1fc1df6a7a61ba9},
{0x08649481,0x1bd0d8e0,0x231f4528,0x09ec95d1}, -- {0xde86c7008649481, 0x13d92ba28c7d14a},
{0x0a7db9a1,0x22c50f18,0x4be71672,0x0c67bb45}, -- {0x9162878c0a7db9a1, 0x18cf768b2f9c59c},
{0x0d1d280a,0x6b7652de,0x7ee0dc0e,0x0f81aa16}, -- {0xb5bb296f0d1d280a, 0x1f03542dfb83703},
{0x68323906,0x2329f3ca,0x2f4c8989,0x09b10a4e}, -- {0x5194f9e568323906, 0x1362149cbd32262},
{0x423ec747,0x4bf470bd,0x7b1fabeb,0x0c1d4ce1}, -- {0xe5fa385ec23ec747, 0x183a99c3ec7eafa},
{0x72ce7919,0x3ef18cec,0x39e796e6,0x0f24a01a}, -- {0x9f78c67672ce7919, 0x1e494034e79e5b9},
{0x07c10bb0,0x0756f814,0x4430be50,0x0976e410}, -- {0x3ab7c0a07c10bb0, 0x12edc82110c2f94},
{0x09b14e9c,0x092cb619,0x553cede4,0x0bd49d14}, -- {0x4965b0c89b14e9c, 0x17a93a2954f3b79},
{0x2c1da243,0x0b77e39f,0x6a8c295d,0x0ec9c459}, -- {0x45bbf1cfac1da243, 0x1d9388b3aa30a57},
{0x4b92856a,0x172aee43,0x129799da,0x093e1ab8}, -- {0x8b957721cb92856a, 0x127c35704a5e676},
{0x3e7726c4,0x5cf5a9d4,0x173d8050,0x0b8da166}, -- {0x2e7ad4ea3e7726c4, 0x171b42cc5cf6014},
{0x4e14f075,0x74331449,0x5d0ce064,0x0e7109bf}, -- {0x3a198a24ce14f075, 0x1ce2137f7433819},
{0x00cd1649,0x089fecae,0x6a280c3f,0x0906a617}, -- {0xc44ff65700cd1649, 0x120d4c2fa8a030f},
{0x41005bdb,0x6ac7e7d9,0x64b20f4e,0x0b484f9d}, -- {0xb563f3ecc1005bdb, 0x16909f3b92c83d3},
{0x714072d2,0x4579e1cf,0x1dde9322,0x0e1a6385}, -- {0xa2bcf0e7f14072d2, 0x1c34c70a777a4c8},
{0x76c847c3,0x4b6c2d21,0x22ab1bf5,0x08d07e33}, -- {0x65b61690f6c847c3, 0x11a0fc668aac6fd},
{0x347a59b4,0x7e47386a,0x0b55e2f2,0x0b049dc0}, -- {0xbf239c35347a59b4, 0x16093b802d578bc},
{0x0198f021,0x5dd90685,0x0e2b5baf,0x0dc5c530}, -- {0xeeec83428198f021, 0x1b8b8a6038ad6eb},
{0x10ff9615,0x6aa7a413,0x08db194d,0x089b9b3e}, -- {0x7553d20990ff9615, 0x1137367c236c653},
{0x753f7b9a,0x25518d17,0x4b11dfa1,0x0ac2820d}, -- {0x52a8c68bf53f7b9a, 0x1585041b2c477e8},
{0x728f5a81,0x4ea5f05d,0x7dd65789,0x0d732290}, -- {0x6752f82ef28f5a81, 0x1ae64521f7595e2},
{0x57999890,0x0127b63a,0x4ea5f6b6,0x0867f59a}, -- {0x8093db1d57999890, 0x10cfeb353a97dad},
{0x2d7ffeb4,0x4171a3c9,0x224f7463,0x0a81f301}, -- {0xe0b8d1e4ad7ffeb4, 0x1503e602893dd18},
{0x58dffe62,0x31ce0cbb,0x4ae3517c,0x0d226fc1}, -- {0x18e7065dd8dffe62, 0x1a44df832b8d45f},
{0x278bfefd,0x5f20c7f5,0x7ece12ed,0x083585d8}, -- {0x6f9063faa78bfefd, 0x106b0bb1fb384bb},
{0x516efebc,0x16e8f9f2,0x1e8197a9,0x0a42e74f}, -- {0x4b747cf9516efebc, 0x1485ce9e7a065ea},
{0x25cabe6b,0x3ca3386f,0x0621fd93,0x0cd3a123}, -- {0xde519c37a5cabe6b, 0x19a742461887f64},
{0x479eb703,0x15e60345,0x73d53e7c,0x080444b5}, -- {0xaf301a2c79eb703, 0x1008896bcf54f9f},
{0x798664c4,0x1b5f8416,0x30ca8e1b,0x0a0555e3}, -- {0xcdafc20b798664c4, 0x140aabc6c32a386},
{0x57e7fdf5,0x0237651c,0x1cfd31a2,0x0c86ab5c}, -- {0x811bb28e57e7fdf5, 0x190d56b873f4c68},
{0x6de1fd72,0x42c53e63,0x243c7e0a,0x0fa85633}, -- {0xa1629f31ede1fd72, 0x1f50ac6690f1f82},
{0x34ad3e67,0x49bb46fe,0x06a5cec6,0x09c935e0}, -- {0xa4dda37f34ad3e67, 0x13926bc01a973b1},
{0x01d88e01,0x1c2a18be,0x084f4278,0x0c3b8358}, -- {0xe150c5f01d88e01, 0x187706b0213d09e},
{0x424eb181,0x23349eed,0x0a631316,0x0f4a642e}, -- {0x919a4f76c24eb181, 0x1e94c85c298c4c5},
{0x39712ef1,0x7600e354,0x667debed,0x098e7e9c}, -- {0x7b0071aa39712ef1, 0x131cfd3999f7afb},
{0x47cd7aad,0x33811c29,0x001d66e9,0x0bf21e44}, -- {0x59c08e14c7cd7aad, 0x17e43c8800759ba},
{0x79c0d958,0x60616333,0x0024c0a3,0x0eeea5d5}, -- {0xf030b199f9c0d958, 0x1ddd4baa0093028},
{0x3c1887d7,0x2c3cde00,0x1016f866,0x095527a5}, -- {0x961e6f003c1887d7, 0x12aa4f4a405be19},
{0x4b1ea9cd,0x774c1580,0x341cb67f,0x0baa718e}, -- {0xfba60ac04b1ea9cd, 0x1754e31cd072d9f},
{0x5de65440,0x751f1ae0,0x0123e41f,0x0e950df2}, -- {0xfa8f8d705de65440, 0x1d2a1be4048f907},
{0x3aaff4a8,0x793370cc,0x20b66e93,0x091d28b7}, -- {0xfc99b8663aaff4a8, 0x123a516e82d9ba4},
{0x495bf1d2,0x77804cff,0x08e40a38,0x0b6472e5}, -- {0x3bc0267fc95bf1d2, 0x16c8e5ca239028e},
{0x3bb2ee47,0x1560603f,0x2b1d0cc7,0x0e3d8f9e}, -- {0xcab0301fbbb2ee47, 0x1c7b1f3cac74331},
{0x554fd4ec,0x3d5c3c27,0x7af227fc,0x08e679c2}, -- {0x1eae1e13d54fd4ec, 0x11ccf385ebc89ff},
{0x4aa3ca27,0x4cb34b31,0x59aeb1fb,0x0b201833}, -- {0xe659a598caa3ca27, 0x1640306766bac7e},
{0x7d4cbcb1,0x3fe01dfd,0x501a5e7a,0x0de81e40}, -- {0x9ff00efefd4cbcb1, 0x1bd03c81406979e},
{0x5e4ff5ef,0x47ec12be,0x32107b0c,0x08b112e8}, -- {0x23f6095f5e4ff5ef, 0x116225d0c841ec3},
{0x35e3f36a,0x59e7176e,0x3e9499cf,0x0add57a2}, -- {0xecf38bb735e3f36a, 0x15baaf44fa52673},
{0x035cf045,0x5060dd4a,0x0e39c043,0x0d94ad8b}, -- {0xe8306ea5035cf045, 0x1b295b1638e7010},
{0x221a162b,0x223c8a4e,0x78e4182a,0x087cec76}, -- {0x911e4527221a162b, 0x10f9d8ede39060a},
{0x6aa09bb6,0x6acbace1,0x571d1e34,0x0a9c2794}, -- {0x3565d670eaa09bb6, 0x15384f295c7478d},
{0x2548c2a3,0x057e981a,0x6ce465c2,0x0d433179}, -- {0x82bf4c0d2548c2a3, 0x1a8662f3b391970},
{0x374d79a6,0x236f1f10,0x140ebf99,0x0849feec}, -- {0x51b78f88374d79a6, 0x1093fdd8503afe6},
{0x4520d810,0x4c4ae6d4,0x19126f7f,0x0a5c7ea7}, -- {0xe625736a4520d810, 0x14b8fd4e6449bdf},
{0x56690e14,0x3f5da089,0x7f570b5f,0x0cf39e50}, -- {0xdfaed044d6690e14, 0x19e73ca1fd5c2d7},
{0x0601a8cc,0x579a8456,0x4f96671b,0x081842f2}, -- {0xebcd422b0601a8cc, 0x103085e53e599c6},
{0x478212ff,0x4d81256b,0x237c00e2,0x0a1e53af}, -- {0xa6c092b5c78212ff, 0x143ca75e8df0038},
{0x396297bf,0x20e16ec6,0x0c5b011b,0x0ca5e89b}, -- {0xd070b763396297bf, 0x194bd136316c046},
{0x07bb3daf,0x0919ca78,0x6f71c162,0x0fcf62c1}, -- {0x848ce53c07bb3daf, 0x1f9ec583bdc7058},
{0x04d5068d,0x25b01e8b,0x15a718dd,0x09e19db9}, -- {0x52d80f4584d5068d, 0x13c33b72569c637},
{0x660a4831,0x4f1c262d,0x3b10df14,0x0c5a0527}, -- {0x278e1316e60a4831, 0x18b40a4eec437c5}
}
assert(#M.DOUBLE_POW5_SPLIT == 325)
return M
--end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment