cryptol/examples/MiniLock/prim/Blake2s.cry
2016-01-19 18:19:35 -08:00

687 lines
34 KiB
Plaintext

/*
* Copyright (c) 2013-2016 Galois, Inc.
* Distributed under the terms of the BSD3 license (see LICENSE file)
*/
module Blake2s where
type Block = [16][32]
type State = [8][32]
type LocalState = [16][32]
type BCounter = [64]
type Context = { state : State, counter : BCounter }
// Block size
bbVal : [64]
bbVal = 64
IV : [8][32]
IV = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
]
SIGMA_TABLE : [10][16][4]
SIGMA_TABLE =
[ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]
, [ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 ]
, [ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 ]
, [ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 ]
, [ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 ]
, [ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 ]
, [ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 ]
, [ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 ]
, [ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 ]
, [ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 ]
]
// Section 2.1 constants
R1,R2,R3,R4 : [6]
R1 = 16
R2 = 12
R3 = 08
R4 = 07
// Section 3.1: Mixing function 'G'
G : [4] -> [4] -> LocalState -> [4][6] -> Block -> [16][32]
G r i vec abcd ms = foldl updateVector vec (zip abcd new)
where
new = G' r i (vec @@ abcd) ms
G' : [4] -> [4] -> [4][32] -> Block -> [4][32]
G' r i vals ms = [a2, b2, c2, d2]
where
x = ms @ (SIGMA_TABLE @ r @ (2*i))
y = ms @ (SIGMA_TABLE @ r @ (2*i+1))
[a,b,c,d] = vals
a1 = a + b + x
d1 = (d ^ a1) >>> R1
c1 = c + d1
b1 = (b ^ c1) >>> R2
a2 = a1 + b1 + y
d2 = (d1 ^ a2) >>> R3
c2 = c1 + d2
b2 = (b1 ^ c2) >>> R4
// Section 3.2: Compression function
F : State -> Block -> BCounter -> Bit -> State
F h ms t f = h ^ (take (vs!0)) ^ (drop (vs!0))
where
v = h # IV ^ (zero # [t0,t1,f0,zero])
[t1,t0] = split t : [2][32]
f0 = [f | _ <- [0..31] : [_][6]]
vs = [v] # [ round i ms v' | v' <- vs | i <- [0..9] ]
// Sub-function of F (first for loop)
round : [4] -> Block -> LocalState -> LocalState
round r ms v = vs ! 0
where
vs = [v] # [ G r i v' ix ms
| v' <- vs
| i <- [0..7]
| ix <- [ [0,4,8,12], [1,5,9,13]
, [2,6,10,14], [3,7,11,15]
, [0,5,10,15], [1,6,11,12]
, [2,7,8,13], [3,4,9,14] ]
]
// Section 3.3: Padding
// Recall kk == key bytes (0)
// nn == hash bytes (32)
// ll == input bytes (ceiling $ len / 8)
// bb == block bytes (64, 1024 bits)
// dd == nr Blocks
blake2s : {ll,nn} (fin ll, 32 >= nn, 64 >= width ll)
=> [ll][8] -> [nn*8]
blake2s m = blake2s' `{ll=ll,nn=nn} m
blake2s' : {ll,dd,nn}
(fin ll
, 32 >= nn
, dd == (max 1 ((ll+63)/64)) - 1
, 64 >= width ll
)
=> [ll][8]
-> [nn*8]
blake2s' m = take `{nn*8} (blake2sFinish ({ state = (hs!0).state, counter = `ll}) lastBlock)
where
fullBlocks : [dd]Block
fullBlocks = [mkBlock b | b <- split (join (take `{front=64*dd,back=ll-64*dd} m))]
partialBlock = drop `{front=64*dd,back=ll-64*dd} m
lastBlock : Block
lastBlock =
if (`ll == (zero:[64]))
then zero // Special case full zero block for empty messages
else mkBlock ((split (join (partialBlock # (zero : [inf][8]))))@0)
h : Context
h = { state = [IV@0 ^ `0x01010000 ^ `nn] # drop `{1} IV, counter = 0 }
hs : [dd+1]Context
hs = [h] # [blake2Update h' dX | h' <- hs | dX <- fullBlocks]
blake2Update : Context -> Block -> Context
blake2Update ctx d = { state = newState, counter = newCount }
where newState = F ctx.state d newCount False
newCount = ctx.counter + (64 : [64])
postprocess : {ll} (64 >= ll, 64 >= width ll) => BCounter -> [ll][8] -> Block
postprocess c m =
if c == 0 && `ll == (zero:[64])
then zero
else split (join m # zero)
// The final round of blake
blake2sFinish : Context -> Block -> [256]
blake2sFinish ctx b = join [ reverseBytes w | w <- F ctx.state b ctx.counter True ]
////////////////////////////////////////////////////////////////////////////////
// Utilities
////////////////////////////////////////////////////////////////////////////////
mkBlock x = reverse (split (reverseBytes x))
reverseBytes x = join (reverse (bytes x))
bytes x = split x : [_] [8]
// XXX can probably do a cleaner merge-sort style update.
updateVector : {a, b, c} (c >= width (a-1), a >= 1, fin a, fin c) => [a]b -> ([c], b) -> [a]b
updateVector orig idxNew = vs
where
idx = idxNew.0
new = idxNew.1
vs = [if i == idx then new else orig@i | i <- [0..a-1]]
property katsPass = ~zero ==
[ nthKat `{0}
, nthKat `{1}
, nthKat `{2}
, nthKat `{3}
, nthKat `{4}
, nthKat `{5}
, nthKat `{6}
, nthKat `{7}
, nthKat `{8}
, nthKat `{9}
, nthKat `{10}
, nthKat `{11}
, nthKat `{12}
, nthKat `{13}
, nthKat `{14}
, nthKat `{15}
, nthKat `{16}
, nthKat `{17}
, nthKat `{18}
, nthKat `{19}
, nthKat `{20}
, nthKat `{21}
, nthKat `{22}
, nthKat `{23}
, nthKat `{24}
, nthKat `{25}
, nthKat `{26}
, nthKat `{27}
, nthKat `{28}
, nthKat `{29}
, nthKat `{30}
, nthKat `{31}
, nthKat `{32}
, nthKat `{33}
, nthKat `{34}
, nthKat `{35}
, nthKat `{36}
, nthKat `{37}
, nthKat `{38}
, nthKat `{39}
, nthKat `{40}
, nthKat `{41}
, nthKat `{42}
, nthKat `{43}
, nthKat `{44}
, nthKat `{45}
, nthKat `{46}
, nthKat `{47}
, nthKat `{48}
, nthKat `{49}
, nthKat `{50}
, nthKat `{51}
, nthKat `{52}
, nthKat `{53}
, nthKat `{54}
, nthKat `{55}
, nthKat `{56}
, nthKat `{57}
, nthKat `{58}
, nthKat `{59}
, nthKat `{60}
, nthKat `{61}
, nthKat `{62}
, nthKat `{63}
, nthKat `{64}
, nthKat `{65}
, nthKat `{66}
, nthKat `{67}
, nthKat `{68}
, nthKat `{69}
, nthKat `{70}
, nthKat `{71}
, nthKat `{72}
, nthKat `{73}
, nthKat `{74}
, nthKat `{75}
, nthKat `{76}
, nthKat `{77}
, nthKat `{78}
, nthKat `{79}
, nthKat `{80}
, nthKat `{81}
, nthKat `{82}
, nthKat `{83}
, nthKat `{84}
, nthKat `{85}
, nthKat `{86}
, nthKat `{87}
, nthKat `{88}
, nthKat `{89}
, nthKat `{90}
, nthKat `{91}
, nthKat `{92}
, nthKat `{93}
, nthKat `{94}
, nthKat `{95}
, nthKat `{96}
, nthKat `{97}
, nthKat `{98}
, nthKat `{99}
, nthKat `{100}
, nthKat `{101}
, nthKat `{102}
, nthKat `{103}
, nthKat `{104}
, nthKat `{105}
, nthKat `{106}
, nthKat `{107}
, nthKat `{108}
, nthKat `{109}
, nthKat `{110}
, nthKat `{111}
, nthKat `{112}
, nthKat `{113}
, nthKat `{114}
, nthKat `{115}
, nthKat `{116}
, nthKat `{117}
, nthKat `{118}
, nthKat `{119}
, nthKat `{120}
, nthKat `{121}
, nthKat `{122}
, nthKat `{123}
, nthKat `{124}
, nthKat `{125}
, nthKat `{126}
, nthKat `{127}
, nthKat `{128}
, nthKat `{129}
, nthKat `{130}
, nthKat `{131}
, nthKat `{132}
, nthKat `{133}
, nthKat `{134}
, nthKat `{135}
, nthKat `{136}
, nthKat `{137}
, nthKat `{138}
, nthKat `{139}
, nthKat `{140}
, nthKat `{141}
, nthKat `{142}
, nthKat `{143}
, nthKat `{144}
, nthKat `{145}
, nthKat `{146}
, nthKat `{147}
, nthKat `{148}
, nthKat `{149}
, nthKat `{150}
, nthKat `{151}
, nthKat `{152}
, nthKat `{153}
, nthKat `{154}
, nthKat `{155}
, nthKat `{156}
, nthKat `{157}
, nthKat `{158}
, nthKat `{159}
, nthKat `{160}
, nthKat `{161}
, nthKat `{162}
, nthKat `{163}
, nthKat `{164}
, nthKat `{165}
, nthKat `{166}
, nthKat `{167}
, nthKat `{168}
, nthKat `{169}
, nthKat `{170}
, nthKat `{171}
, nthKat `{172}
, nthKat `{173}
, nthKat `{174}
, nthKat `{175}
, nthKat `{176}
, nthKat `{177}
, nthKat `{178}
, nthKat `{179}
, nthKat `{180}
, nthKat `{181}
, nthKat `{182}
, nthKat `{183}
, nthKat `{184}
, nthKat `{185}
, nthKat `{186}
, nthKat `{187}
, nthKat `{188}
, nthKat `{189}
, nthKat `{190}
, nthKat `{191}
, nthKat `{192}
, nthKat `{193}
, nthKat `{194}
, nthKat `{195}
, nthKat `{196}
, nthKat `{197}
, nthKat `{198}
, nthKat `{199}
, nthKat `{200}
, nthKat `{201}
, nthKat `{202}
, nthKat `{203}
, nthKat `{204}
, nthKat `{205}
, nthKat `{206}
, nthKat `{207}
, nthKat `{208}
, nthKat `{209}
, nthKat `{210}
, nthKat `{211}
, nthKat `{212}
, nthKat `{213}
, nthKat `{214}
, nthKat `{215}
, nthKat `{216}
, nthKat `{217}
, nthKat `{218}
, nthKat `{219}
, nthKat `{220}
, nthKat `{221}
, nthKat `{222}
, nthKat `{223}
, nthKat `{224}
, nthKat `{225}
, nthKat `{226}
, nthKat `{227}
, nthKat `{228}
, nthKat `{229}
, nthKat `{230}
, nthKat `{231}
, nthKat `{232}
, nthKat `{233}
, nthKat `{234}
, nthKat `{235}
, nthKat `{236}
, nthKat `{237}
, nthKat `{238}
, nthKat `{239}
, nthKat `{240}
, nthKat `{241}
, nthKat `{242}
, nthKat `{243}
, nthKat `{244}
, nthKat `{245}
, nthKat `{246}
, nthKat `{247}
, nthKat `{248}
, nthKat `{249}
, nthKat `{250}
, nthKat `{251}
, nthKat `{252}
, nthKat `{253}
, nthKat `{254}
, nthKat `{255}
]
nthKat : {n} (fin n, 8 >= width n) => Bit
nthKat = blake2s (nthKatInput `{n}) == kats @ (`n : [8])
nthKatInput : {n} (fin n) => [n][8]
nthKatInput = take ([0 ... ] : [inf][8])
kats = [ 0x69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9
, 0xe34d74dbaf4ff4c6abd871cc220451d2ea2648846c7757fbaac82fe51ad64bea
, 0xddad9ab15dac4549ba42f49d262496bef6c0bae1dd342a8808f8ea267c6e210c
, 0xe8f91c6ef232a041452ab0e149070cdd7dd1769e75b3a5921be37876c45c9900
, 0x0cc70e00348b86ba2944d0c32038b25c55584f90df2304f55fa332af5fb01e20
, 0xec1964191087a4fe9df1c795342a02ffc191a5b251764856ae5b8b5769f0c6cd
, 0xe1fa51618d7df4eb70cf0d5a9e906f806e9d19f7f4f01e3b621288e4120405d6
, 0x598001fafbe8f94ec66dc827d012cfcbba2228569f448e89ea2208c8bf769293
, 0xc7e887b546623635e93e0495598f1726821996c2377705b93a1f636f872bfa2d
, 0xc315a437dd28062a770d481967136b1b5eb88b21ee53d0329c5897126e9db02c
, 0xbb473deddc055fea6228f207da575347bb00404cd349d38c18026307a224cbff
, 0x687e1873a8277591bb33d9adf9a13912efefe557cafc39a7952623e47255f16d
, 0x1ac7ba754d6e2f94e0e86c46bfb262abbb74f450ef456d6b4d97aa80ce6da767
, 0x012c97809614816b5d9494477d4b687d15b96eb69c0e8074a8516f31224b5c98
, 0x91ffd26cfa4da5134c7ea262f7889c329f61f6a657225cc212f40056d986b3f4
, 0xd97c828d8182a72180a06a78268330673f7c4e0635947c04c02323fd45c0a52d
, 0xefc04cdc391c7e9119bd38668a534e65fe31036d6a62112e44ebeb11f9c57080
, 0x992cf5c053442a5fbc4faf583e04e50bb70d2f39fbb6a503f89e56a63e18578a
, 0x38640e9f21983e67b539caccae5ecf615ae2764f75a09c9c59b76483c1fbc735
, 0x213dd34c7efe4fb27a6b35f6b4000d1fe03281af3c723e5c9f94747a5f31cd3b
, 0xec246eeeb9ced3f7ad33ed28660dd9bb0732513db4e2fa278b60cde3682a4ccd
, 0xac9b61d446648c3005d7892bf3a8719f4c8181cfdcbc2b79fef10a279b911095
, 0x7bf8b22959e34e3a43f7079223e83a9754617d391e213dfd808e41b9bead4ce7
, 0x68d4b5d4fa0e302b64ccc5af792913ac4c88ec95c07ddf40694256eb88ce9f3d
, 0xb2c2420f05f9abe36315919336b37e4e0fa33ff7e76a492767006fdb5d935462
, 0x134f61bbd0bbb69aed5343904551a3e6c1aa7dcdd77e903e7023eb7c60320aa7
, 0x4693f9bff7d4f3986a7d176e6e06f72ad1490d805c99e25347b8de77b4db6d9b
, 0x853e26f741953b0fd5bdb424e8ab9e8b3750eaa8ef61e47902c91e554e9c73b9
, 0xf7de536361abaa0e158156cf0ea4f63a99b5e4054f8fa4c9d45f6285cad55694
, 0x4c230608860a99ae8d7bd5c2cc17fa52096b9a61bedb17cb7617864ad29ca7a6
, 0xaeb920ea87952dadb1fb759291e3388139a872865001886ed84752e93c250c2a
, 0xaba4ad9b480b9df3d08ca5e87b0c2440d4e4ea21224c2eb42cbae469d089b931
, 0x05825607d7fdf2d82ef4c3c8c2aea961ad98d60edff7d018983e21204c0d93d1
, 0xa742f8b6af82d8a6ca2357c5f1cf91defbd066267d75c048b352366585025962
, 0x2bcac89599000b42c95ae23835a713704ed79789c84fef149a874ff733f017a2
, 0xac1ed07d048f105a9e5b7ab85b09a492d5baff14b8bfb0e9fd789486eea2b974
, 0xe48d0ecfaf497d5b27c25d99e156cb0579d440d6e31fb62473696dbf95e010e4
, 0x12a91fadf8b21644fd0f934f3c4a8f62ba862ffd20e8e961154c15c13884ed3d
, 0x7cbee96e139897dc98fbef3be81ad4d964d235cb12141fb66727e6e5df73a878
, 0xebf66abb597ae572a7297cb0871e355accafad8377b8e78bf164ce2a18de4baf
, 0x71b933b07e4ff7818ce059d008829e453c6ff02ec0a7db393fc2d870f37a7286
, 0x7cf7c51331220b8d3ebaed9c29398a16d98156e2613cb088f2b0e08a1be4cf4f
, 0x3e41a108e0f64ad276b979e1ce068279e16f7bc7e4aa1d211e17b81161df1602
, 0x886502a82ab47ba8d86710aa9de3d46ea65c47af6ee8de450cceb8b11b045f50
, 0xc021bc5f0954fee94f46ea09487e10a84840d02f64810bc08d9e551f7d416814
, 0x2030516e8a5fe19ae79c336fce26382a749d3fd0ec91e537d4bd2358c12dfb22
, 0x556698dac8317fd36dfbdf25a79cb112d5425860605cbaf507f23bf7e9f42afe
, 0x2f867ba67773fdc3e92fced99a6409ad39d0b880fde8f109a81730c4451d0178
, 0x172ec218f119dfae98896dff29dd9876c94af87417f9ae4c7014bb4e4b96afc7
, 0x3f85814a18195f879aa962f95d26bd82a278f2b82320218f6b3bd6f7f667a6d9
, 0x1b618fbaa566b3d498c12e982c9ec52e4da85a8c54f38f34c090394f23c184c1
, 0x0c758fb5692ffd41a3575d0af00cc7fbf2cbe5905a58323a88ae4244f6e4c993
, 0xa931360cad628c7f12a6c1c4b753b0f4062aef3ce65a1ae3f19369dadf3ae23d
, 0xcbac7d773b1e3b3c6691d7abb7e9df045c8ba19268ded153207f5e804352ec5d
, 0x23a196d3802ed3c1b384019a82325840d32f71950c4580b03445e0898e14053c
, 0xf4495470f226c8c214be08fdfad4bc4a2a9dbea9136a210df0d4b64929e6fc14
, 0xe290dd270b467f34ab1c002d340fa016257ff19e5833fdbbf2cb401c3b2817de
, 0x9fc7b5ded3c15042b2a6582dc39be016d24a682d5e61ad1eff9c63309848f706
, 0x8cca67a36d17d5e6341cb592fd7bef9926c9e3aa1027ea11a7d8bd260b576e04
, 0x409392f560f86831da4373ee5e0074260595d7bc24183b60ed700d4583d3f6f0
, 0x2802165de090915546f3398cd849164a19f92adbc361adc99b0f20c8ea071054
, 0xad839168d9f8a4be95ba9ef9a692f07256ae43fe6f9864e290691b0256ce50a9
, 0x75fdaa5038c284b86d6e8affe8b2807e467b86600e79af3689fbc06328cbf894
, 0xe57cb79487dd57902432b250733813bd96a84efce59f650fac26e6696aefafc3
, 0x56f34e8b96557e90c1f24b52d0c89d51086acf1b00f634cf1dde9233b8eaaa3e
, 0x1b53ee94aaf34e4b159d48de352c7f0661d0a40edff95a0b1639b4090e974472
, 0x05705e2a81757c14bd383ea98dda544eb10e6bc07bae435e2518dbe133525375
, 0xd8b2866e8a309db53e529ec32911d82f5ca16cff76216891a9676aa31aaa6c42
, 0xf5041c241270eb04c71ec2c95d4c38d803b1237b0f29fd4db3eb397669e88699
, 0x9a4ce077c349322f595e0ee79ed0da5fab66752cbfef8f87d0e9d0723c7530dd
, 0x657b09f3d0f52b5b8f2f97163a0edf0c04f075408a07bbeb3a4101a891990d62
, 0x1e3f7bd5a58fa533344aa8ed3ac122bb9e70d4ef50d004530821948f5fe6315a
, 0x80dccf3fd83dfd0d35aa28585922ab89d5313997673eaf905cea9c0b225c7b5f
, 0x8a0d0fbf6377d83bb08b514b4b1c43acc95d751714f8925645cb6bc856ca150a
, 0x9fa5b487738ad2844cc6348a901918f659a3b89e9c0dfeead30dd94bcf42ef8e
, 0x80832c4a1677f5ea2560f668e9354dd36997f03728cfa55e1b38337c0c9ef818
, 0xab37ddb683137e74080d026b590b96ae9bb447722f305a5ac570ec1df9b1743c
, 0x3ee735a694c2559b693aa68629361e15d12265ad6a3dedf488b0b00fac9754ba
, 0xd6fcd23219b647e4cbd5eb2d0ad01ec8838a4b2901fc325cc3701981ca6c888b
, 0x0520ec2f5bf7a755dacb50c6bf233e3515434763db0139ccd9faefbb8207612d
, 0xaff3b75f3f581264d7661662b92f5ad37c1d32bd45ff81a4ed8adc9ef30dd989
, 0xd0dd650befd3ba63dc25102c627c921b9cbeb0b130686935b5c927cb7ccd5e3b
, 0xe1149816b10a8514fb3e2cab2c08bee9f73ce76221701246a589bbb67302d8a9
, 0x7da3f441de9054317e72b5dbf979da01e6bceebb8478eae6a22849d90292635c
, 0x1230b1fc8a7d9215edc2d4a2decbdd0a6e216c924278c91fc5d10e7d60192d94
, 0x5750d716b4808f751febc38806ba170bf6d5199a7816be514e3f932fbe0cb871
, 0x6fc59b2f10feba954aa6820b3ca987ee81d5cc1da3c63ce827301c569dfb39ce
, 0xc7c3fe1eebdc7b5a939326e8ddb83e8bf2b780b65678cb62f208b040abdd35e2
, 0x0c75c1a15cf34a314ee478f4a5ce0b8a6b36528ef7a820696c3e4246c5a15864
, 0x216dc12a108569a3c7cdde4aed43a6c330139dda3ccc4a108905db3861899050
, 0xa57be6ae6756f28b02f59dadf7e0d7d8807f10fa15ced1ad3585521a1d995a89
, 0x816aef875953716cd7a581f732f53dd435dab66d09c361d2d6592de17755d8a8
, 0x9a76893226693b6ea97e6a738f9d10fb3d0b43ae0e8b7d8123ea76ce97989c7e
, 0x8daedb9a271529dbb7dc3b607fe5eb2d3211770758dd3b0a3593d2d7954e2d5b
, 0x16dbc0aa5dd2c774f505100f733786d8a175fcbbb59c43e1fbff3e1eaf31cb4a
, 0x8606cb899c6aeaf51b9db0fe4924a9fd5dabc19f8826f2bc1c1d7da14d2c2c99
, 0x8479731aeda57bd37eadb51a507e307f3bd95e69dbca94f3bc21726066ad6dfd
, 0x58473a9ea82efa3f3b3d8fc83ed8863127b33ae8deae6307201edb6dde61de29
, 0x9a9255d53af116de8ba27ce35b4c7e15640657a0fcb888c70d95431dacd8f830
, 0x9eb05ffba39fd8596a45493e18d2510bf3ef065c51d6e13abe66aa57e05cfdb7
, 0x81dcc3a505eace3f879d8f702776770f9df50e521d1428a85daf04f9ad2150e0
, 0xe3e3c4aa3acbbc85332af9d564bc24165e1687f6b1adcbfae77a8f03c72ac28c
, 0x6746c80b4eb56aea45e64e7289bba3edbf45ecf8206481ff6302122984cd526a
, 0x2b628e52764d7d62c0868b212357cdd12d9149822f4e9845d918a08d1ae990c0
, 0xe4bfe80d58c91994613909dc4b1a12496896c004af7b5701483de45d2823d78e
, 0xebb4ba150cef2734345b5d641bbed03a21eafae933c99e009212ef04574a8530
, 0x3966ec73b154acc697ac5cf5b24b40bdb0db9e398836d76d4b880e3b2af1aa27
, 0xef7e4831b3a84636518d6e4bfce64a43db2a5dda9cca2b44f39033bdc40d6243
, 0x7abf6acf5c8e549ddbb15ae8d8b388c1c197e698737c9785501ed1f94930b7d9
, 0x88018ded66813f0ca95def474c630692019967b9e36888dadd94124719b682f6
, 0x3930876b9fc7529036b008b1b8bb997522a441635a0c25ec02fb6d9026e55a97
, 0x0a4049d57e833b5695fac93dd1fbef3166b44b12ad11248662383ae051e15827
, 0x81dcc0678bb6a765e48c3209654fe90089ce44ff5618477e39ab286476df052b
, 0xe69b3a36a4461912dc08346b11ddcb9db796f885fd01936e662fe29297b099a4
, 0x5ac6503b0d8da6917646e6dcc87edc58e94245324cc204f4dd4af01563acd427
, 0xdf6dda21359a30bc271780971c1abd56a6ef167e480887888e73a86d3bf605e9
, 0xe8e6e47071e7b7df2580f225cfbbedf84ce67746626628d33097e4b7dc571107
, 0x53e40ead62051e19cb9ba8133e3e5c1ce00ddcad8acf342a224360b0acc14777
, 0x9ccd53fe80be786aa984638462fb28afdf122b34d78f4687ec632bb19de2371a
, 0xcbd48052c48d788466a3e8118c56c97fe146e5546faaf93e2bc3c47e45939753
, 0x256883b14e2af44dadb28e1b34b2ac0f0f4c91c34ec9169e29036158acaa95b9
, 0x4471b91ab42db7c4dd8490ab95a2ee8d04e3ef5c3d6fc71ac74b2b26914d1641
, 0xa5eb08038f8f1155ed86e631906fc13095f6bba41de5d4e795758ec8c8df8af1
, 0xdc1db64ed8b48a910e060a6b866374c578784e9ac49ab2774092ac71501934ac
, 0x285413b2f2ee873d34319ee0bbfbb90f32da434cc87e3db5ed121bb398ed964b
, 0x0216e0f81f750f26f1998bc3934e3e124c9945e685a60b25e8fbd9625ab6b599
, 0x38c410f5b9d4072050755b31dca89fd5395c6785eeb3d790f320ff941c5a93bf
, 0xf18417b39d617ab1c18fdf91ebd0fc6d5516bb34cf39364037bce81fa04cecb1
, 0x1fa877de67259d19863a2a34bcc6962a2b25fcbf5cbecd7ede8f1fa36688a796
, 0x5bd169e67c82c2c2e98ef7008bdf261f2ddf30b1c00f9e7f275bb3e8a28dc9a2
, 0xc80abeebb669ad5deeb5f5ec8ea6b7a05ddf7d31ec4c0a2ee20b0b98caec6746
, 0xe76d3fbda5ba374e6bf8e50fadc3bbb9ba5c206ebdec89a3a54cf3dd84a07016
, 0x7bba9dc5b5db2071d17752b1044c1eced96aaf2dd46e9b433750e8ea0dcc1870
, 0xf29b1b1ab9bab163018ee3da15232cca78ec52dbc34eda5b822ec1d80fc21bd0
, 0x9ee3e3e7e900f1e11d308c4b2b3076d272cf70124f9f51e1da60f37846cdd2f4
, 0x70ea3b0176927d9096a18508cd123a290325920a9d00a89b5de04273fbc76b85
, 0x67de25c02a4aaba23bdc973c8bb0b5796d47cc0659d43dff1f97de174963b68e
, 0xb2168e4e0f18b0e64100b517ed95257d73f0620df885c13d2ecf79367b384cee
, 0x2e7dec2428853b2c71760745541f7afe9825b5dd77df06511d8441a94bacc927
, 0xca9ffac4c43f0b48461dc5c263bea3f6f00611ceacabf6f895ba2b0101dbb68d
, 0x7410d42d8fd1d5e9d2f5815cb93417998828ef3c4230bfbd412df0a4a7a2507a
, 0x5010f684516dccd0b6ee0852c2512b4dc0066cf0d56f35302978db8ae32c6a81
, 0xacaab585f7b79b719935ceb89523ddc54827f75c56883856154a56cdcd5ee988
, 0x666de5d1440fee7331aaf0123a62ef2d8ba57453a0769635ac6cd01e633f7712
, 0xa6f98658f6eabaf902d8b3871a4b101d16196e8a4b241e1558fe29966e103e8d
, 0x891546a8b29f3047ddcfe5b00e45fd55756373105ea8637dfcff547b6ea9535f
, 0x18dfbc1ac5d25b0761137dbd22c17c829d0f0ef1d82344e9c89c286694da24e8
, 0xb54b9b67f8fed54bbf5a2666dbdf4b23cff1d1b6f4afc985b2e6d3305a9ff80f
, 0x7db442e132ba59bc1289aa98b0d3e806004f8ec12811af1e2e33c69bfde729e1
, 0x250f37cdc15e817d2f160d9956c71fe3eb5db74556e4adf9a4ffafba74010396
, 0x4ab8a3dd1ddf8ad43dab13a27f66a6544f290597fa96040e0e1db9263aa479f8
, 0xee61727a0766df939ccdc860334044c79a3c9b156200bc3aa32973483d8341ae
, 0x3f68c7ec63ac11ebb98f94b339b05c104984fda50103060144e5a2bfccc9da95
, 0x056f29816b8af8f56682bc4d7cf094111da7733e726cd13d6b3e8ea03e92a0d5
, 0xf5ec43a28acbeff1f3318a5bcac7c66ddb5230b79db2d105bcbe15f3c1148d69
, 0x2a6960ad1d8dd547555cfbd5e4600f1eaa1c8eda34de0374ec4a26eaaaa33b4e
, 0xdcc1ea7baab93384f76b796866199754742f7b96d6b4c120165c04a6c4f5ce10
, 0x13d5df179221379c6a78c07c793ff53487cae6bf9fe882541ab0e735e3eada3b
, 0x8c59e4407641a01e8ff91f9980dc236f4ecd6fcf52589a099a961633967714e1
, 0x833b1ac6a251fd08fd6d908fea2a4ee1e040bca93fc1a38ec3820e0c10bd82ea
, 0xa244f927f3b40b8f6c391570c765418f2f6e708eac9006c51a7feff4af3b2b9e
, 0x3d99ed9550cf1196e6c4d20c259620f858c3d703374c128ce7b590310c83046d
, 0x2b35c47d7b87761f0ae43ac56ac27b9f25830367b595be8c240e94600c6e3312
, 0x5d11ed37d24dc767305cb7e1467d87c065ac4bc8a426de38991ff59aa8735d02
, 0xb836478e1ca0640dce6fd910a5096272c8330990cd97864ac2bf14ef6b23914a
, 0x9100f946d6ccde3a597f90d39fc1215baddc7413643d85c21c3eee5d2dd32894
, 0xda70eedd23e663aa1a74b9766935b479222a72afba5c795158dad41a3bd77e40
, 0xf067ed6a0dbd43aa0a9254e69fd66bdd8acb87de936c258cfb02285f2c11fa79
, 0x715c99c7d57580cf9753b4c1d795e45a83fbb228c0d36fbe20faf39bdd6d4e85
, 0xe457d6ad1e67cb9bbd17cbd698fa6d7dae0c9b7ad6cbd6539634e32a719c8492
, 0xece3ea8103e02483c64a70a4bdcee8ceb6278f2533f3f48dbeedfba94531d4ae
, 0x388aa5d3667a97c68d3d56f8f3ee8d3d36091f17fe5d1b0d5d84c93b2ffe40bd
, 0x8b6b31b9ad7c3d5cd84bf98947b9cdb59df8a25ff738101013be4fd65e1dd1a3
, 0x066291f6bbd25f3c853db7d8b95c9a1cfb9bf1c1c99fb95a9b7869d90f1c2903
, 0xa707efbccdceed42967a66f5539b93ed7560d467304016c4780d7755a565d4c4
, 0x38c53dfb70be7e792b07a6a35b8a6a0aba02c5c5f38baf5c823fdfd9e42d657e
, 0xf2911386501d9ab9d720cf8ad10503d5634bf4b7d12b56dfb74fecc6e4093f68
, 0xc6f2bdd52b81e6e4f6595abd4d7fb31f651169d00ff326926b34947b28a83959
, 0x293d94b18c98bb3223366b8ce74c28fbdf28e1f84a3350b0eb2d1804a577579b
, 0x2c2fa5c0b51533165bc375c22e2781768270a383985d13bd6b67b6fd67f889eb
, 0xcaa09b82b72562e43f4b2275c091918e624d911661cc811bb5faec51f6088ef7
, 0x24761e45e674395379fb17729c78cb939e6f74c5dffb9c961f495982c3ed1fe3
, 0x55b70a82131ec94888d7ab54a7c515255c3938bb10bc784dc9b67f076e341a73
, 0x6ab9057b977ebc3ca4d4ce74506c25cccdc566497c450b5415a39486f8657a03
, 0x24066deee0ecee15a45f0a326d0f8dbc79761ebb93cf8c0377af440978fcf994
, 0x20000d3f66ba76860d5a950688b9aa0d76cfea59b005d859914b1a46653a939b
, 0xb92daa79603e3bdbc3bfe0f419e409b2ea10dc435beefe2959da16895d5dca1c
, 0xe947948705b206d572b0e8f62f66a6551cbd6bc305d26ce7539a12f9aadf7571
, 0x3d67c1b3f9b23910e3d35e6b0f2ccf44a0b540a45c18ba3c36264dd48e96af6a
, 0xc7558babda04bccb764d0bbf3358425141902d22391d9f8c59159fec9e49b151
, 0x0b732bb035675a50ff58f2c242e4710aece64670079c13044c79c9b7491f7000
, 0xd120b5ef6d57ebf06eaf96bc933c967b16cbe6e2bf00741c30aa1c54ba64801f
, 0x58d212ad6f58aef0f80116b441e57f6195bfef26b61463edec1183cdb04fe76d
, 0xb8836f51d1e29bdfdba325565360268b8fad627473edecef7eaefee837c74003
, 0xc547a3c124ae5685ffa7b8edaf96ec86f8b2d0d50cee8be3b1f0c76763069d9c
, 0x5d168b769a2f67853d6295f7568be40bb7a16b8d65ba87635d1978d2ab11ba2a
, 0xa2f675dc7302638cb60201064ca55077714d71fe096a315f2fe7401277caa5af
, 0xc8aab5cd0160ae78cd2e8ac5fb0e093cdb5c4b6052a0a97bb04216826fa7a437
, 0xff68ca4035bfeb43fbf145fddd5e43f1cea54f11f7bee13058f027329a4a5fa4
, 0x1d4e5487ae3c740f2ba6e541ac91bc2bfcd2999c518d807b426748803a350fd4
, 0x6d244e1a06ce4ef578dd0f63aff0936706735119ca9c8d22d86c801414ab9741
, 0xdecf7329dbcc827b8fc524c9431e8998029ece12ce93b7b2f3e769a941fb8cea
, 0x2fafcc0f2e63cbd07755be7b75ecea0adff9aa5ede2a52fdab4dfd0374cd483f
, 0xaa85010dd46a546b535ef4cf5f07d65161e89828f3a77db7b9b56f0df59aae45
, 0x07e8e1ee732cb0d356c9c0d1069c89d17adf6a9a334f745ec7867332548ca8e9
, 0x0e01e81cada8162bfd5f8a8c818a6c69fedf02ceb5208523cbe5313b89ca1053
, 0x6bb6c6472655084399852e00249f8cb247896d392b02d73b7f0dd818e1e29b07
, 0x42d4636e2060f08f41c882e76b396b112ef627cc24c43dd5f83a1d1a7ead711a
, 0x4858c9a188b0234fb9a8d47d0b4133650a030bd0611b87c3892e94951f8df852
, 0x3fab3e36988d445a51c8783e531be3a02be40cd04796cfb61d40347442d3f794
, 0xebabc49636bd433d2ec8f0e518732ef8fa21d4d071cc3bc46cd79fa38a28b810
, 0xa1d0343523b893fca84f47feb4a64d350a17d8eef5497ece697d02d79178b591
, 0x262ebfd9130b7d28760d08ef8bfd3b86cdd3b2113d2caef7ea951a303dfa3846
, 0xf76158edd50a154fa78203ed2362932fcb8253aae378903eded1e03f7021a257
, 0x26178e950ac722f67ae56e571b284c0207684a6334a17748a94d260bc5f55274
, 0xc378d1e493b40ef11fe6a15d9c2737a37809634c5abad5b33d7e393b4ae05d03
, 0x984bd8379101be8fd80612d8ea2959a7865ec9718523550107ae3938df32011b
, 0xc6f25a812a144858ac5ced37a93a9f4759ba0b1c0fdc431dce35f9ec1f1f4a99
, 0x924c75c94424ff75e74b8b4e94358958b027b171df5e57899ad0d4dac37353b6
, 0x0af35892a63f45931f6846ed190361cd073089e077165714b50b81a2e3dd9ba1
, 0xcc80cefb26c3b2b0daef233e606d5ffc80fa17427d18e30489673e06ef4b87f7
, 0xc2f8c8117447f3978b0818dcf6f70116ac56fd184dd1278494e103fc6d74a887
, 0xbdecf6bfc1ba0df6e862c831992207796acc797968358828c06e7a51e090098f
, 0x24d1a26e3dab02fe4572d2aa7dbd3ec30f0693db26f273d0ab2cb0c13b5e6451
, 0xec56f58b09299a300b140565d7d3e68782b6e2fbeb4b7ea97ac057989061dd3f
, 0x11a437c1aba3c119ddfab31b3e8c841deeeb913ef57f7e48f2c9cf5a28fa42bc
, 0x53c7e6114b850a2cb496c9b3c69a623eaea2cb1d33dd817e4765edaa6823c228
, 0x154c3e96fee5db14f8773e18af14857913509da999b46cdd3d4c169760c83ad2
, 0x40b9916f093e027a8786641818920620472fbcf68f701d1b680632e6996bded3
, 0x24c4cbba07119831a726b05305d96da02ff8b148f0da440fe233bcaa32c72f6f
, 0x5d201510250020b783689688abbf8ecf2594a96a08f2bfec6ce0574465dded71
, 0x043b97e336ee6fdbbe2b50f22af83275a4084805d2d5645962454b6c9b8053a0
, 0x564835cbaea774948568be36cf52fcdd83934eb0a27512dbe3e2db47b9e6635a
, 0xf21c33f47bde40a2a101c9cde8027aaf61a3137de2422b30035a04c270894183
, 0x9db0ef74e66cbb842eb0e07343a03c5c567e372b3f23b943c788a4f250f67891
, 0xab8d08655ff1d3fe8758d562235fd23e7cf9dcaad658872a49e5d3183b6ccebd
, 0x6f27f77e7bcf46a1e963ade0309733543031dccdd47caac174d7d27ce8077e8b
, 0xe3cd54da7e444caa6207569525a670ebae1278de4e3fe2684b3e33f5ef90cc1b
, 0xb2c3e33a51d22c4c08fc0989c873c9cc4150579b1e6163fa694ad51d53d712dc
, 0xbe7fda983e13189b4c77e0a80920b6e0e0ea80c3b84dbe7e7117d253f48112f4
, 0xb6008c28fae08aa427e5bd3aad36f10021f16c77cfeabed07f97cc7dc1f1284a
, 0x6e4e6760c538f2e97b3adbfbbcde57f8966b7ea8fcb5bf7efec913fd2a2b0c55
, 0x4ae51fd1834aa5bd9a6f7ec39fc663338dc5d2e20761566d90cc68b1cb875ed8
, 0xb673aad75ab1fdb5401abfa1bf89f3add2ebc468df3624a478f4fe859d8d55e2
, 0x13c9471a9855913539836660398da0f3f99ada08479c69d1b7fcaa3461dd7e59
, 0x2c11f4a7f99a1d23a58bb636350fe849f29cbac1b2a1112d9f1ed5bc5b313ccd
, 0xc7d3c0706b11ae741c05a1ef150dd65b5494d6d54c9a86e2617854e6aeeebbd9
, 0x194e10c93893afa064c3ac04c0dd808d791c3d4b7556e89d8d9cb225c4b33339
, 0x6fc4988b8f78546b1688991845908f134b6a482e6994b3d48317bf08db292185
, 0x5665beb8b0955525813b5981cd142ed4d03fba38a6f3e5ad268e0cc270d1cd11
, 0xb883d68f5fe51936431ba4256738053b1d0426d4cb64b16e83badc5e9fbe3b81
, 0x53e7b27ea59c2f6dbb50769e43554df35af89f4822d0466b007dd6f6deafff02
, 0x1f1a0229d4640f01901588d9dec22d13fc3eb34a61b32938efbf5334b2800afa
, 0xc2b405afa0fa6668852aee4d88040853fab800e72b57581418e5506f214c7d1f
, 0xc08aa1c286d709fdc7473744977188c895ba011014247e4efa8d07e78fec695c
, 0xf03f5789d3336b80d002d59fdf918bdb775b00956ed5528e86aa994acb38fe2d
]