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