123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886 |
|
/*******************************************************************************
copyright: Copyright (c) 2006 Tango. All rights reserved
license: BSD style: see doc/license.txt for details
version: Initial release: Feb 2006
author: Regan Heath, Oskar Linde
This module implements the Tiger algorithm by Ross Anderson and Eli
Biham.
*******************************************************************************/
module tango.util.digest.Tiger;
private import tango.core.ByteSwap;
private import tango.util.digest.MerkleDamgard;
public import tango.util.digest.Digest;
/*******************************************************************************
*******************************************************************************/
final class Tiger : MerkleDamgard
{
private ulong[3] context;
private uint npass = 3;
private enum uint padChar = 0x01;
/***********************************************************************
***********************************************************************/
private enum ulong[3] initial =
[
0x0123456789ABCDEF,
0xFEDCBA9876543210,
0xF096A5B4C3B2E187
];
/***********************************************************************
Construct an Tiger
***********************************************************************/
this() { }
/***********************************************************************
The size of a tiger digest is 24 bytes
***********************************************************************/
override uint digestSize() {return 24;}
/***********************************************************************
Initialize the cipher
Remarks:
Returns the cipher state to it's initial value
***********************************************************************/
override void reset()
{
super.reset();
context[] = initial[];
}
/***********************************************************************
Obtain the digest
Returns:
the digest
Remarks:
Returns a digest of the current cipher state, this may be the
final digest, or a digest of the state between calls to update()
***********************************************************************/
override void createDigest(ubyte[] buf)
{
version (BigEndian)
ByteSwap.swap64 (context.ptr, context.length * ulong.sizeof);
buf[] = cast(ubyte[]) context;
}
/***********************************************************************
Get the number of passes being performed
Returns:
the number of passes
Remarks:
The Tiger algorithm may perform an arbitrary number of passes
the minimum recommended number is 3 and this number should be
quite secure however the "ultra-cautious" may wish to increase
this number.
***********************************************************************/
uint passes()
{
return npass;
}
/***********************************************************************
Set the number of passes to be performed
Params:
n = the number of passes to perform
Remarks:
The Tiger algorithm may perform an arbitrary number of passes
the minimum recommended number is 3 and this number should be
quite secure however the "ultra-cautious" may wish to increase
this number.
***********************************************************************/
void passes(uint n)
{
if (n < 3) return ;
npass = n;
}
/***********************************************************************
block size
Returns:
the block size
Remarks:
Specifies the size (in bytes) of the block of data to pass to
each call to transform(). For Tiger the blockSize is 64.
***********************************************************************/
protected override uint blockSize() { return 64; }
/***********************************************************************
Length padding size
Returns:
the length padding size
Remarks:
Specifies the size (in bytes) of the padding which uses the
length of the data which has been ciphered, this padding is
carried out by the padLength method. For Tiger the addSize is 8.
***********************************************************************/
protected override uint addSize() { return 8; }
/***********************************************************************
Pads the cipher data
Params:
data = a slice of the cipher buffer to fill with padding
Remarks:
Fills the passed buffer slice with the appropriate padding for
the final call to transform(). This padding will fill the cipher
buffer up to blockSize()-addSize().
***********************************************************************/
protected override void padMessage(ubyte[] at)
{
at[0] = padChar;
at[1..at.length] = 0;
}
/***********************************************************************
Performs the length padding
Params:
data = the slice of the cipher buffer to fill with padding
length = the length of the data which has been ciphered
Remarks:
Fills the passed buffer slice with addSize() bytes of padding
based on the length in bytes of the input data which has been
ciphered.
***********************************************************************/
protected override void padLength(ubyte[] at, ulong length)
{
length <<= 3;
littleEndian64((cast(ubyte*)&length)[0..8],cast(ulong[]) at);
}
/***********************************************************************
Performs the cipher on a block of data
Params:
data = the block of data to cipher
Remarks:
The actual cipher algorithm is carried out by this method on
the passed block of data. This method is called for every
blockSize() bytes of input data and once more with the remaining
data padded to blockSize().
***********************************************************************/
protected override void transform(const(ubyte[]) input)
{
ulong tmpa,a,b,c;
ulong[8] x;
uint i;
littleEndian64(input,x);
a = context[0];
b = context[1];
c = context[2];
for(i = 0; i < npass; i++) {
if (i > 0) keySchedule(x);
pass(a,b,c,x,(i==0)?5:(i==1)?7:9);
tmpa = a; a = c; c = b; b = tmpa;
}
context[0] = a ^ context[0];
context[1] = b - context[1];
context[2] = c + context[2];
x[] = 0;
}
/***********************************************************************
***********************************************************************/
private static ubyte getByte(ulong c, uint b1, uint b2 = 0)
{
return cast(ubyte) (c >> (b1*8) >> (b2*8));
}
/***********************************************************************
***********************************************************************/
private static void round(ref ulong a, ref ulong b, ref ulong c, ulong x, ulong mul)
{
c ^= x;
a -= t1[getByte(c,0)] ^ t2[getByte(c,2)] ^ t3[getByte(c,4)] ^ t4[getByte(c,4,2)];
b += t4[getByte(c,1)] ^ t3[getByte(c,3)] ^ t2[getByte(c,4,1)] ^ t1[getByte(c,4,3)];
b *= mul;
}
/***********************************************************************
***********************************************************************/
private static void pass(ref ulong a, ref ulong b, ref ulong c, ref ulong[8] x, ulong mul)
{
round(a,b,c,x[0],mul);
round(b,c,a,x[1],mul);
round(c,a,b,x[2],mul);
round(a,b,c,x[3],mul);
round(b,c,a,x[4],mul);
round(c,a,b,x[5],mul);
round(a,b,c,x[6],mul);
round(b,c,a,x[7],mul);
}
/***********************************************************************
***********************************************************************/
private static void keySchedule(ref ulong[8] x)
{
x[0] -= x[7] ^ 0xA5A5A5A5A5A5A5A5;
x[1] ^= x[0];
x[2] += x[1];
x[3] -= x[2] ^ ((~x[1])<<19);
x[4] ^= x[3];
x[5] += x[4];
x[6] -= x[5] ^ ((~x[4])>>23);
x[7] ^= x[6];
x[0] += x[7];
x[1] -= x[0] ^ ((~x[7])<<19);
x[2] ^= x[1];
x[3] += x[2];
x[4] -= x[3] ^ ((~x[2])>>23);
x[5] ^= x[4];
x[6] += x[5];
x[7] -= x[6] ^ 0x0123456789ABCDEF;
}
/***********************************************************************
***********************************************************************/
@property private static ulong[] t1() { return table[0..256]; }
@property private static ulong[] t2() { return table[256..512]; }
@property private static ulong[] t3() { return table[512..768]; }
@property private static ulong[] t4() { return table[768..1024]; }
}
/*******************************************************************************
*******************************************************************************/
private enum ulong[1024] table =
[
0x02aab17cf7e90c5e /* 0 */, 0xac424b03e243a8ec /* 1 */,
0x72cd5be30dd5fcd3 /* 2 */, 0x6d019b93f6f97f3a /* 3 */,
0xcd9978ffd21f9193 /* 4 */, 0x7573a1c9708029e2 /* 5 */,
0xb164326b922a83c3 /* 6 */, 0x46883eee04915870 /* 7 */,
0xeaace3057103ece6 /* 8 */, 0xc54169b808a3535c /* 9 */,
0x4ce754918ddec47c /* 10 */, 0x0aa2f4dfdc0df40c /* 11 */,
0x10b76f18a74dbefa /* 12 */, 0xc6ccb6235ad1ab6a /* 13 */,
0x13726121572fe2ff /* 14 */, 0x1a488c6f199d921e /* 15 */,
0x4bc9f9f4da0007ca /* 16 */, 0x26f5e6f6e85241c7 /* 17 */,
0x859079dbea5947b6 /* 18 */, 0x4f1885c5c99e8c92 /* 19 */,
0xd78e761ea96f864b /* 20 */, 0x8e36428c52b5c17d /* 21 */,
0x69cf6827373063c1 /* 22 */, 0xb607c93d9bb4c56e /* 23 */,
0x7d820e760e76b5ea /* 24 */, 0x645c9cc6f07fdc42 /* 25 */,
0xbf38a078243342e0 /* 26 */, 0x5f6b343c9d2e7d04 /* 27 */,
0xf2c28aeb600b0ec6 /* 28 */, 0x6c0ed85f7254bcac /* 29 */,
0x71592281a4db4fe5 /* 30 */, 0x1967fa69ce0fed9f /* 31 */,
0xfd5293f8b96545db /* 32 */, 0xc879e9d7f2a7600b /* 33 */,
0x860248920193194e /* 34 */, 0xa4f9533b2d9cc0b3 /* 35 */,
0x9053836c15957613 /* 36 */, 0xdb6dcf8afc357bf1 /* 37 */,
0x18beea7a7a370f57 /* 38 */, 0x037117ca50b99066 /* 39 */,
0x6ab30a9774424a35 /* 40 */, 0xf4e92f02e325249b /* 41 */,
0x7739db07061ccae1 /* 42 */, 0xd8f3b49ceca42a05 /* 43 */,
0xbd56be3f51382f73 /* 44 */, 0x45faed5843b0bb28 /* 45 */,
0x1c813d5c11bf1f83 /* 46 */, 0x8af0e4b6d75fa169 /* 47 */,
0x33ee18a487ad9999 /* 48 */, 0x3c26e8eab1c94410 /* 49 */,
0xb510102bc0a822f9 /* 50 */, 0x141eef310ce6123b /* 51 */,
0xfc65b90059ddb154 /* 52 */, 0xe0158640c5e0e607 /* 53 */,
0x884e079826c3a3cf /* 54 */, 0x930d0d9523c535fd /* 55 */,
0x35638d754e9a2b00 /* 56 */, 0x4085fccf40469dd5 /* 57 */,
0xc4b17ad28be23a4c /* 58 */, 0xcab2f0fc6a3e6a2e /* 59 */,
0x2860971a6b943fcd /* 60 */, 0x3dde6ee212e30446 /* 61 */,
0x6222f32ae01765ae /* 62 */, 0x5d550bb5478308fe /* 63 */,
0xa9efa98da0eda22a /* 64 */, 0xc351a71686c40da7 /* 65 */,
0x1105586d9c867c84 /* 66 */, 0xdcffee85fda22853 /* 67 */,
0xccfbd0262c5eef76 /* 68 */, 0xbaf294cb8990d201 /* 69 */,
0xe69464f52afad975 /* 70 */, 0x94b013afdf133e14 /* 71 */,
0x06a7d1a32823c958 /* 72 */, 0x6f95fe5130f61119 /* 73 */,
0xd92ab34e462c06c0 /* 74 */, 0xed7bde33887c71d2 /* 75 */,
0x79746d6e6518393e /* 76 */, 0x5ba419385d713329 /* 77 */,
0x7c1ba6b948a97564 /* 78 */, 0x31987c197bfdac67 /* 79 */,
0xde6c23c44b053d02 /* 80 */, 0x581c49fed002d64d /* 81 */,
0xdd474d6338261571 /* 82 */, 0xaa4546c3e473d062 /* 83 */,
0x928fce349455f860 /* 84 */, 0x48161bbacaab94d9 /* 85 */,
0x63912430770e6f68 /* 86 */, 0x6ec8a5e602c6641c /* 87 */,
0x87282515337ddd2b /* 88 */, 0x2cda6b42034b701b /* 89 */,
0xb03d37c181cb096d /* 90 */, 0xe108438266c71c6f /* 91 */,
0x2b3180c7eb51b255 /* 92 */, 0xdf92b82f96c08bbc /* 93 */,
0x5c68c8c0a632f3ba /* 94 */, 0x5504cc861c3d0556 /* 95 */,
0xabbfa4e55fb26b8f /* 96 */, 0x41848b0ab3baceb4 /* 97 */,
0xb334a273aa445d32 /* 98 */, 0xbca696f0a85ad881 /* 99 */,
0x24f6ec65b528d56c /* 100 */, 0x0ce1512e90f4524a /* 101 */,
0x4e9dd79d5506d35a /* 102 */, 0x258905fac6ce9779 /* 103 */,
0x2019295b3e109b33 /* 104 */, 0xf8a9478b73a054cc /* 105 */,
0x2924f2f934417eb0 /* 106 */, 0x3993357d536d1bc4 /* 107 */,
0x38a81ac21db6ff8b /* 108 */, 0x47c4fbf17d6016bf /* 109 */,
0x1e0faadd7667e3f5 /* 110 */, 0x7abcff62938beb96 /* 111 */,
0xa78dad948fc179c9 /* 112 */, 0x8f1f98b72911e50d /* 113 */,
0x61e48eae27121a91 /* 114 */, 0x4d62f7ad31859808 /* 115 */,
0xeceba345ef5ceaeb /* 116 */, 0xf5ceb25ebc9684ce /* 117 */,
0xf633e20cb7f76221 /* 118 */, 0xa32cdf06ab8293e4 /* 119 */,
0x985a202ca5ee2ca4 /* 120 */, 0xcf0b8447cc8a8fb1 /* 121 */,
0x9f765244979859a3 /* 122 */, 0xa8d516b1a1240017 /* 123 */,
0x0bd7ba3ebb5dc726 /* 124 */, 0xe54bca55b86adb39 /* 125 */,
0x1d7a3afd6c478063 /* 126 */, 0x519ec608e7669edd /* 127 */,
0x0e5715a2d149aa23 /* 128 */, 0x177d4571848ff194 /* 129 */,
0xeeb55f3241014c22 /* 130 */, 0x0f5e5ca13a6e2ec2 /* 131 */,
0x8029927b75f5c361 /* 132 */, 0xad139fabc3d6e436 /* 133 */,
0x0d5df1a94ccf402f /* 134 */, 0x3e8bd948bea5dfc8 /* 135 */,
0xa5a0d357bd3ff77e /* 136 */, 0xa2d12e251f74f645 /* 137 */,
0x66fd9e525e81a082 /* 138 */, 0x2e0c90ce7f687a49 /* 139 */,
0xc2e8bcbeba973bc5 /* 140 */, 0x000001bce509745f /* 141 */,
0x423777bbe6dab3d6 /* 142 */, 0xd1661c7eaef06eb5 /* 143 */,
0xa1781f354daacfd8 /* 144 */, 0x2d11284a2b16affc /* 145 */,
0xf1fc4f67fa891d1f /* 146 */, 0x73ecc25dcb920ada /* 147 */,
0xae610c22c2a12651 /* 148 */, 0x96e0a810d356b78a /* 149 */,
0x5a9a381f2fe7870f /* 150 */, 0xd5ad62ede94e5530 /* 151 */,
0xd225e5e8368d1427 /* 152 */, 0x65977b70c7af4631 /* 153 */,
0x99f889b2de39d74f /* 154 */, 0x233f30bf54e1d143 /* 155 */,
0x9a9675d3d9a63c97 /* 156 */, 0x5470554ff334f9a8 /* 157 */,
0x166acb744a4f5688 /* 158 */, 0x70c74caab2e4aead /* 159 */,
0xf0d091646f294d12 /* 160 */, 0x57b82a89684031d1 /* 161 */,
0xefd95a5a61be0b6b /* 162 */, 0x2fbd12e969f2f29a /* 163 */,
0x9bd37013feff9fe8 /* 164 */, 0x3f9b0404d6085a06 /* 165 */,
0x4940c1f3166cfe15 /* 166 */, 0x09542c4dcdf3defb /* 167 */,
0xb4c5218385cd5ce3 /* 168 */, 0xc935b7dc4462a641 /* 169 */,
0x3417f8a68ed3b63f /* 170 */, 0xb80959295b215b40 /* 171 */,
0xf99cdaef3b8c8572 /* 172 */, 0x018c0614f8fcb95d /* 173 */,
0x1b14accd1a3acdf3 /* 174 */, 0x84d471f200bb732d /* 175 */,
0xc1a3110e95e8da16 /* 176 */, 0x430a7220bf1a82b8 /* 177 */,
0xb77e090d39df210e /* 178 */, 0x5ef4bd9f3cd05e9d /* 179 */,
0x9d4ff6da7e57a444 /* 180 */, 0xda1d60e183d4a5f8 /* 181 */,
0xb287c38417998e47 /* 182 */, 0xfe3edc121bb31886 /* 183 */,
0xc7fe3ccc980ccbef /* 184 */, 0xe46fb590189bfd03 /* 185 */,
0x3732fd469a4c57dc /* 186 */, 0x7ef700a07cf1ad65 /* 187 */,
0x59c64468a31d8859 /* 188 */, 0x762fb0b4d45b61f6 /* 189 */,
0x155baed099047718 /* 190 */, 0x68755e4c3d50baa6 /* 191 */,
0xe9214e7f22d8b4df /* 192 */, 0x2addbf532eac95f4 /* 193 */,
0x32ae3909b4bd0109 /* 194 */, 0x834df537b08e3450 /* 195 */,
0xfa209da84220728d /* 196 */, 0x9e691d9b9efe23f7 /* 197 */,
0x0446d288c4ae8d7f /* 198 */, 0x7b4cc524e169785b /* 199 */,
0x21d87f0135ca1385 /* 200 */, 0xcebb400f137b8aa5 /* 201 */,
0x272e2b66580796be /* 202 */, 0x3612264125c2b0de /* 203 */,
0x057702bdad1efbb2 /* 204 */, 0xd4babb8eacf84be9 /* 205 */,
0x91583139641bc67b /* 206 */, 0x8bdc2de08036e024 /* 207 */,
0x603c8156f49f68ed /* 208 */, 0xf7d236f7dbef5111 /* 209 */,
0x9727c4598ad21e80 /* 210 */, 0xa08a0896670a5fd7 /* 211 */,
0xcb4a8f4309eba9cb /* 212 */, 0x81af564b0f7036a1 /* 213 */,
0xc0b99aa778199abd /* 214 */, 0x959f1ec83fc8e952 /* 215 */,
0x8c505077794a81b9 /* 216 */, 0x3acaaf8f056338f0 /* 217 */,
0x07b43f50627a6778 /* 218 */, 0x4a44ab49f5eccc77 /* 219 */,
0x3bc3d6e4b679ee98 /* 220 */, 0x9cc0d4d1cf14108c /* 221 */,
0x4406c00b206bc8a0 /* 222 */, 0x82a18854c8d72d89 /* 223 */,
0x67e366b35c3c432c /* 224 */, 0xb923dd61102b37f2 /* 225 */,
0x56ab2779d884271d /* 226 */, 0xbe83e1b0ff1525af /* 227 */,
0xfb7c65d4217e49a9 /* 228 */, 0x6bdbe0e76d48e7d4 /* 229 */,
0x08df828745d9179e /* 230 */, 0x22ea6a9add53bd34 /* 231 */,
0xe36e141c5622200a /* 232 */, 0x7f805d1b8cb750ee /* 233 */,
0xafe5c7a59f58e837 /* 234 */, 0xe27f996a4fb1c23c /* 235 */,
0xd3867dfb0775f0d0 /* 236 */, 0xd0e673de6e88891a /* 237 */,
0x123aeb9eafb86c25 /* 238 */, 0x30f1d5d5c145b895 /* 239 */,
0xbb434a2dee7269e7 /* 240 */, 0x78cb67ecf931fa38 /* 241 */,
0xf33b0372323bbf9c /* 242 */, 0x52d66336fb279c74 /* 243 */,
0x505f33ac0afb4eaa /* 244 */, 0xe8a5cd99a2cce187 /* 245 */,
0x534974801e2d30bb /* 246 */, 0x8d2d5711d5876d90 /* 247 */,
0x1f1a412891bc038e /* 248 */, 0xd6e2e71d82e56648 /* 249 */,
0x74036c3a497732b7 /* 250 */, 0x89b67ed96361f5ab /* 251 */,
0xffed95d8f1ea02a2 /* 252 */, 0xe72b3bd61464d43d /* 253 */,
0xa6300f170bdc4820 /* 254 */, 0xebc18760ed78a77a /* 255 */,
0xe6a6be5a05a12138 /* 256 */, 0xb5a122a5b4f87c98 /* 257 */,
0x563c6089140b6990 /* 258 */, 0x4c46cb2e391f5dd5 /* 259 */,
0xd932addbc9b79434 /* 260 */, 0x08ea70e42015aff5 /* 261 */,
0xd765a6673e478cf1 /* 262 */, 0xc4fb757eab278d99 /* 263 */,
0xdf11c6862d6e0692 /* 264 */, 0xddeb84f10d7f3b16 /* 265 */,
0x6f2ef604a665ea04 /* 266 */, 0x4a8e0f0ff0e0dfb3 /* 267 */,
0xa5edeef83dbcba51 /* 268 */, 0xfc4f0a2a0ea4371e /* 269 */,
0xe83e1da85cb38429 /* 270 */, 0xdc8ff882ba1b1ce2 /* 271 */,
0xcd45505e8353e80d /* 272 */, 0x18d19a00d4db0717 /* 273 */,
0x34a0cfeda5f38101 /* 274 */, 0x0be77e518887caf2 /* 275 */,
0x1e341438b3c45136 /* 276 */, 0xe05797f49089ccf9 /* 277 */,
0xffd23f9df2591d14 /* 278 */, 0x543dda228595c5cd /* 279 */,
0x661f81fd99052a33 /* 280 */, 0x8736e641db0f7b76 /* 281 */,
0x15227725418e5307 /* 282 */, 0xe25f7f46162eb2fa /* 283 */,
0x48a8b2126c13d9fe /* 284 */, 0xafdc541792e76eea /* 285 */,
0x03d912bfc6d1898f /* 286 */, 0x31b1aafa1b83f51b /* 287 */,
0xf1ac2796e42ab7d9 /* 288 */, 0x40a3a7d7fcd2ebac /* 289 */,
0x1056136d0afbbcc5 /* 290 */, 0x7889e1dd9a6d0c85 /* 291 */,
0xd33525782a7974aa /* 292 */, 0xa7e25d09078ac09b /* 293 */,
0xbd4138b3eac6edd0 /* 294 */, 0x920abfbe71eb9e70 /* 295 */,
0xa2a5d0f54fc2625c /* 296 */, 0xc054e36b0b1290a3 /* 297 */,
0xf6dd59ff62fe932b /* 298 */, 0x3537354511a8ac7d /* 299 */,
0xca845e9172fadcd4 /* 300 */, 0x84f82b60329d20dc /* 301 */,
0x79c62ce1cd672f18 /* 302 */, 0x8b09a2add124642c /* 303 */,
0xd0c1e96a19d9e726 /* 304 */, 0x5a786a9b4ba9500c /* 305 */,
0x0e020336634c43f3 /* 306 */, 0xc17b474aeb66d822 /* 307 */,
0x6a731ae3ec9baac2 /* 308 */, 0x8226667ae0840258 /* 309 */,
0x67d4567691caeca5 /* 310 */, 0x1d94155c4875adb5 /* 311 */,
0x6d00fd985b813fdf /* 312 */, 0x51286efcb774cd06 /* 313 */,
0x5e8834471fa744af /* 314 */, 0xf72ca0aee761ae2e /* 315 */,
0xbe40e4cdaee8e09a /* 316 */, 0xe9970bbb5118f665 /* 317 */,
0x726e4beb33df1964 /* 318 */, 0x703b000729199762 /* 319 */,
0x4631d816f5ef30a7 /* 320 */, 0xb880b5b51504a6be /* 321 */,
0x641793c37ed84b6c /* 322 */, 0x7b21ed77f6e97d96 /* 323 */,
0x776306312ef96b73 /* 324 */, 0xae528948e86ff3f4 /* 325 */,
0x53dbd7f286a3f8f8 /* 326 */, 0x16cadce74cfc1063 /* 327 */,
0x005c19bdfa52c6dd /* 328 */, 0x68868f5d64d46ad3 /* 329 */,
0x3a9d512ccf1e186a /* 330 */, 0x367e62c2385660ae /* 331 */,
0xe359e7ea77dcb1d7 /* 332 */, 0x526c0773749abe6e /* 333 */,
0x735ae5f9d09f734b /* 334 */, 0x493fc7cc8a558ba8 /* 335 */,
0xb0b9c1533041ab45 /* 336 */, 0x321958ba470a59bd /* 337 */,
0x852db00b5f46c393 /* 338 */, 0x91209b2bd336b0e5 /* 339 */,
0x6e604f7d659ef19f /* 340 */, 0xb99a8ae2782ccb24 /* 341 */,
0xccf52ab6c814c4c7 /* 342 */, 0x4727d9afbe11727b /* 343 */,
0x7e950d0c0121b34d /* 344 */, 0x756f435670ad471f /* 345 */,
0xf5add442615a6849 /* 346 */, 0x4e87e09980b9957a /* 347 */,
0x2acfa1df50aee355 /* 348 */, 0xd898263afd2fd556 /* 349 */,
0xc8f4924dd80c8fd6 /* 350 */, 0xcf99ca3d754a173a /* 351 */,
0xfe477bacaf91bf3c /* 352 */, 0xed5371f6d690c12d /* 353 */,
0x831a5c285e687094 /* 354 */, 0xc5d3c90a3708a0a4 /* 355 */,
0x0f7f903717d06580 /* 356 */, 0x19f9bb13b8fdf27f /* 357 */,
0xb1bd6f1b4d502843 /* 358 */, 0x1c761ba38fff4012 /* 359 */,
0x0d1530c4e2e21f3b /* 360 */, 0x8943ce69a7372c8a /* 361 */,
0xe5184e11feb5ce66 /* 362 */, 0x618bdb80bd736621 /* 363 */,
0x7d29bad68b574d0b /* 364 */, 0x81bb613e25e6fe5b /* 365 */,
0x071c9c10bc07913f /* 366 */, 0xc7beeb7909ac2d97 /* 367 */,
0xc3e58d353bc5d757 /* 368 */, 0xeb017892f38f61e8 /* 369 */,
0xd4effb9c9b1cc21a /* 370 */, 0x99727d26f494f7ab /* 371 */,
0xa3e063a2956b3e03 /* 372 */, 0x9d4a8b9a4aa09c30 /* 373 */,
0x3f6ab7d500090fb4 /* 374 */, 0x9cc0f2a057268ac0 /* 375 */,
0x3dee9d2dedbf42d1 /* 376 */, 0x330f49c87960a972 /* 377 */,
0xc6b2720287421b41 /* 378 */, 0x0ac59ec07c00369c /* 379 */,
0xef4eac49cb353425 /* 380 */, 0xf450244eef0129d8 /* 381 */,
0x8acc46e5caf4deb6 /* 382 */, 0x2ffeab63989263f7 /* 383 */,
0x8f7cb9fe5d7a4578 /* 384 */, 0x5bd8f7644e634635 /* 385 */,
0x427a7315bf2dc900 /* 386 */, 0x17d0c4aa2125261c /* 387 */,
0x3992486c93518e50 /* 388 */, 0xb4cbfee0a2d7d4c3 /* 389 */,
0x7c75d6202c5ddd8d /* 390 */, 0xdbc295d8e35b6c61 /* 391 */,
0x60b369d302032b19 /* 392 */, 0xce42685fdce44132 /* 393 */,
0x06f3ddb9ddf65610 /* 394 */, 0x8ea4d21db5e148f0 /* 395 */,
0x20b0fce62fcd496f /* 396 */, 0x2c1b912358b0ee31 /* 397 */,
0xb28317b818f5a308 /* 398 */, 0xa89c1e189ca6d2cf /* 399 */,
0x0c6b18576aaadbc8 /* 400 */, 0xb65deaa91299fae3 /* 401 */,
0xfb2b794b7f1027e7 /* 402 */, 0x04e4317f443b5beb /* 403 */,
0x4b852d325939d0a6 /* 404 */, 0xd5ae6beefb207ffc /* 405 */,
0x309682b281c7d374 /* 406 */, 0xbae309a194c3b475 /* 407 */,
0x8cc3f97b13b49f05 /* 408 */, 0x98a9422ff8293967 /* 409 */,
0x244b16b01076ff7c /* 410 */, 0xf8bf571c663d67ee /* 411 */,
0x1f0d6758eee30da1 /* 412 */, 0xc9b611d97adeb9b7 /* 413 */,
0xb7afd5887b6c57a2 /* 414 */, 0x6290ae846b984fe1 /* 415 */,
0x94df4cdeacc1a5fd /* 416 */, 0x058a5bd1c5483aff /* 417 */,
0x63166cc142ba3c37 /* 418 */, 0x8db8526eb2f76f40 /* 419 */,
0xe10880036f0d6d4e /* 420 */, 0x9e0523c9971d311d /* 421 */,
0x45ec2824cc7cd691 /* 422 */, 0x575b8359e62382c9 /* 423 */,
0xfa9e400dc4889995 /* 424 */, 0xd1823ecb45721568 /* 425 */,
0xdafd983b8206082f /* 426 */, 0xaa7d29082386a8cb /* 427 */,
0x269fcd4403b87588 /* 428 */, 0x1b91f5f728bdd1e0 /* 429 */,
0xe4669f39040201f6 /* 430 */, 0x7a1d7c218cf04ade /* 431 */,
0x65623c29d79ce5ce /* 432 */, 0x2368449096c00bb1 /* 433 */,
0xab9bf1879da503ba /* 434 */, 0xbc23ecb1a458058e /* 435 */,
0x9a58df01bb401ecc /* 436 */, 0xa070e868a85f143d /* 437 */,
0x4ff188307df2239e /* 438 */, 0x14d565b41a641183 /* 439 */,
0xee13337452701602 /* 440 */, 0x950e3dcf3f285e09 /* 441 */,
0x59930254b9c80953 /* 442 */, 0x3bf299408930da6d /* 443 */,
0xa955943f53691387 /* 444 */, 0xa15edecaa9cb8784 /* 445 */,
0x29142127352be9a0 /* 446 */, 0x76f0371fff4e7afb /* 447 */,
0x0239f450274f2228 /* 448 */, 0xbb073af01d5e868b /* 449 */,
0xbfc80571c10e96c1 /* 450 */, 0xd267088568222e23 /* 451 */,
0x9671a3d48e80b5b0 /* 452 */, 0x55b5d38ae193bb81 /* 453 */,
0x693ae2d0a18b04b8 /* 454 */, 0x5c48b4ecadd5335f /* 455 */,
0xfd743b194916a1ca /* 456 */, 0x2577018134be98c4 /* 457 */,
0xe77987e83c54a4ad /* 458 */, 0x28e11014da33e1b9 /* 459 */,
0x270cc59e226aa213 /* 460 */, 0x71495f756d1a5f60 /* 461 */,
0x9be853fb60afef77 /* 462 */, 0xadc786a7f7443dbf /* 463 */,
0x0904456173b29a82 /* 464 */, 0x58bc7a66c232bd5e /* 465 */,
0xf306558c673ac8b2 /* 466 */, 0x41f639c6b6c9772a /* 467 */,
0x216defe99fda35da /* 468 */, 0x11640cc71c7be615 /* 469 */,
0x93c43694565c5527 /* 470 */, 0xea038e6246777839 /* 471 */,
0xf9abf3ce5a3e2469 /* 472 */, 0x741e768d0fd312d2 /* 473 */,
0x0144b883ced652c6 /* 474 */, 0xc20b5a5ba33f8552 /* 475 */,
0x1ae69633c3435a9d /* 476 */, 0x97a28ca4088cfdec /* 477 */,
0x8824a43c1e96f420 /* 478 */, 0x37612fa66eeea746 /* 479 */,
0x6b4cb165f9cf0e5a /* 480 */, 0x43aa1c06a0abfb4a /* 481 */,
0x7f4dc26ff162796b /* 482 */, 0x6cbacc8e54ed9b0f /* 483 */,
0xa6b7ffefd2bb253e /* 484 */, 0x2e25bc95b0a29d4f /* 485 */,
0x86d6a58bdef1388c /* 486 */, 0xded74ac576b6f054 /* 487 */,
0x8030bdbc2b45805d /* 488 */, 0x3c81af70e94d9289 /* 489 */,
0x3eff6dda9e3100db /* 490 */, 0xb38dc39fdfcc8847 /* 491 */,
0x123885528d17b87e /* 492 */, 0xf2da0ed240b1b642 /* 493 */,
0x44cefadcd54bf9a9 /* 494 */, 0x1312200e433c7ee6 /* 495 */,
0x9ffcc84f3a78c748 /* 496 */, 0xf0cd1f72248576bb /* 497 */,
0xec6974053638cfe4 /* 498 */, 0x2ba7b67c0cec4e4c /* 499 */,
0xac2f4df3e5ce32ed /* 500 */, 0xcb33d14326ea4c11 /* 501 */,
0xa4e9044cc77e58bc /* 502 */, 0x5f513293d934fcef /* 503 */,
0x5dc9645506e55444 /* 504 */, 0x50de418f317de40a /* 505 */,
0x388cb31a69dde259 /* 506 */, 0x2db4a83455820a86 /* 507 */,
0x9010a91e84711ae9 /* 508 */, 0x4df7f0b7b1498371 /* 509 */,
0xd62a2eabc0977179 /* 510 */, 0x22fac097aa8d5c0e /* 511 */,
0xf49fcc2ff1daf39b /* 512 */, 0x487fd5c66ff29281 /* 513 */,
0xe8a30667fcdca83f /* 514 */, 0x2c9b4be3d2fcce63 /* 515 */,
0xda3ff74b93fbbbc2 /* 516 */, 0x2fa165d2fe70ba66 /* 517 */,
0xa103e279970e93d4 /* 518 */, 0xbecdec77b0e45e71 /* 519 */,
0xcfb41e723985e497 /* 520 */, 0xb70aaa025ef75017 /* 521 */,
0xd42309f03840b8e0 /* 522 */, 0x8efc1ad035898579 /* 523 */,
0x96c6920be2b2abc5 /* 524 */, 0x66af4163375a9172 /* 525 */,
0x2174abdcca7127fb /* 526 */, 0xb33ccea64a72ff41 /* 527 */,
0xf04a4933083066a5 /* 528 */, 0x8d970acdd7289af5 /* 529 */,
0x8f96e8e031c8c25e /* 530 */, 0xf3fec02276875d47 /* 531 */,
0xec7bf310056190dd /* 532 */, 0xf5adb0aebb0f1491 /* 533 */,
0x9b50f8850fd58892 /* 534 */, 0x4975488358b74de8 /* 535 */,
0xa3354ff691531c61 /* 536 */, 0x0702bbe481d2c6ee /* 537 */,
0x89fb24057deded98 /* 538 */, 0xac3075138596e902 /* 539 */,
0x1d2d3580172772ed /* 540 */, 0xeb738fc28e6bc30d /* 541 */,
0x5854ef8f63044326 /* 542 */, 0x9e5c52325add3bbe /* 543 */,
0x90aa53cf325c4623 /* 544 */, 0xc1d24d51349dd067 /* 545 */,
0x2051cfeea69ea624 /* 546 */, 0x13220f0a862e7e4f /* 547 */,
0xce39399404e04864 /* 548 */, 0xd9c42ca47086fcb7 /* 549 */,
0x685ad2238a03e7cc /* 550 */, 0x066484b2ab2ff1db /* 551 */,
0xfe9d5d70efbf79ec /* 552 */, 0x5b13b9dd9c481854 /* 553 */,
0x15f0d475ed1509ad /* 554 */, 0x0bebcd060ec79851 /* 555 */,
0xd58c6791183ab7f8 /* 556 */, 0xd1187c5052f3eee4 /* 557 */,
0xc95d1192e54e82ff /* 558 */, 0x86eea14cb9ac6ca2 /* 559 */,
0x3485beb153677d5d /* 560 */, 0xdd191d781f8c492a /* 561 */,
0xf60866baa784ebf9 /* 562 */, 0x518f643ba2d08c74 /* 563 */,
0x8852e956e1087c22 /* 564 */, 0xa768cb8dc410ae8d /* 565 */,
0x38047726bfec8e1a /* 566 */, 0xa67738b4cd3b45aa /* 567 */,
0xad16691cec0dde19 /* 568 */, 0xc6d4319380462e07 /* 569 */,
0xc5a5876d0ba61938 /* 570 */, 0x16b9fa1fa58fd840 /* 571 */,
0x188ab1173ca74f18 /* 572 */, 0xabda2f98c99c021f /* 573 */,
0x3e0580ab134ae816 /* 574 */, 0x5f3b05b773645abb /* 575 */,
0x2501a2be5575f2f6 /* 576 */, 0x1b2f74004e7e8ba9 /* 577 */,
0x1cd7580371e8d953 /* 578 */, 0x7f6ed89562764e30 /* 579 */,
0xb15926ff596f003d /* 580 */, 0x9f65293da8c5d6b9 /* 581 */,
0x6ecef04dd690f84c /* 582 */, 0x4782275fff33af88 /* 583 */,
0xe41433083f820801 /* 584 */, 0xfd0dfe409a1af9b5 /* 585 */,
0x4325a3342cdb396b /* 586 */, 0x8ae77e62b301b252 /* 587 */,
0xc36f9e9f6655615a /* 588 */, 0x85455a2d92d32c09 /* 589 */,
0xf2c7dea949477485 /* 590 */, 0x63cfb4c133a39eba /* 591 */,
0x83b040cc6ebc5462 /* 592 */, 0x3b9454c8fdb326b0 /* 593 */,
0x56f56a9e87ffd78c /* 594 */, 0x2dc2940d99f42bc6 /* 595 */,
0x98f7df096b096e2d /* 596 */, 0x19a6e01e3ad852bf /* 597 */,
0x42a99ccbdbd4b40b /* 598 */, 0xa59998af45e9c559 /* 599 */,
0x366295e807d93186 /* 600 */, 0x6b48181bfaa1f773 /* 601 */,
0x1fec57e2157a0a1d /* 602 */, 0x4667446af6201ad5 /* 603 */,
0xe615ebcacfb0f075 /* 604 */, 0xb8f31f4f68290778 /* 605 */,
0x22713ed6ce22d11e /* 606 */, 0x3057c1a72ec3c93b /* 607 */,
0xcb46acc37c3f1f2f /* 608 */, 0xdbb893fd02aaf50e /* 609 */,
0x331fd92e600b9fcf /* 610 */, 0xa498f96148ea3ad6 /* 611 */,
0xa8d8426e8b6a83ea /* 612 */, 0xa089b274b7735cdc /* 613 */,
0x87f6b3731e524a11 /* 614 */, 0x118808e5cbc96749 /* 615 */,
0x9906e4c7b19bd394 /* 616 */, 0xafed7f7e9b24a20c /* 617 */,
0x6509eadeeb3644a7 /* 618 */, 0x6c1ef1d3e8ef0ede /* 619 */,
0xb9c97d43e9798fb4 /* 620 */, 0xa2f2d784740c28a3 /* 621 */,
0x7b8496476197566f /* 622 */, 0x7a5be3e6b65f069d /* 623 */,
0xf96330ed78be6f10 /* 624 */, 0xeee60de77a076a15 /* 625 */,
0x2b4bee4aa08b9bd0 /* 626 */, 0x6a56a63ec7b8894e /* 627 */,
0x02121359ba34fef4 /* 628 */, 0x4cbf99f8283703fc /* 629 */,
0x398071350caf30c8 /* 630 */, 0xd0a77a89f017687a /* 631 */,
0xf1c1a9eb9e423569 /* 632 */, 0x8c7976282dee8199 /* 633 */,
0x5d1737a5dd1f7abd /* 634 */, 0x4f53433c09a9fa80 /* 635 */,
0xfa8b0c53df7ca1d9 /* 636 */, 0x3fd9dcbc886ccb77 /* 637 */,
0xc040917ca91b4720 /* 638 */, 0x7dd00142f9d1dcdf /* 639 */,
0x8476fc1d4f387b58 /* 640 */, 0x23f8e7c5f3316503 /* 641 */,
0x032a2244e7e37339 /* 642 */, 0x5c87a5d750f5a74b /* 643 */,
0x082b4cc43698992e /* 644 */, 0xdf917becb858f63c /* 645 */,
0x3270b8fc5bf86dda /* 646 */, 0x10ae72bb29b5dd76 /* 647 */,
0x576ac94e7700362b /* 648 */, 0x1ad112dac61efb8f /* 649 */,
0x691bc30ec5faa427 /* 650 */, 0xff246311cc327143 /* 651 */,
0x3142368e30e53206 /* 652 */, 0x71380e31e02ca396 /* 653 */,
0x958d5c960aad76f1 /* 654 */, 0xf8d6f430c16da536 /* 655 */,
0xc8ffd13f1be7e1d2 /* 656 */, 0x7578ae66004ddbe1 /* 657 */,
0x05833f01067be646 /* 658 */, 0xbb34b5ad3bfe586d /* 659 */,
0x095f34c9a12b97f0 /* 660 */, 0x247ab64525d60ca8 /* 661 */,
0xdcdbc6f3017477d1 /* 662 */, 0x4a2e14d4decad24d /* 663 */,
0xbdb5e6d9be0a1eeb /* 664 */, 0x2a7e70f7794301ab /* 665 */,
0xdef42d8a270540fd /* 666 */, 0x01078ec0a34c22c1 /* 667 */,
0xe5de511af4c16387 /* 668 */, 0x7ebb3a52bd9a330a /* 669 */,
0x77697857aa7d6435 /* 670 */, 0x004e831603ae4c32 /* 671 */,
0xe7a21020ad78e312 /* 672 */, 0x9d41a70c6ab420f2 /* 673 */,
0x28e06c18ea1141e6 /* 674 */, 0xd2b28cbd984f6b28 /* 675 */,
0x26b75f6c446e9d83 /* 676 */, 0xba47568c4d418d7f /* 677 */,
0xd80badbfe6183d8e /* 678 */, 0x0e206d7f5f166044 /* 679 */,
0xe258a43911cbca3e /* 680 */, 0x723a1746b21dc0bc /* 681 */,
0xc7caa854f5d7cdd3 /* 682 */, 0x7cac32883d261d9c /* 683 */,
0x7690c26423ba942c /* 684 */, 0x17e55524478042b8 /* 685 */,
0xe0be477656a2389f /* 686 */, 0x4d289b5e67ab2da0 /* 687 */,
0x44862b9c8fbbfd31 /* 688 */, 0xb47cc8049d141365 /* 689 */,
0x822c1b362b91c793 /* 690 */, 0x4eb14655fb13dfd8 /* 691 */,
0x1ecbba0714e2a97b /* 692 */, 0x6143459d5cde5f14 /* 693 */,
0x53a8fbf1d5f0ac89 /* 694 */, 0x97ea04d81c5e5b00 /* 695 */,
0x622181a8d4fdb3f3 /* 696 */, 0xe9bcd341572a1208 /* 697 */,
0x1411258643cce58a /* 698 */, 0x9144c5fea4c6e0a4 /* 699 */,
0x0d33d06565cf620f /* 700 */, 0x54a48d489f219ca1 /* 701 */,
0xc43e5eac6d63c821 /* 702 */, 0xa9728b3a72770daf /* 703 */,
0xd7934e7b20df87ef /* 704 */, 0xe35503b61a3e86e5 /* 705 */,
0xcae321fbc819d504 /* 706 */, 0x129a50b3ac60bfa6 /* 707 */,
0xcd5e68ea7e9fb6c3 /* 708 */, 0xb01c90199483b1c7 /* 709 */,
0x3de93cd5c295376c /* 710 */, 0xaed52edf2ab9ad13 /* 711 */,
0x2e60f512c0a07884 /* 712 */, 0xbc3d86a3e36210c9 /* 713 */,
0x35269d9b163951ce /* 714 */, 0x0c7d6e2ad0cdb5fa /* 715 */,
0x59e86297d87f5733 /* 716 */, 0x298ef221898db0e7 /* 717 */,
0x55000029d1a5aa7e /* 718 */, 0x8bc08ae1b5061b45 /* 719 */,
0xc2c31c2b6c92703a /* 720 */, 0x94cc596baf25ef42 /* 721 */,
0x0a1d73db22540456 /* 722 */, 0x04b6a0f9d9c4179a /* 723 */,
0xeffdafa2ae3d3c60 /* 724 */, 0xf7c8075bb49496c4 /* 725 */,
0x9cc5c7141d1cd4e3 /* 726 */, 0x78bd1638218e5534 /* 727 */,
0xb2f11568f850246a /* 728 */, 0xedfabcfa9502bc29 /* 729 */,
0x796ce5f2da23051b /* 730 */, 0xaae128b0dc93537c /* 731 */,
0x3a493da0ee4b29ae /* 732 */, 0xb5df6b2c416895d7 /* 733 */,
0xfcabbd25122d7f37 /* 734 */, 0x70810b58105dc4b1 /* 735 */,
0xe10fdd37f7882a90 /* 736 */, 0x524dcab5518a3f5c /* 737 */,
0x3c9e85878451255b /* 738 */, 0x4029828119bd34e2 /* 739 */,
0x74a05b6f5d3ceccb /* 740 */, 0xb610021542e13eca /* 741 */,
0x0ff979d12f59e2ac /* 742 */, 0x6037da27e4f9cc50 /* 743 */,
0x5e92975a0df1847d /* 744 */, 0xd66de190d3e623fe /* 745 */,
0x5032d6b87b568048 /* 746 */, 0x9a36b7ce8235216e /* 747 */,
0x80272a7a24f64b4a /* 748 */, 0x93efed8b8c6916f7 /* 749 */,
0x37ddbff44cce1555 /* 750 */, 0x4b95db5d4b99bd25 /* 751 */,
0x92d3fda169812fc0 /* 752 */, 0xfb1a4a9a90660bb6 /* 753 */,
0x730c196946a4b9b2 /* 754 */, 0x81e289aa7f49da68 /* 755 */,
0x64669a0f83b1a05f /* 756 */, 0x27b3ff7d9644f48b /* 757 */,
0xcc6b615c8db675b3 /* 758 */, 0x674f20b9bcebbe95 /* 759 */,
0x6f31238275655982 /* 760 */, 0x5ae488713e45cf05 /* 761 */,
0xbf619f9954c21157 /* 762 */, 0xeabac46040a8eae9 /* 763 */,
0x454c6fe9f2c0c1cd /* 764 */, 0x419cf6496412691c /* 765 */,
0xd3dc3bef265b0f70 /* 766 */, 0x6d0e60f5c3578a9e /* 767 */,
0x5b0e608526323c55 /* 768 */, 0x1a46c1a9fa1b59f5 /* 769 */,
0xa9e245a17c4c8ffa /* 770 */, 0x65ca5159db2955d7 /* 771 */,
0x05db0a76ce35afc2 /* 772 */, 0x81eac77ea9113d45 /* 773 */,
0x528ef88ab6ac0a0d /* 774 */, 0xa09ea253597be3ff /* 775 */,
0x430ddfb3ac48cd56 /* 776 */, 0xc4b3a67af45ce46f /* 777 */,
0x4ececfd8fbe2d05e /* 778 */, 0x3ef56f10b39935f0 /* 779 */,
0x0b22d6829cd619c6 /* 780 */, 0x17fd460a74df2069 /* 781 */,
0x6cf8cc8e8510ed40 /* 782 */, 0xd6c824bf3a6ecaa7 /* 783 */,
0x61243d581a817049 /* 784 */, 0x048bacb6bbc163a2 /* 785 */,
0xd9a38ac27d44cc32 /* 786 */, 0x7fddff5baaf410ab /* 787 */,
0xad6d495aa804824b /* 788 */, 0xe1a6a74f2d8c9f94 /* 789 */,
0xd4f7851235dee8e3 /* 790 */, 0xfd4b7f886540d893 /* 791 */,
0x247c20042aa4bfda /* 792 */, 0x096ea1c517d1327c /* 793 */,
0xd56966b4361a6685 /* 794 */, 0x277da5c31221057d /* 795 */,
0x94d59893a43acff7 /* 796 */, 0x64f0c51ccdc02281 /* 797 */,
0x3d33bcc4ff6189db /* 798 */, 0xe005cb184ce66af1 /* 799 */,
0xff5ccd1d1db99bea /* 800 */, 0xb0b854a7fe42980f /* 801 */,
0x7bd46a6a718d4b9f /* 802 */, 0xd10fa8cc22a5fd8c /* 803 */,
0xd31484952be4bd31 /* 804 */, 0xc7fa975fcb243847 /* 805 */,
0x4886ed1e5846c407 /* 806 */, 0x28cddb791eb70b04 /* 807 */,
0xc2b00be2f573417f /* 808 */, 0x5c9590452180f877 /* 809 */,
0x7a6bddfff370eb00 /* 810 */, 0xce509e38d6d9d6a4 /* 811 */,
0xebeb0f00647fa702 /* 812 */, 0x1dcc06cf76606f06 /* 813 */,
0xe4d9f28ba286ff0a /* 814 */, 0xd85a305dc918c262 /* 815 */,
0x475b1d8732225f54 /* 816 */, 0x2d4fb51668ccb5fe /* 817 */,
0xa679b9d9d72bba20 /* 818 */, 0x53841c0d912d43a5 /* 819 */,
0x3b7eaa48bf12a4e8 /* 820 */, 0x781e0e47f22f1ddf /* 821 */,
0xeff20ce60ab50973 /* 822 */, 0x20d261d19dffb742 /* 823 */,
0x16a12b03062a2e39 /* 824 */, 0x1960eb2239650495 /* 825 */,
0x251c16fed50eb8b8 /* 826 */, 0x9ac0c330f826016e /* 827 */,
0xed152665953e7671 /* 828 */, 0x02d63194a6369570 /* 829 */,
0x5074f08394b1c987 /* 830 */, 0x70ba598c90b25ce1 /* 831 */,
0x794a15810b9742f6 /* 832 */, 0x0d5925e9fcaf8c6c /* 833 */,
0x3067716cd868744e /* 834 */, 0x910ab077e8d7731b /* 835 */,
0x6a61bbdb5ac42f61 /* 836 */, 0x93513efbf0851567 /* 837 */,
0xf494724b9e83e9d5 /* 838 */, 0xe887e1985c09648d /* 839 */,
0x34b1d3c675370cfd /* 840 */, 0xdc35e433bc0d255d /* 841 */,
0xd0aab84234131be0 /* 842 */, 0x08042a50b48b7eaf /* 843 */,
0x9997c4ee44a3ab35 /* 844 */, 0x829a7b49201799d0 /* 845 */,
0x263b8307b7c54441 /* 846 */, 0x752f95f4fd6a6ca6 /* 847 */,
0x927217402c08c6e5 /* 848 */, 0x2a8ab754a795d9ee /* 849 */,
0xa442f7552f72943d /* 850 */, 0x2c31334e19781208 /* 851 */,
0x4fa98d7ceaee6291 /* 852 */, 0x55c3862f665db309 /* 853 */,
0xbd0610175d53b1f3 /* 854 */, 0x46fe6cb840413f27 /* 855 */,
0x3fe03792df0cfa59 /* 856 */, 0xcfe700372eb85e8f /* 857 */,
0xa7be29e7adbce118 /* 858 */, 0xe544ee5cde8431dd /* 859 */,
0x8a781b1b41f1873e /* 860 */, 0xa5c94c78a0d2f0e7 /* 861 */,
0x39412e2877b60728 /* 862 */, 0xa1265ef3afc9a62c /* 863 */,
0xbcc2770c6a2506c5 /* 864 */, 0x3ab66dd5dce1ce12 /* 865 */,
0xe65499d04a675b37 /* 866 */, 0x7d8f523481bfd216 /* 867 */,
0x0f6f64fcec15f389 /* 868 */, 0x74efbe618b5b13c8 /* 869 */,
0xacdc82b714273e1d /* 870 */, 0xdd40bfe003199d17 /* 871 */,
0x37e99257e7e061f8 /* 872 */, 0xfa52626904775aaa /* 873 */,
0x8bbbf63a463d56f9 /* 874 */, 0xf0013f1543a26e64 /* 875 */,
0xa8307e9f879ec898 /* 876 */, 0xcc4c27a4150177cc /* 877 */,
0x1b432f2cca1d3348 /* 878 */, 0xde1d1f8f9f6fa013 /* 879 */,
0x606602a047a7ddd6 /* 880 */, 0xd237ab64cc1cb2c7 /* 881 */,
0x9b938e7225fcd1d3 /* 882 */, 0xec4e03708e0ff476 /* 883 */,
0xfeb2fbda3d03c12d /* 884 */, 0xae0bced2ee43889a /* 885 */,
0x22cb8923ebfb4f43 /* 886 */, 0x69360d013cf7396d /* 887 */,
0x855e3602d2d4e022 /* 888 */, 0x073805bad01f784c /* 889 */,
0x33e17a133852f546 /* 890 */, 0xdf4874058ac7b638 /* 891 */,
0xba92b29c678aa14a /* 892 */, 0x0ce89fc76cfaadcd /* 893 */,
0x5f9d4e0908339e34 /* 894 */, 0xf1afe9291f5923b9 /* 895 */,
0x6e3480f60f4a265f /* 896 */, 0xeebf3a2ab29b841c /* 897 */,
0xe21938a88f91b4ad /* 898 */, 0x57dfeff845c6d3c3 /* 899 */,
0x2f006b0bf62caaf2 /* 900 */, 0x62f479ef6f75ee78 /* 901 */,
0x11a55ad41c8916a9 /* 902 */, 0xf229d29084fed453 /* 903 */,
0x42f1c27b16b000e6 /* 904 */, 0x2b1f76749823c074 /* 905 */,
0x4b76eca3c2745360 /* 906 */, 0x8c98f463b91691bd /* 907 */,
0x14bcc93cf1ade66a /* 908 */, 0x8885213e6d458397 /* 909 */,
0x8e177df0274d4711 /* 910 */, 0xb49b73b5503f2951 /* 911 */,
0x10168168c3f96b6b /* 912 */, 0x0e3d963b63cab0ae /* 913 */,
0x8dfc4b5655a1db14 /* 914 */, 0xf789f1356e14de5c /* 915 */,
0x683e68af4e51dac1 /* 916 */, 0xc9a84f9d8d4b0fd9 /* 917 */,
0x3691e03f52a0f9d1 /* 918 */, 0x5ed86e46e1878e80 /* 919 */,
0x3c711a0e99d07150 /* 920 */, 0x5a0865b20c4e9310 /* 921 */,
0x56fbfc1fe4f0682e /* 922 */, 0xea8d5de3105edf9b /* 923 */,
0x71abfdb12379187a /* 924 */, 0x2eb99de1bee77b9c /* 925 */,
0x21ecc0ea33cf4523 /* 926 */, 0x59a4d7521805c7a1 /* 927 */,
0x3896f5eb56ae7c72 /* 928 */, 0xaa638f3db18f75dc /* 929 */,
0x9f39358dabe9808e /* 930 */, 0xb7defa91c00b72ac /* 931 */,
0x6b5541fd62492d92 /* 932 */, 0x6dc6dee8f92e4d5b /* 933 */,
0x353f57abc4beea7e /* 934 */, 0x735769d6da5690ce /* 935 */,
0x0a234aa642391484 /* 936 */, 0xf6f9508028f80d9d /* 937 */,
0xb8e319a27ab3f215 /* 938 */, 0x31ad9c1151341a4d /* 939 */,
0x773c22a57bef5805 /* 940 */, 0x45c7561a07968633 /* 941 */,
0xf913da9e249dbe36 /* 942 */, 0xda652d9b78a64c68 /* 943 */,
0x4c27a97f3bc334ef /* 944 */, 0x76621220e66b17f4 /* 945 */,
0x967743899acd7d0b /* 946 */, 0xf3ee5bcae0ed6782 /* 947 */,
0x409f753600c879fc /* 948 */, 0x06d09a39b5926db6 /* 949 */,
0x6f83aeb0317ac588 /* 950 */, 0x01e6ca4a86381f21 /* 951 */,
0x66ff3462d19f3025 /* 952 */, 0x72207c24ddfd3bfb /* 953 */,
0x4af6b6d3e2ece2eb /* 954 */, 0x9c994dbec7ea08de /* 955 */,
0x49ace597b09a8bc4 /* 956 */, 0xb38c4766cf0797ba /* 957 */,
0x131b9373c57c2a75 /* 958 */, 0xb1822cce61931e58 /* 959 */,
0x9d7555b909ba1c0c /* 960 */, 0x127fafdd937d11d2 /* 961 */,
0x29da3badc66d92e4 /* 962 */, 0xa2c1d57154c2ecbc /* 963 */,
0x58c5134d82f6fe24 /* 964 */, 0x1c3ae3515b62274f /* 965 */,
0xe907c82e01cb8126 /* 966 */, 0xf8ed091913e37fcb /* 967 */,
0x3249d8f9c80046c9 /* 968 */, 0x80cf9bede388fb63 /* 969 */,
0x1881539a116cf19e /* 970 */, 0x5103f3f76bd52457 /* 971 */,
0x15b7e6f5ae47f7a8 /* 972 */, 0xdbd7c6ded47e9ccf /* 973 */,
0x44e55c410228bb1a /* 974 */, 0xb647d4255edb4e99 /* 975 */,
0x5d11882bb8aafc30 /* 976 */, 0xf5098bbb29d3212a /* 977 */,
0x8fb5ea14e90296b3 /* 978 */, 0x677b942157dd025a /* 979 */,
0xfb58e7c0a390acb5 /* 980 */, 0x89d3674c83bd4a01 /* 981 */,
0x9e2da4df4bf3b93b /* 982 */, 0xfcc41e328cab4829 /* 983 */,
0x03f38c96ba582c52 /* 984 */, 0xcad1bdbd7fd85db2 /* 985 */,
0xbbb442c16082ae83 /* 986 */, 0xb95fe86ba5da9ab0 /* 987 */,
0xb22e04673771a93f /* 988 */, 0x845358c9493152d8 /* 989 */,
0xbe2a488697b4541e /* 990 */, 0x95a2dc2dd38e6966 /* 991 */,
0xc02c11ac923c852b /* 992 */, 0x2388b1990df2a87b /* 993 */,
0x7c8008fa1b4f37be /* 994 */, 0x1f70d0c84d54e503 /* 995 */,
0x5490adec7ece57d4 /* 996 */, 0x002b3c27d9063a3a /* 997 */,
0x7eaea3848030a2bf /* 998 */, 0xc602326ded2003c0 /* 999 */,
0x83a7287d69a94086 /* 1000 */, 0xc57a5fcb30f57a8a /* 1001 */,
0xb56844e479ebe779 /* 1002 */, 0xa373b40f05dcbce9 /* 1003 */,
0xd71a786e88570ee2 /* 1004 */, 0x879cbacdbde8f6a0 /* 1005 */,
0x976ad1bcc164a32f /* 1006 */, 0xab21e25e9666d78b /* 1007 */,
0x901063aae5e5c33c /* 1008 */, 0x9818b34448698d90 /* 1009 */,
0xe36487ae3e1e8abb /* 1010 */, 0xafbdf931893bdcb4 /* 1011 */,
0x6345a0dc5fbbd519 /* 1012 */, 0x8628fe269b9465ca /* 1013 */,
0x1e5d01603f9c51ec /* 1014 */, 0x4de44006a15049b7 /* 1015 */,
0xbf6c70e5f776cbb1 /* 1016 */, 0x411218f2ef552bed /* 1017 */,
0xcb0c0708705a36a3 /* 1018 */, 0xe74d14754f986044 /* 1019 */,
0xcd56d9430ea8280e /* 1020 */, 0xc12591d7535f5065 /* 1021 */,
0xc83223f1720aef96 /* 1022 */, 0xc3a0396f7363a51f /* 1023 */
];
/*******************************************************************************
*******************************************************************************/
debug(UnitTest)
{
unittest
{
enum immutable(char)[][] strings = [
"",
"abc",
"Tiger",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
"Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham",
"Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.",
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
x"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000",
];
enum immutable(char)[][] results = [
"3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3",
"2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93",
"dd00230799f5009fec6debc838bb6a27df2b9d6f110c7937",
"f71c8583902afb879edfe610f82c0d4786a3a534504486b5",
"48ceeb6308b87d46e95d656112cdf18d97915f9765658957",
"8a866829040a410c729ad23f5ada711603b3cdd357e4c15e",
"ce55a6afd591f5ebac547ff84f89227f9331dab0b611c889",
"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e",
"5ab6ff5b263acfab2013c3068c03a82979ea6db287a3ecdd",
];
Tiger h = new Tiger();
foreach(int i, immutable(char)[] s; strings) {
h.update(cast(ubyte[]) s);
char[] d = h.hexDigest();
assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")");
}
}
}
|